import re
from django.shortcuts import render, redirect, get_object_or_404
from django.http import JsonResponse
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.contrib.auth import login as auth_login
from django.db.models import Count
from django.views.decorators.http import require_POST
from django.utils.translation import gettext_lazy as _

from .models import SystemFeedback
from bengkel.models import UserProfile, PenganjurRequest

# ═══════════════════════════════════════════════════════════════════════════════
# MUKA HADAPAN (LANDING PAGE) & BORANG MAKLUM BALAS
# ═══════════════════════════════════════════════════════════════════════════════

def home(request):
    """Muka Hadapan (Landing Page) Utama Sistem"""
    if request.user.is_authenticated and request.user.is_staff and not request.user.is_superuser:
        return redirect("bengkel:penganjur_home")

    why_items = [
        _("Mengumpul masalah nyata dari pelbagai lapisan masyarakat"),
        _("Menyokong proses pembuat keputusan berasaskan bukti"),
        _("Mengenal pasti jurang dalam ekosistem kesihatan digital"),
        _("Memastikan suara pesakit dan pengamal didengar"),
        _("Membina Blueprint Digital Kesihatan yang inklusif"),
    ]

    milestones = [
        {"year": "2024–2025", "title": _("Fasa Pengumpulan Data"), "desc": _("Mengumpul pernyataan masalah dari seluruh ekosistem kesihatan"), "active": True},
        {"year": "2026–2028", "title": _("Analisis & Pelan Tindakan"), "desc": _("Memetakan keutamaan dan membangun pelan pelaksanaan"), "active": False},
        {"year": "2029–2035", "title": _("Transformasi Digital Awal"), "desc": _("Pelaksanaan pendigitalan sistem penjagaan primer dan hospital"), "active": False},
        {"year": "2036–2045", "title": _("Integrasi Ekosistem"), "desc": _("Interoperabiliti penuh antara semua sistem kesihatan nasional"), "active": False},
        {"year": "2046–2055", "title": _("Masa Hadapan Kesihatan"), "desc": _("AI, genomik, dan penjagaan kesihatan prediktif berskala nasional"), "active": False},
    ]

    faqs = [
        {"q": _("Siapa yang boleh menghantar pernyataan masalah?"), "a": _("Sesiapa sahaja boleh menyumbang — pesakit, warganegara, doktor, jururawat, pentadbir hospital, penggubal dasar, mahupun penyelidik. Tiada log masuk diperlukan untuk menghantar.")},
        {"q": _("Adakah maklumat saya akan dirahsiakan?"), "a": _("Ya. Semua data yang dikemukakan adalah tertakluk kepada Akta Perlindungan Data Peribadi 2010 (PDPA) dan hanya digunakan untuk tujuan perancangan dasar kesihatan digital kebangsaan.")},
        {"q": _("Bagaimana pernyataan saya akan digunakan?"), "a": _("Pernyataan masalah yang dikemukakan akan dianalisis oleh pasukan Bahagian Pembangunan Kesihatan Digital KKM untuk mengenal pasti jurang, pola, dan keutamaan dalam pembangunan Blueprint Digital Kesihatan Kebangsaan.")},
        {"q": _("Apakah format pernyataan masalah yang baik?"), "a": _("Huraikan masalah secara spesifik — termasuk konteks, impak kepada pesakit atau sistem, skop populasi yang terjejas, dan cadangan penyelesaian jika ada. Semakin terperinci, semakin berguna untuk analisis dasar.")},
        {"q": _("Berapa lama proses semakan mengambil masa?"), "a": _("Pernyataan masalah akan disemak oleh pasukan teknikal KKM dalam masa 30 hari bekerja. Analisis menyeluruh bagi setiap kitaran pengumpulan data akan diterbitkan sebagai laporan dwi-tahunan.")},
    ]

    return render(request, "problems/home.html", {
        "why_items": why_items,
        "milestones": milestones,
        "faqs": faqs,
        "active": "home",
    })

