"""
CLM API Serializers - v1.

سریالایزرهای REST API ماژول مدیریت قراردادها.
"""
from rest_framework import serializers

from ...infrastructure.persistence.models import (
    ContractModel,
    ContractPartyModel,
    ContractClauseModel,
    ContractMilestoneModel,
    ContractAmendmentModel,
    ContractTemplateModel,
    ContractRenewalModel,
)


# ═══════════════════════════════════════════════════
# Contract Template
# ═══════════════════════════════════════════════════

class ContractTemplateSerializer(serializers.ModelSerializer):
    """سریالایزر قالب قرارداد."""

    class Meta:
        model = ContractTemplateModel
        fields = [
            "id", "name", "name_en", "description",
            "category", "contract_type",
            "default_clauses", "default_milestones",
            "default_payment_terms_days", "default_advance_payment_percent",
            "default_retention_percent", "default_penalty_rate_per_day",
            "numbering_prefix", "numbering_pattern",
            "is_active", "is_default", "usage_count",
            "metadata", "created_at", "updated_at",
        ]
        read_only_fields = ["id", "usage_count", "created_at", "updated_at"]


class ContractTemplateListSerializer(serializers.ModelSerializer):
    """سریالایزر لیست قالب‌ها."""

    class Meta:
        model = ContractTemplateModel
        fields = [
            "id", "name", "category", "contract_type",
            "is_active", "is_default", "usage_count",
        ]


# ═══════════════════════════════════════════════════
# Contract
# ═══════════════════════════════════════════════════

class ContractSerializer(serializers.ModelSerializer):
    """سریالایزر قرارداد — جزئیات کامل."""

    parties_count = serializers.SerializerMethodField()
    milestones_count = serializers.SerializerMethodField()
    amendments_count = serializers.SerializerMethodField()

    class Meta:
        model = ContractModel
        fields = [
            "id", "contract_number", "title", "description",
            "category", "contract_type", "status", "priority",
            "start_date", "end_date", "signing_date",
            "effective_date", "expiry_date",
            "total_value", "currency_id", "payment_terms_days",
            "payment_terms_description", "advance_payment_percent",
            "retention_percent", "penalty_rate_per_day",
            "guarantee_amount", "guarantee_type", "guarantee_expiry_date",
            "performance_bond_amount", "performance_bond_expiry_date",
            "auto_renew", "renewal_period_days", "renewal_notice_days",
            "max_renewals", "renewals_count",
            "parent_contract", "template", "project_id",
            "org_unit_id", "legal_entity_id",
            "responsible_person_id", "employee_id",
            "reference_number", "tags", "notes", "metadata",
            "is_active", "is_confidential",
            "parties_count", "milestones_count", "amendments_count",
            "created_at", "updated_at",
        ]
        read_only_fields = [
            "id", "renewals_count",
            "parties_count", "milestones_count", "amendments_count",
            "created_at", "updated_at",
        ]

    def get_parties_count(self, obj):
        return obj.parties.count() if hasattr(obj, 'parties') else 0

    def get_milestones_count(self, obj):
        return obj.milestones.count() if hasattr(obj, 'milestones') else 0

    def get_amendments_count(self, obj):
        return obj.amendments.count() if hasattr(obj, 'amendments') else 0


class ContractListSerializer(serializers.ModelSerializer):
    """سریالایزر لیست قراردادها."""

    class Meta:
        model = ContractModel
        fields = [
            "id", "contract_number", "title",
            "category", "contract_type", "status", "priority",
            "start_date", "end_date", "expiry_date",
            "total_value", "is_active", "created_at",
        ]


class ContractCreateSerializer(serializers.ModelSerializer):
    """سریالایزر ایجاد قرارداد."""

    class Meta:
        model = ContractModel
        fields = [
            "contract_number", "title", "description",
            "category", "contract_type", "priority",
            "start_date", "end_date", "signing_date",
            "effective_date", "expiry_date",
            "total_value", "currency_id", "payment_terms_days",
            "payment_terms_description", "advance_payment_percent",
            "retention_percent", "penalty_rate_per_day",
            "guarantee_amount", "guarantee_type", "guarantee_expiry_date",
            "performance_bond_amount", "performance_bond_expiry_date",
            "auto_renew", "renewal_period_days", "renewal_notice_days",
            "max_renewals",
            "parent_contract", "template", "project_id",
            "org_unit_id", "legal_entity_id",
            "responsible_person_id", "employee_id",
            "reference_number", "tags", "notes", "metadata",
            "is_confidential",
        ]


class ContractStatusActionSerializer(serializers.Serializer):
    """سریالایزر تغییر وضعیت قرارداد."""
    reason = serializers.CharField(required=False, allow_blank=True, default="")
    notes = serializers.CharField(required=False, allow_blank=True, default="")


