from datetime import datetime, timezone as dt_timezone

import pytest

from careers.models import Career, CareerStatus, CareerType
from clubs.models import Club, ClubLevel, ClubStatus
from seasons.models import Season
from users.models import User
from transfers.constants import TransferWindowType
from transfers.models import TransferWindow


# ============================================================================
# Users
# ============================================================================

@pytest.fixture
def player_user(db):
    return User.objects.create_user(
        email="transfer-player@test.local",
        username="transfer_player",
        password="TestPass123!",
    )


@pytest.fixture
def coach_user(db):
    return User.objects.create_user(
        email="transfer-coach@test.local",
        username="transfer_coach",
        password="TestPass123!",
    )


@pytest.fixture
def second_coach_user(db):
    return User.objects.create_user(
        email="transfer-coach2@test.local",
        username="transfer_coach2",
        password="TestPass123!",
    )


@pytest.fixture
def third_coach_user(db):
    return User.objects.create_user(
        email="transfer-coach3@test.local",
        username="transfer_coach3",
        password="TestPass123!",
    )


# ============================================================================
# Careers
# ============================================================================

@pytest.fixture
def player_career(player_user):
    return Career.objects.create(
        user=player_user,
        career_type=CareerType.PLAYER,
        status=CareerStatus.ACTIVE,
    )


@pytest.fixture
def coach_career(coach_user):
    return Career.objects.create(
        user=coach_user,
        career_type=CareerType.COACH,
        status=CareerStatus.ACTIVE,
    )


@pytest.fixture
def second_coach_career(second_coach_user):
    return Career.objects.create(
        user=second_coach_user,
        career_type=CareerType.COACH,
        status=CareerStatus.ACTIVE,
    )


@pytest.fixture
def third_coach_career(third_coach_user):
    return Career.objects.create(
        user=third_coach_user,
        career_type=CareerType.COACH,
        status=CareerStatus.ACTIVE,
    )


# ============================================================================
# Clubs
# ============================================================================

@pytest.fixture
def club(coach_career):
    return Club.objects.create(
        coach_career=coach_career,
        name="Transfer Test FC",
        short_name="TTFC",
        country="Iran",
        region="Tehran",
        level=ClubLevel.PROFESSIONAL,
        status=ClubStatus.ACTIVE,
        reputation=70,
    )


@pytest.fixture
def club2(second_coach_career):
    return Club.objects.create(
        coach_career=second_coach_career,
        name="Transfer Second FC",
        short_name="TSFC",
        country="Iran",
        region="Tehran",
        level=ClubLevel.PROFESSIONAL,
        status=ClubStatus.ACTIVE,
        reputation=65,
    )


@pytest.fixture
def club3(third_coach_career):
    return Club.objects.create(
        coach_career=third_coach_career,
        name="Transfer Third FC",
        short_name="T3FC",
        country="Iran",
        region="Tehran",
        level=ClubLevel.PROFESSIONAL,
        status=ClubStatus.ACTIVE,
        reputation=60,
    )


# ============================================================================
# Seasons
# ============================================================================

@pytest.fixture
def season(db):
    return Season.objects.create(
        name="FTG Season 2026",
        year=2026,
        start_date="2026-09-01",
        end_date="2027-06-30",
    )


@pytest.fixture
def second_season(db):
    return Season.objects.create(
        name="FTG Season 2027",
        year=2027,
        start_date="2027-09-01",
        end_date="2028-06-30",
    )


# ============================================================================
# Transfer Window
# ============================================================================

@pytest.fixture
def test_now():
    """
    A deterministic timestamp inside the summer transfer window.
    """

    return datetime(
        2026,
        7,
        15,
        12,
        0,
        tzinfo=dt_timezone.utc,
    )


@pytest.fixture
def window_times():
    return {
        "start_at": datetime(
            2026,
            6,
            1,
            0,
            0,
            tzinfo=dt_timezone.utc,
        ),
        "end_at": datetime(
            2026,
            8,
            31,
            23,
            59,
            tzinfo=dt_timezone.utc,
        ),
    }


@pytest.fixture
def window(season, window_times):
    return TransferWindow.objects.create(
        season=season,
        name="Summer Transfer Window",
        window_type=TransferWindowType.SUMMER,
        start_at=window_times["start_at"],
        end_at=window_times["end_at"],
    )
# ============================================================================
# Players
# ============================================================================

@pytest.fixture
def player(player_career):
    from federations.testing import registered_test_region
    from players.models import PlayerTier, Position
    from players.services import PlayerCreationService

    return PlayerCreationService.create_player(
        regional_federation=registered_test_region(),
        career=player_career,
        first_name="Transfer",
        last_name="Player",
        nationality="Iran",
        position=Position.ST,
        tier=PlayerTier.NORMAL,
    )
