from django.utils.dateparse import parse_date
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status

from account.permissions import (
    HasTabPermission,
    get_user_data_filter,
    user_can_see_all_shop_data,
)
from shop_management.models.data.daily_diary import DailyDiaryEntry
from shop_management.serializers.data.daily_diary import DailyDiaryEntrySerializer
from shop_management.views.data.base import DataRootViewSet
from shop_management.views.data.pagination import CustomPagination


class DailyDiaryEntryViewSet(DataRootViewSet):
    serializer_class = DailyDiaryEntrySerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "reports"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["shop", "entry_date"]
    search_fields = ["title", "content"]
    pagination_class = CustomPagination

    def get_queryset(self):
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            queryset = DailyDiaryEntry.objects.filter(is_deleted=False)
        else:
            queryset = DailyDiaryEntry.objects.filter(
                get_user_data_filter(self.request.user, "shop"),
                is_deleted=False,
            ).distinct()

        selected_shop_id = self.request.headers.get("X-Selected-Shop") or self.request.META.get(
            "HTTP_X_SELECTED_SHOP"
        )
        if selected_shop_id and not user_can_see_all_shop_data(
            self.request.user, self.required_tab
        ):
            queryset = queryset.filter(shop_id=selected_shop_id)

        start_date = self.request.query_params.get("start_date")
        end_date = self.request.query_params.get("end_date")
        if start_date and (parsed := parse_date(start_date)):
            queryset = queryset.filter(entry_date__gte=parsed)
        if end_date and (parsed := parse_date(end_date)):
            queryset = queryset.filter(entry_date__lte=parsed)

        return queryset.select_related("shop", "created_by").order_by("-entry_date", "-id")

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        shop = serializer.validated_data.get("shop")
        entry_date = serializer.validated_data.get("entry_date")

        existing = DailyDiaryEntry.objects.filter(
            shop=shop,
            entry_date=entry_date,
            is_deleted=False,
        ).first()
        if existing:
            update_serializer = self.get_serializer(
                existing, data=request.data, partial=True
            )
            update_serializer.is_valid(raise_exception=True)
            update_serializer.save()
            return Response(update_serializer.data, status=status.HTTP_200_OK)

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
