from decimal import Decimal
from rest_framework import serializers
from clubs.models import Club
from players.models import Player
from seasons.models import Season
from .models import Transfer, TransferPartyApproval, TransferWindow


class TransferWindowSerializer(serializers.ModelSerializer):
    class Meta: model=TransferWindow; fields="__all__"

class TransferSerializer(serializers.ModelSerializer):
    approvals = serializers.SerializerMethodField()
    class Meta: model=Transfer; fields="__all__"
    def get_approvals(self,obj):
        from .services import TransferApprovalService
        return TransferApprovalService.approval_state(transfer=obj)

class TransferPartyApprovalSerializer(serializers.ModelSerializer):
    class Meta: model=TransferPartyApproval; fields="__all__"

class WindowCreateSerializer(serializers.Serializer):
    season=serializers.PrimaryKeyRelatedField(queryset=Season.objects.all())
    name=serializers.CharField(max_length=100)
    window_type=serializers.CharField()
    start_at=serializers.DateTimeField(); end_at=serializers.DateTimeField()

class TransferCreateSerializer(serializers.Serializer):
    contract_terms=serializers.JSONField()

    def validate_contract_terms(self, value):
        from .negotiation import normalize_terms
        return normalize_terms(value)

    player=serializers.PrimaryKeyRelatedField(queryset=Player.objects.select_related("career__user"))
    source_club=serializers.PrimaryKeyRelatedField(queryset=Club.objects.all(),required=False,allow_null=True)
    destination_club=serializers.PrimaryKeyRelatedField(queryset=Club.objects.all())
    window=serializers.PrimaryKeyRelatedField(queryset=TransferWindow.objects.all())
    is_international=serializers.BooleanField(required=False,default=False)
    transfer_fee=serializers.DecimalField(max_digits=18,decimal_places=2,required=False,default=0)

class ApprovalSerializer(serializers.Serializer): role=serializers.CharField(max_length=20)
class RejectSerializer(serializers.Serializer): reason=serializers.CharField(max_length=255,required=False,allow_blank=True,default="")
class CompleteSerializer(serializers.Serializer):
    salary=serializers.DecimalField(max_digits=18,decimal_places=2)
    duration_months=serializers.IntegerField(min_value=1)
    signing_bonus=serializers.DecimalField(max_digits=18,decimal_places=2,required=False,default=0)
    release_clause=serializers.DecimalField(max_digits=18,decimal_places=2,min_value=Decimal("0.01"))
    compensation_frequency=serializers.ChoiceField(choices=["WEEKLY","BIWEEKLY","MONTHLY","CUSTOM"],required=False,allow_null=True)
    compensation_custom_interval_days=serializers.IntegerField(min_value=1,required=False,allow_null=True)
    first_payment_delay_days=serializers.IntegerField(min_value=0,required=False,default=0)
    clauses=serializers.ListField(child=serializers.DictField(),required=False,default=list)
    destination_squad_scope=serializers.CharField(required=False,default="SENIOR")
