from dataclasses import dataclass
from datetime import datetime
from typing import Optional

from clubs.models import Club
from players.models import Player
from transfers.models import TransferWindow


@dataclass(frozen=True)
class TransferEligibilityContext:
    player: Optional[Player]
    source_club: Optional[Club]
    destination_club: Optional[Club]
    window: Optional[TransferWindow]

    is_international: bool = False
    now: Optional[datetime] = None
    current_transfer_id: object = None

    @property
    def effective_is_international(self) -> bool:
        """
        Club-to-club internationality is authoritative server state.

        If both club countries are available, caller input is ignored and the
        result is derived from the persisted source/destination clubs.  For a
        free agent the current schema does not store a previous registration
        association, so callers must provide the trusted server-side flag.
        """
        source = self.source_club
        destination = self.destination_club

        if source is not None and destination is not None:
            source_country = (source.country or "").strip().casefold()
            destination_country = (destination.country or "").strip().casefold()
            if source_country and destination_country:
                return source_country != destination_country

        return bool(self.is_international)
