"""
Tenant API Views — Super-admin endpoints for tenant management.
"""
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response

from .models import Tenant
from .serializers import (
    TenantListSerializer,
    TenantDetailSerializer,
    TenantCreateSerializer,
    TenantUpdateSerializer,
    TenantActionSerializer,
    TenantChangePlanSerializer,
    TenantSettingsSerializer,
    TenantQuotaUsageSerializer,
)
from .services import (
    TenantLifecycleService,
    TenantQuotaService,
    TenantSecurityService,
    TenantMonitoringService,
)


class TenantViewSet(viewsets.ModelViewSet):
    """CRUD + lifecycle management for tenants (super-admin only)."""

    permission_classes = [IsAdminUser]
    lookup_field = "pk"

    def get_queryset(self):
        qs = Tenant.objects.all().order_by("-created_at")
        # Optional query params
        status_filter = self.request.query_params.get("status")
        if status_filter:
            qs = qs.filter(status=status_filter)
        type_filter = self.request.query_params.get("type")
        if type_filter:
            qs = qs.filter(type=type_filter)
        search = self.request.query_params.get("search")
        if search:
            qs = qs.filter(name__icontains=search)
        return qs

    def get_serializer_class(self):
        if self.action == "list":
            return TenantListSerializer
        if self.action in ("retrieve", "health"):
            return TenantDetailSerializer
        if self.action == "create":
            return TenantCreateSerializer
        if self.action in ("update", "partial_update"):
            return TenantUpdateSerializer
        return TenantListSerializer

    def create(self, request, *args, **kwargs):
        serializer = TenantCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        d = serializer.validated_data
        tenant = TenantLifecycleService.create_tenant(
            name=d["name"],
            slug=d["slug"],
            schema_name=d["schema_name"],
            domain=d["domain"],
            legal_name=d.get("legal_name", ""),
            tenant_type=d.get("type", "company"),
            subscription_plan=d.get("subscription_plan", ""),
            max_users=d.get("max_users", 10),
            max_storage_mb=d.get("max_storage_mb", 1024),
            country=d.get("country", "IR"),
            default_language=d.get("default_language", "fa"),
            tz=d.get("timezone", "Asia/Tehran"),
            currency=d.get("currency", "IRR"),
            parent_tenant_id=d.get("parent_tenant"),
        )
        return Response(
            TenantDetailSerializer(tenant).data,
            status=status.HTTP_201_CREATED,
        )

    # ── Lifecycle actions ─────────────────────────────────────────

    @action(detail=True, methods=["post"])
    def activate(self, request, pk=None):
        tenant = TenantLifecycleService.activate_tenant(pk)
        return Response(TenantDetailSerializer(tenant).data)

    @action(detail=True, methods=["post"])
    def suspend(self, request, pk=None):
        ser = TenantActionSerializer(data=request.data)
        ser.is_valid(raise_exception=True)
        tenant = TenantLifecycleService.suspend_tenant(pk, ser.validated_data.get("reason", ""))
        return Response(TenantDetailSerializer(tenant).data)

    @action(detail=True, methods=["post"])
    def archive(self, request, pk=None):
        tenant = TenantLifecycleService.archive_tenant(pk)
        return Response(TenantDetailSerializer(tenant).data)

    @action(detail=True, methods=["post"])
    def change_plan(self, request, pk=None):
        ser = TenantChangePlanSerializer(data=request.data)
        ser.is_valid(raise_exception=True)
        tenant = TenantLifecycleService.change_plan(
            tenant_id=pk,
            plan=ser.validated_data["plan"],
            max_users=ser.validated_data.get("max_users"),
            max_storage_mb=ser.validated_data.get("max_storage_mb"),
        )
        return Response(TenantDetailSerializer(tenant).data)

    # ── Quota ─────────────────────────────────────────────────────

    @action(detail=True, methods=["get"])
    def quota(self, request, pk=None):
        quota = TenantQuotaService.refresh_quota(pk)
        return Response(TenantQuotaUsageSerializer(quota).data)

    # ── Security / Settings ───────────────────────────────────────

    @action(detail=True, methods=["get", "patch"], url_path="settings")
    def tenant_settings(self, request, pk=None):
        if request.method == "PATCH":
            # Support partial update of security_policy or branding
            if "security_policy" in request.data:
                TenantSecurityService.update_security_policy(pk, request.data["security_policy"])
            if "branding" in request.data:
                TenantSecurityService.update_branding(pk, request.data["branding"])
        from .models import TenantSettings as TenantSettingsModel

        settings, _ = TenantSettingsModel.objects.get_or_create(tenant_id=pk)
        return Response(TenantSettingsSerializer(settings).data)

    # ── Monitoring ────────────────────────────────────────────────

    @action(detail=True, methods=["get"])
    def health(self, request, pk=None):
        data = TenantMonitoringService.get_tenant_health(pk)
        return Response(data)

    @action(detail=False, methods=["get"])
    def overview(self, request):
        data = TenantMonitoringService.get_all_tenants_overview()
        return Response(data)