def submit_view(request):
    """Borang Menghantar Maklum Balas / Aduan Sistem (Helpdesk)"""
    if request.method == "POST":
        kategori = request.POST.get("kategori", "pertanyaan")
        tajuk = request.POST.get("tajuk", "").strip()
        mesej = request.POST.get("mesej", "").strip()
        
        if not tajuk or not mesej:
            messages.error(request, "Sila lengkapkan ruangan Tajuk dan Mesej penerangan.")
            return redirect("submit")
            
        submitted_by = request.user if request.user.is_authenticated else None
        
        # Simpan Aduan ke Pangkalan Data
        SystemFeedback.objects.create(
            kategori=kategori,
            tajuk=tajuk,
            mesej=mesej,
            submitted_by=submitted_by
        )
        
        messages.success(request, "Maklum balas anda berjaya dihantar ke Pusat Bantuan. Terima kasih!")
        return redirect("home")

    return render(request, "problems/submit.html", {
        "kategori_choices": SystemFeedback.KATEGORI_CHOICES,
        "active": "submit",
    })


# ═══════════════════════════════════════════════════════════════════════════════
# LOG MASUK & PENDAFTARAN (Dikekalkan)
# ═══════════════════════════════════════════════════════════════════════════════

from django.contrib.auth import authenticate

def custom_login_view(request):
    if request.user.is_authenticated:
        if request.user.is_superuser:
            return redirect("superadmin:dashboard")
        return redirect("bengkel:penganjur_home" if request.user.is_staff else "bengkel:dashboard")

    error = None
    if request.method == "POST":
        identifier = request.POST.get("username", "").strip()
        password   = request.POST.get("password", "")

        if "@" in identifier:
            try:
                identifier = User.objects.get(email__iexact=identifier).username
            except User.DoesNotExist:
                pass

        user = authenticate(request, username=identifier, password=password)
        if user is not None:
            auth_login(request, user)
            next_url = request.GET.get("next") or request.POST.get("next", "")
            if next_url:
                return redirect(next_url)
            if user.is_superuser:
                return redirect("superadmin:dashboard")
            return redirect("bengkel:penganjur_home" if user.is_staff else "bengkel:dashboard")
        else:
            error = "Nama pengguna / e-mel atau kata laluan tidak sah."

    return render(request, "registration/login.html", {"error": error})


