# webapp/api/settings/views.py
import os
from django.conf import settings as dj_settings
from rest_framework import viewsets, filters, status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from webapp.models import master as m_master
from .serializers import AuditLogSerializer, SettingUpdateSerializer
from .pagination import CustomPageNumberPagination

from drf_spectacular.utils import extend_schema, OpenApiTypes

PATH_DIR = os.path.join(dj_settings.BASE_DIR, "assets", "upload")


class PublicSettingViewSet(viewsets.ViewSet):
    permission_classes = [IsAuthenticated]

    allowed_keys = [
        "APPNAME",
        "APPNAME_SHORT",
        "PEMDA_ADDR",
        "PEMDA_COPYRIGHT_BY",
        "PEMDA_COPYRIGHT_YEAR",
        "PEMDA_MAIL",
        "PEMDA_NAME",
    ]

    def list(self, request):
        queryset = m_master.Settings.objects.filter(k__in=self.allowed_keys).values("k", "v")
        result = {item["k"]: item["v"] for item in queryset}
        result["logo"] = "logo.png"
        result["site_bg"] = "site-bg.png"
        return Response(result, status=status.HTTP_200_OK)

    # ========================
    # PUT /settings/update
    # ========================
    @extend_schema(
        summary="Update settings + upload logo / background",
        description="Update konfigurasi aplikasi, termasuk upload file seperti logo dan background.",
        request={
            "multipart/form-data": {
                "type": "object",
                "properties": {
                    "APPNAME": {"type": "string"},
                    "APPNAME_SHORT": {"type": "string"},
                    "PEMDA_ADDR": {"type": "string"},
                    "PEMDA_COPYRIGHT_BY": {"type": "string"},
                    "PEMDA_COPYRIGHT_YEAR": {"type": "string"},
                    "PEMDA_MAIL": {"type": "string"},
                    "PEMDA_NAME": {"type": "string"},
                    "logo": {"type": "string", "format": "binary"},
                    "site_bg": {"type": "string", "format": "binary"},
                },
            }
        },
        responses={200: OpenApiTypes.OBJECT},
    )
    def update(self, request, pk=None):

        serializer = SettingUpdateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        data = serializer.validated_data

        updated = {}

        # Update TEXT
        for key in self.allowed_keys:
            if key in data:
                try:
                    s = m_master.Settings.objects.get(k=key, _type=None)
                    s.v = str(data[key]).strip()
                    s.save(update_fields=["v"])
                    updated[key] = s.v
                except m_master.Settings.DoesNotExist:
                    continue

        # Upload FILES
        files = request.FILES
        file_map = {
            "logo": "logo.png",
            "site_bg": "site-bg.png",
        }

        os.makedirs(PATH_DIR, exist_ok=True)

        for input_name, file_name in file_map.items():
            if input_name in files:
                file_obj = files[input_name]
                save_path = os.path.join(PATH_DIR, file_name)

                with open(save_path, "wb+") as buffer:
                    for chunk in file_obj.chunks():
                        buffer.write(chunk)

                updated[input_name] = "uploaded"

        return Response(updated, status=status.HTTP_200_OK)


class AuditLogViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = AuditLogSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = CustomPageNumberPagination
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ["action", "description", "content_type"]
    ordering_fields = ["timestamp", "action"]
    ordering = ["-timestamp"]

    def get_queryset(self):
        qs = m_master.AuditLog.objects.select_related("user").all()
        category = self.request.query_params.get("category", "").lower()
        if category == "surat masuk":
            qs = qs.filter(description__icontains="masuk", content_type="surat")
        elif category == "surat keluar":
            qs = qs.filter(description__icontains="keluar", content_type="surat")
        elif category == "dokumen":
            qs = qs.filter(content_type="contents")
        elif category == "disposisi":
            qs = qs.filter(content_type="disposisi")

        action = self.request.query_params.get("action")
        if action:
            qs = qs.filter(action__iexact=action)

        return qs
