from django.http import HttpResponse, HttpResponseRedirect
from django.contrib import messages
from django.shortcuts import render, redirect
from django.urls import reverse

from webapp.common import dump, log_activity
from webapp.views.base import CommonView, CommonForm, CommonModelForm
from webapp.models import (koleksi as m_koleksi, master as m_master)


# ======================================================================
# BASE FORM VIEW
# ======================================================================
class FormView(CommonView):
    def get(self, request, disp_pk=None, form=None):

        surat = None  # <-- variabel untuk informasi surat

        if form is None:
            if disp_pk is None:        # === CREATE MODE ===
                form = ViewForm()

            else:                      # === UPDATE MODE ===
                dispo_obj = m_koleksi.Disposisi.objects.get(pk=disp_pk)
                dispo_read = m_koleksi.Disposisi._read_one(pk=disp_pk)

                if dispo_read['user_input'] != request.session.get('pk') and \
                   request.session.get('role') not in ['ADMIN', 'KOORDINATOR']:
                    return render(request, 'forbidden.html', {
                        'urlnya': reverse('disp_list')
                    })

                form = ViewForm(instance=dispo_obj)

                # ambil data surat untuk ditampilkan di template
                surat = dispo_obj.pk_surat

        return render(request, 'disp/form.html', {
            'form': form,
            'disp_pk': disp_pk,
            'surat': surat,     # <-- dikirim ke template
        })


# ======================================================================
# CREATE VIEW
# ======================================================================
class FormCreateView(FormView):
    def get(self, request, form=None):
        return super().get(request)

    def post(self, request):
        post = {k: v for k, v in request.POST.items()}
        post['user_input'] = request.session.get('pk')

        form = ViewForm(post)

        if form.is_valid():
            data = form.save()

            log_activity(
                request,
                'upload',
                'disposisi',
                data.pk,
                f'Tambah disposisi kepada {data.kepada}'
            )

            messages.info(request, 'berhasil menyimpan data.')
            return redirect('disp_list')

        else:
            return self.get(request, form=form)


# ======================================================================
# UPDATE VIEW
# ======================================================================
class FormUpdateView(FormView):
    def get(self, request, disp_pk, form=None):
        return super().get(request, disp_pk=disp_pk, form=form)

    def post(self, request, disp_pk):
        post = {k: v for k, v in request.POST.items()}
        form = ViewForm(post, instance=m_koleksi.Disposisi.objects.get(pk=disp_pk))

        if form.is_valid():
            form.save()

            log_activity(
                request,
                'edit',
                'disposisi',
                disp_pk,
                f"Edit disposisi kepada {form.cleaned_data.get('kepada', '-')}"
            )

            messages.info(request, 'berhasil mengubah data.')
            return redirect('disp_list')

        else:
            return self.get(request, disp_pk, form)


# ======================================================================
# FORM
# ======================================================================
class ViewForm(CommonModelForm):

    sifat = CommonForm.base().ModelChoiceField(
        empty_label=None,
        to_field_name='v',
        queryset=m_master.Settings.objects.filter(
            _type='SIFAT_SURAT', k='PERMEN_54_2009'
        ).values_list('v', flat=1)
    )

    class Meta:
        model = m_koleksi.Disposisi

        fields = [
            'pk_surat',
            'tanggal',
            'sifat',
            'kepada',
            'catatan',
            'status',
            'user_input',
        ]

        widgets = {
            'tanggal': CommonForm.base().DateInput(format='%Y-%m-%d'),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # ==============================================================
        # 1️⃣ DROPDOWN PK_SURAT → AMBIL DARI TABEL SURAT MASUK
        # ==============================================================
        self.fields['pk_surat'].queryset = m_koleksi.Surat.objects.all()
        
        # Default option
        self.fields['pk_surat'].empty_label = "== Pilih Surat: =="

        # tampilkan daftar:
        # NOMOR SURAT - INSTANSI
        self.fields['pk_surat'].label_from_instance = (
            lambda obj: f"{obj.nomor} - {obj.pengirim_instansi}"
        )

        # disable hanya saat edit
        if self.instance and self.instance.pk:
            self.fields['pk_surat'].disabled = True
        else:
            self.fields['pk_surat'].disabled = False

        # ==============================================================
        # LABEL
        # ==============================================================
        self.fields['pk_surat'].label = 'Nomor Surat'
        self.fields['sifat'].label = 'Sifat Disposisi'
        self.fields['kepada'].label = 'Diteruskan Kepada'
        self.fields['catatan'].label = 'Catatan Disposisi'
        self.fields['tanggal'].label = 'Tanggal Disposisi'
        self.fields['status'].label = 'Status Disposisi'

        # ==============================================================
        # user_input → hidden
        # ==============================================================
        self.fields['user_input'].initial = 0
        self.fields['user_input'].widget = CommonModelForm.base().HiddenInput()

        # ==============================================================
        # required
        # ==============================================================
        self.fields['kepada'].required = True
        self.fields['catatan'].required = True