def register_view(request):
    if request.user.is_authenticated:
        return redirect("home")

    if request.method == "POST":
        role       = request.POST.get("role", "peserta")
        username   = request.POST.get("username", "").strip()
        email      = request.POST.get("email", "").strip()
        
        # Pendaftaran baru menggunakan satu field "Nama Penuh" dari HTML id="fNama" (name="nama")
        nama_penuh = request.POST.get("nama", "").strip()
        
        organisasi = request.POST.get("organisasi", "").strip()
        jabatan    = request.POST.get("jabatan", "").strip()
        telefon    = request.POST.get("telefon", "").strip()
        sebab      = request.POST.get("sebab", "").strip()
        pw1        = request.POST.get("password1", "")
        pw2        = request.POST.get("password2", "")
        terms      = request.POST.get("terms")

        # Pecahkan nama penuh kepada first_name dan last_name untuk keserasian Django User
        nama_parts = nama_penuh.split(" ", 1)
        first_name = nama_parts[0] if len(nama_parts) > 0 else ""
        last_name  = nama_parts[1] if len(nama_parts) > 1 else ""

        form_data = {
            "username": username, "email": email, "nama": nama_penuh,
            "organisasi": organisasi, "jabatan": jabatan, "telefon": telefon, "sebab": sebab, "role": role,
        }

        def _err(msg):
            return render(request, "registration/register.html", {"error": msg, "form_data": form_data})

        import re as _re

        # ---------------------------------------------------
        # VALIDASI UMUM (Terpakai untuk Peserta & Penganjur)
        # ---------------------------------------------------
        if not username or len(username) < 3: return _err("Nama pengguna mesti sekurang-kurangnya 3 aksara.")
        if not _re.match(r'^[\w]+$', username): return _err("Nama pengguna hanya boleh mengandungi huruf, nombor, garis bawah.")
        if User.objects.filter(username=username).exists(): return _err("Nama pengguna ini sudah digunakan.")
        
        if not email or not _re.match(r'^[^\s@]+@[^\s@]+\.[^\s@]+$', email): return _err("Sila masukkan e-mel yang sah.")
        if User.objects.filter(email=email).exists(): return _err("E-mel ini sudah berdaftar.")
        
        if len(pw1) < 8: return _err("Kata laluan mesti sekurang-kurangnya 8 aksara.")
        if pw1 != pw2: return _err("Kata laluan tidak sepadan.")
        
        if not terms: return _err("Sila bersetuju dengan Dasar Privasi.")

        # ===================================================
        # FLOW PENGANJUR (DIBETULKAN)
        # ===================================================
        if role == "penganjur":
            if not organisasi: return _err("Nama organisasi wajib diisi.")

            # SIMPAN PENGANJUR BERSAMA USERNAME DAN PASSWORD ASLI
            user = User.objects.create_user(
                username=username, email=email, password=pw1,
                first_name=first_name, last_name=last_name, is_active=False,
            )

            profile, _ = UserProfile.objects.get_or_create(user=user)
            profile.organisasi = organisasi
            profile.jabatan    = jabatan
            profile.telefon    = telefon
            profile.save()
            
            PenganjurRequest.objects.create(user=user, sebab=sebab)
            return redirect("permohonan_pending")

        # ===================================================
        # FLOW PESERTA (DIPERBAIKI DENGAN PENGESAHAN E-MEL)
        # ===================================================
        user = User.objects.create_user(
            username=username, email=email, password=pw1,
            first_name=first_name, last_name=last_name,
            is_active=False  # <--- AKAUN DITUTUP SEMENTARA MENUNGGU KLIK E-MEL!
        )
        
        profile, _ = UserProfile.objects.get_or_create(user=user)
        profile.organisasi = organisasi
        profile.jabatan = jabatan  
        profile.unit = request.POST.get("unit", "").strip() 
        profile.telefon = telefon
        profile.alamat = request.POST.get("alamat", "").strip() 
        profile.save()

        # JANA TOKEN DAN E-MEL
        from django.contrib.auth.tokens import default_token_generator
        from django.utils.http import urlsafe_base64_encode
        from django.utils.encoding import force_bytes
        from django.core.mail import EmailMultiAlternatives
        from django.conf import settings as _settings

        uid = urlsafe_base64_encode(force_bytes(user.pk))
        token = default_token_generator.make_token(user)
        
        # Jana Pautan (URL) penuh
        current_site = request.get_host()
        verify_url = f"http://{current_site}/verify-email/{uid}/{token}/"

        subject = "Pengesahan Akaun Peserta (SME) — IPES KKM"
        text_body = f"Sila sahkan e-mel anda dengan menekan pautan ini: {verify_url}"
        html_body = f"""
        <div style="font-family:Inter,Arial,sans-serif;max-width:560px;margin:auto;background:#f8fafc;padding:36px;border-radius:16px;">
            <h2 style="color:#1e3a8a;">Sahkan Akaun Anda</h2>
            <p>Terima kasih kerana mendaftar sebagai Peserta (SME) di IPES KKM.</p>
            <p>Sila klik butang di bawah untuk mengesahkan e-mel anda dan mengaktifkan akaun anda.</p>
            <br>
            <a href="{verify_url}" style="background:#3b82f6;color:white;padding:12px 24px;text-decoration:none;border-radius:8px;font-weight:bold;">Sahkan E-mel Saya</a>
        </div>
        """
        
        from django.core.mail import EmailMultiAlternatives
        from django.conf import settings as _settings

        # Jana Pautan (URL) penuh dinamik (Hibrid)
        from django.conf import settings
        protokol = 'http' if settings.DEBUG else 'https'
        current_site = request.get_host()
        verify_url = f"{protokol}://{current_site}/verify-email/{uid}/{token}/"

        subject = "Pengesahan Akaun Peserta (SME) — IPES KKM"
        text_body = f"Sila sahkan e-mel anda dengan menekan pautan ini: {verify_url}"
        html_body = f"""
        <div style="font-family:Inter,Arial,sans-serif;max-width:560px;margin:auto;background:#f8fafc;padding:36px;border-radius:16px;">
            <h2 style="color:#1e3a8a;">Sahkan Akaun Anda</h2>
            <p>Terima kasih kerana mendaftar sebagai Peserta (SME) di IPES KKM.</p>
            <p>Sila klik butang di bawah untuk mengesahkan e-mel anda dan mengaktifkan akaun anda.</p>
            <br>
            <a href="{verify_url}" style="background:#3b82f6;color:white;padding:12px 24px;text-decoration:none;border-radius:8px;font-weight:bold;">Sahkan E-mel Saya</a>
        </div>
        """
        
        try:
            msg = EmailMultiAlternatives(
                subject=subject, 
                body=text_body,
                from_email=getattr(_settings, "DEFAULT_FROM_EMAIL", "Sistem IPES KKM <systempilottest@gmail.com>"),
                to=[user.email], # Menggunakan e-mel sebenar dari pendaftaran
            )
            msg.attach_alternative(html_body, "text/html")
            msg.send() # Anymail akan ambil alih di sini
            
            print(f"✅ E-mel pengesahan berjaya dihantar melalui Brevo API ke: {user.email}")
            
        except Exception as e:
            print(f"❌ RALAT BREVO API: {e}")

        return render(request, "registration/verification_sent.html", {"email": user.email})

    # TAMBAHAN PENTING: Untuk paparan awal borang (GET Request)
    return render(request, "registration/register.html", {"form_data": {}})


