"""
Tenant Serializers — API serialization for tenant management (super admin).
"""
from rest_framework import serializers

from .models import (
    Tenant,
    Domain,
    TenantSettings,
    TenantQuotaUsage,
    TenantType,
    TenantStatus,
    IsolationType,
)


class DomainSerializer(serializers.ModelSerializer):
    class Meta:
        model = Domain
        fields = ["id", "domain", "is_primary", "ssl_enabled"]


class TenantSettingsSerializer(serializers.ModelSerializer):
    class Meta:
        model = TenantSettings
        fields = [
            "feature_flags",
            "security_policy",
            "branding",
            "localization",
            "integration_keys",
            "updated_at",
        ]
        read_only_fields = ["updated_at"]


class TenantQuotaUsageSerializer(serializers.ModelSerializer):
    users_percent = serializers.FloatField(read_only=True)
    storage_percent = serializers.FloatField(read_only=True)
    is_near_user_limit = serializers.BooleanField(read_only=True)
    is_near_storage_limit = serializers.BooleanField(read_only=True)

    class Meta:
        model = TenantQuotaUsage
        fields = [
            "users_count",
            "storage_usage_mb",
            "api_calls",
            "projects_count",
            "records_count",
            "users_percent",
            "storage_percent",
            "is_near_user_limit",
            "is_near_storage_limit",
            "last_calculated_at",
        ]
        read_only_fields = fields


class TenantListSerializer(serializers.ModelSerializer):
    """Compact serializer for list views."""

    status_display = serializers.CharField(source="get_status_display", read_only=True)
    type_display = serializers.CharField(source="get_type_display", read_only=True)
    domains = DomainSerializer(many=True, read_only=True)

    class Meta:
        model = Tenant
        fields = [
            "id",
            "name",
            "legal_name",
            "slug",
            "type",
            "type_display",
            "status",
            "status_display",
            "subscription_plan",
            "max_users",
            "country",
            "is_active",
            "created_at",
            "domains",
        ]


class TenantDetailSerializer(serializers.ModelSerializer):
    """Full detail serializer with nested settings & quota."""

    status_display = serializers.CharField(source="get_status_display", read_only=True)
    type_display = serializers.CharField(source="get_type_display", read_only=True)
    isolation_display = serializers.CharField(
        source="get_isolation_type_display", read_only=True
    )
    domains = DomainSerializer(many=True, read_only=True)
    tenant_settings = TenantSettingsSerializer(read_only=True)
    quota_usage = TenantQuotaUsageSerializer(read_only=True)
    children = serializers.SerializerMethodField()

    class Meta:
        model = Tenant
        fields = [
            "id",
            "name",
            "legal_name",
            "slug",
            "type",
            "type_display",
            "status",
            "status_display",
            "parent_tenant",
            "children",
            "subscription_plan",
            "max_users",
            "max_storage_mb",
            "country",
            "default_language",
            "timezone",
            "currency",
            "isolation_type",
            "isolation_display",
            "is_active",
            "metadata",
            "settings",
            "created_at",
            "updated_at",
            "activated_at",
            "suspended_at",
            "domains",
            "tenant_settings",
            "quota_usage",
        ]

    def get_children(self, obj):
        children = obj.children.all()
        return TenantListSerializer(children, many=True).data


class TenantCreateSerializer(serializers.Serializer):
    """Validates data for creating a new tenant via the lifecycle service."""

    name = serializers.CharField(max_length=255)
    legal_name = serializers.CharField(max_length=255, required=False, default="")
    slug = serializers.SlugField(max_length=100)
    schema_name = serializers.SlugField(max_length=100)
    domain = serializers.CharField(max_length=255)
    type = serializers.ChoiceField(choices=TenantType.choices, default=TenantType.COMPANY)
    subscription_plan = serializers.CharField(max_length=100, required=False, default="")
    max_users = serializers.IntegerField(min_value=1, default=10)
    max_storage_mb = serializers.IntegerField(min_value=1, default=1024)
    country = serializers.CharField(max_length=10, default="IR")
    default_language = serializers.CharField(max_length=10, default="fa")
    timezone = serializers.CharField(max_length=60, default="Asia/Tehran")
    currency = serializers.CharField(max_length=10, default="IRR")
    parent_tenant = serializers.UUIDField(required=False, allow_null=True)

    def validate_slug(self, value):
        if Tenant.objects.filter(slug=value).exists():
            raise serializers.ValidationError("Tenant with this slug already exists.")
        return value

    def validate_schema_name(self, value):
        if Tenant.objects.filter(schema_name=value).exists():
            raise serializers.ValidationError("Schema name already taken.")
        return value


class TenantUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tenant
        fields = [
            "name",
            "legal_name",
            "type",
            "subscription_plan",
            "max_users",
            "max_storage_mb",
            "country",
            "default_language",
            "timezone",
            "currency",
            "metadata",
        ]


class TenantActionSerializer(serializers.Serializer):
    """For lifecycle actions (suspend etc.)."""

    reason = serializers.CharField(required=False, default="", allow_blank=True)


class TenantChangePlanSerializer(serializers.Serializer):
    plan = serializers.CharField()
    max_users = serializers.IntegerField(required=False, allow_null=True)
    max_storage_mb = serializers.IntegerField(required=False, allow_null=True)
