"""
Task Inbox CQRS Views.

Read-only ViewSets for the task inbox and archive.
Users see only their own assigned tasks.
"""
from django.db.models import Count, Q
from django.utils import timezone
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.filters import SearchFilter, OrderingFilter

from .models import TaskInboxView, TaskArchive
from .serializers import (
    TaskInboxSerializer,
    TaskInboxStatsSerializer,
    TaskArchiveSerializer,
    TaskArchiveStatsSerializer,
)


class TaskInboxViewSet(viewsets.ReadOnlyModelViewSet):
    """
    کارتابل کاربر — لیست تسک‌های assign شده.

    GET /inbox/ — لیست تسک‌ها
    GET /inbox/{id}/ — جزئیات تسک
    GET /inbox/stats/ — آمار خلاصه
    """
    serializer_class = TaskInboxSerializer
    permission_classes = [IsAuthenticated]
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ["title", "description", "table_name", "module_name"]
    ordering_fields = [
        "priority", "due_date", "created_at", "updated_at", "status",
    ]
    ordering = ["-priority", "-updated_at"]

    def get_queryset(self):
        """Filter to current user's assigned tasks + tenant."""
        qs = TaskInboxView.objects.filter(
            tenant=self.request.tenant,
            assigned_to_id=self.request.user.id,
        )

        # Optional filters
        status_filter = self.request.query_params.get("status")
        if status_filter:
            qs = qs.filter(status=status_filter)

        priority_min = self.request.query_params.get("priority_min")
        if priority_min:
            qs = qs.filter(priority__gte=int(priority_min))

        module_name = self.request.query_params.get("module_name")
        if module_name:
            qs = qs.filter(module_name=module_name)

        overdue_only = self.request.query_params.get("overdue")
        if overdue_only and overdue_only.lower() == "true":
            qs = qs.filter(due_date__lt=timezone.now())

        return qs

    @action(detail=False, methods=["get"])
    def stats(self, request):
        """آمار خلاصه کارتابل."""
        qs = self.get_queryset()
        now = timezone.now()

        # Count by status
        status_counts = {}
        for item in qs.values("status").annotate(count=Count("id")):
            status_counts[item["status"]] = item["count"]

        # Count by priority ranges
        priority_counts = {
            "low": qs.filter(priority__lt=30).count(),
            "normal": qs.filter(priority__gte=30, priority__lt=60).count(),
            "high": qs.filter(priority__gte=60, priority__lt=90).count(),
            "urgent": qs.filter(priority__gte=90).count(),
        }

        # Overdue count
        overdue = qs.filter(due_date__lt=now).count()

        data = {
            "total": qs.count(),
            "by_status": status_counts,
            "by_priority": priority_counts,
            "overdue": overdue,
        }

        serializer = TaskInboxStatsSerializer(data)
        return Response(serializer.data)


class TaskArchiveViewSet(viewsets.ReadOnlyModelViewSet):
    """
    بایگانی تسک‌ها — تسک‌های تکمیل/منقضی شده.

    GET /archive/ — لیست بایگانی
    GET /archive/{id}/ — جزئیات
    GET /archive/stats/ — آمار
    """
    serializer_class = TaskArchiveSerializer
    permission_classes = [IsAuthenticated]
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ["table_name"]
    ordering_fields = ["archived_at", "original_created_at", "status"]
    ordering = ["-archived_at"]

    def get_queryset(self):
        """Filter to current user's archived tasks + tenant."""
        qs = TaskArchive.objects.filter(
            tenant=self.request.tenant,
            owner_id=self.request.user.id,
        )

        status_filter = self.request.query_params.get("status")
        if status_filter:
            qs = qs.filter(status=status_filter)

        reason_filter = self.request.query_params.get("archived_reason")
        if reason_filter:
            qs = qs.filter(archived_reason=reason_filter)

        return qs

    @action(detail=False, methods=["get"])
    def stats(self, request):
        """آمار بایگانی."""
        qs = self.get_queryset()

        reason_counts = {}
        for item in qs.values("archived_reason").annotate(count=Count("id")):
            reason_counts[item["archived_reason"]] = item["count"]

        status_counts = {}
        for item in qs.values("status").annotate(count=Count("id")):
            status_counts[item["status"]] = item["count"]

        data = {
            "total": qs.count(),
            "by_reason": reason_counts,
            "by_status": status_counts,
        }

        serializer = TaskArchiveStatsSerializer(data)
        return Response(serializer.data)