def verify_email(request, uidb64, token):
    """Fungsi yang akan berjalan apabila pengguna klik pautan dari e-mel."""
    from django.contrib.auth.tokens import default_token_generator
    from django.utils.http import urlsafe_base64_decode
    from django.contrib.auth import login as auth_login
    
    try:
        uid = urlsafe_base64_decode(uidb64).decode()
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and default_token_generator.check_token(user, token):
        # 1. Aktifkan akaun
        user.is_active = True
        user.save()
        
        # 2. Log Masuk Automatik (Guna backend custom anda)
        auth_login(request, user, backend='problems.backends.EmailOrUsernameBackend')
        
        # 3. Bawa terus ke dalam sistem
        messages.success(request, f"E-mel anda berjaya disahkan! Selamat datang, {user.username}.")
        return redirect('bengkel:dashboard')
    else:
        messages.error(request, "Pautan pengesahan ini telah tamat tempoh atau tidak sah. Sila daftar semula atau hubungi admin.")
        return redirect('login')

def permohonan_pending_view(request):
    return render(request, "registration/permohonan_pending.html", {})

def check_email(request):
    email = request.GET.get("email", "").strip()
    exists = User.objects.filter(email=email).exists() if email else False
    return JsonResponse({"exists": exists})


# ═══════════════════════════════════════════════════════════════════════════════
# PENGURUSAN PENGGUNA (SUPERADMIN)
# ═══════════════════════════════════════════════════════════════════════════════

@login_required
def users_view(request):
    """Superadmin — Senarai Pengguna"""
    if not request.user.is_superuser:
        messages.error(request, "Akses ditolak. Hanya superadmin dibenarkan.")
        return redirect("home")

    users = User.objects.annotate(submission_count=Count("feedbacks")).order_by("date_joined")

    return render(request, "problems/users.html", {
        "users": users,
        "total_users": users.count(),
        "active_users": users.filter(is_active=True).count(),
        "admin_users": users.filter(is_staff=True).count(),
        "total_submissions": SystemFeedback.objects.count(),
        "active": "users",
    })

@login_required
@require_POST
def toggle_user_active(request, pk):
    if not request.user.is_superuser:
        return redirect("home")
    if pk == request.user.pk:
        messages.error(request, "Anda tidak boleh nyahaktifkan akaun anda sendiri.")
        return redirect("users")
    user = get_object_or_404(User, pk=pk)
    if user.is_superuser:
        messages.error(request, "Akaun superadmin tidak boleh diubah.")
        return redirect("users")
    user.is_active = not user.is_active
    user.save()
    status_label = "diaktifkan" if user.is_active else "dinyahaktifkan"
    messages.success(request, f"Akaun {user.username} telah {status_label}.")
    return redirect("users")