# ═══════════════════════════════════════════════════
# Contract Party
# ═══════════════════════════════════════════════════

class ContractPartySerializer(serializers.ModelSerializer):
    """سریالایزر طرف قرارداد."""

    class Meta:
        model = ContractPartyModel
        fields = [
            "id", "contract", "party_role",
            "business_partner_id", "legal_entity_id",
            "signer_name", "signer_title", "signer_national_code",
            "signing_authority",
            "contact_name", "contact_phone", "contact_email",
            "share_percent", "is_primary", "is_lead",
            "notes", "order", "created_at", "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]


# ═══════════════════════════════════════════════════
# Contract Clause
# ═══════════════════════════════════════════════════

class ContractClauseSerializer(serializers.ModelSerializer):
    """سریالایزر بند قرارداد."""

    class Meta:
        model = ContractClauseModel
        fields = [
            "id", "contract", "clause_number", "title", "content",
            "clause_type", "is_mandatory", "is_negotiable",
            "parent_clause", "order", "notes",
            "created_at", "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]


# ═══════════════════════════════════════════════════
# Contract Milestone
# ═══════════════════════════════════════════════════

class ContractMilestoneSerializer(serializers.ModelSerializer):
    """سریالایزر مرحله قرارداد."""

    class Meta:
        model = ContractMilestoneModel
        fields = [
            "id", "contract", "title", "description",
            "milestone_type", "status",
            "planned_date", "actual_date", "due_date",
            "amount", "currency_id", "invoice_number", "payment_status",
            "deliverable_description", "acceptance_criteria",
            "accepted_by", "accepted_at",
            "has_penalty", "penalty_amount_per_day",
            "order", "notes", "created_at", "updated_at",
        ]
        read_only_fields = ["id", "actual_date", "accepted_by", "accepted_at", "created_at", "updated_at"]


class MilestoneCompleteSerializer(serializers.Serializer):
    """سریالایزر تکمیل مرحله."""
    actual_date = serializers.DateField(required=False)
    notes = serializers.CharField(required=False, allow_blank=True, default="")


# ═══════════════════════════════════════════════════
# Contract Amendment
# ═══════════════════════════════════════════════════

class ContractAmendmentSerializer(serializers.ModelSerializer):
    """سریالایزر الحاقیه."""

    value_change = serializers.SerializerMethodField()

    class Meta:
        model = ContractAmendmentModel
        fields = [
            "id", "contract", "amendment_number", "title",
            "description", "reason", "amendment_type", "status",
            "effective_date",
            "old_values", "new_values",
            "old_total_value", "new_total_value",
            "old_end_date", "new_end_date",
            "approved_by", "approved_at",
            "rejected_by", "rejected_reason",
            "value_change", "notes",
            "created_at", "updated_at",
        ]
        read_only_fields = [
            "id", "amendment_number",
            "approved_by", "approved_at",
            "rejected_by", "value_change",
            "created_at", "updated_at",
        ]

    def get_value_change(self, obj):
        if obj.old_total_value is not None and obj.new_total_value is not None:
            return float(obj.new_total_value - obj.old_total_value)
        return None


class AmendmentApproveSerializer(serializers.Serializer):
    """سریالایزر تأیید الحاقیه."""
    notes = serializers.CharField(required=False, allow_blank=True, default="")


class AmendmentRejectSerializer(serializers.Serializer):
    """سریالایزر رد الحاقیه."""
    reason = serializers.CharField(required=True)


# ═══════════════════════════════════════════════════
# Contract Renewal
# ═══════════════════════════════════════════════════

class ContractRenewalSerializer(serializers.ModelSerializer):
    """سریالایزر تمدید."""

    class Meta:
        model = ContractRenewalModel
        fields = [
            "id", "contract", "renewal_number", "status",
            "old_start_date", "old_end_date",
            "new_start_date", "new_end_date",
            "old_value", "new_value", "value_change_percent",
            "approved_by", "approved_at", "is_auto",
            "notes", "created_at", "updated_at",
        ]
        read_only_fields = [
            "id", "renewal_number", "old_start_date", "old_end_date",
            "old_value", "value_change_percent",
            "approved_by", "approved_at", "is_auto",
            "created_at", "updated_at",
        ]


class RenewContractSerializer(serializers.Serializer):
    """سریالایزر تمدید قرارداد."""
    new_end_date = serializers.DateField(required=True)
    new_value = serializers.DecimalField(max_digits=20, decimal_places=2, required=False)
    notes = serializers.CharField(required=False, allow_blank=True, default="")
