"""
Scenario fixture factories for testing BaoLife game scenarios.

Provides pre-configured game scenarios like "first day of school",
"getting married", "job interview", etc. for integration testing.
"""
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))

from datetime import date, timedelta
from .player_fixtures import (
    create_student_player, create_adult_player, create_player_with_relationships,
    create_player_with_partner, add_test_locations, set_player_stats,
    create_child_player, create_teen_player
)


def scenario_first_day_of_school(user_id=None):
    """
    Create scenario: First day of elementary school.

    Returns:
        playerClass configured for first day of school
    """
    from functions import EducationRecord, locationClass

    # create_child_player accepts: age_years, user_id, firstname
    player = create_child_player(age_years=6, user_id=user_id, firstname='FirstGrader')

    # Set to first day of school (September)
    player.date = '09-01'
    player.monthOfYear = 9
    player.dayOfYear = 244
    player.hourOfDay = 8
    player.minuteOfHour = 0
    player.daysSinceSchoolStarted = 0
    player.summerVacation = False

    # Add school location
    school = locationClass('elementary_school_1', 'school')
    school.description = 'Test Elementary School'
    player.l.append(school)

    # Set at school
    player.c.location = 'elementary_school_1'

    # Add some nervousness
    set_player_stats(player, energy=80, happiness=60, stress=30)

    return player


def scenario_high_school_graduation(user_id=None):
    """
    Create scenario: High school graduation day.

    Returns:
        playerClass configured for graduation
    """
    # create_teen_player accepts: age_years, user_id, firstname
    player = create_teen_player(age_years=18, user_id=user_id, firstname='Graduate')

    # Set to graduation day (June)
    player.date = '06-15'
    player.monthOfYear = 6
    player.dayOfYear = 166
    player.hourOfDay = 10
    player.minuteOfHour = 0

    # Good stats for graduation
    set_player_stats(player, energy=100, happiness=95, stress=10, money=500)

    # Add family relationships
    player = create_player_with_relationships(player.userID, num_friends=5, has_family=True)

    return player


def scenario_job_interview(user_id=None, occupation='Software Engineer'):
    """
    Create scenario: Going to job interview.

    Args:
        occupation: Job being interviewed for

    Returns:
        playerClass configured for job interview
    """
    # create_adult_player accepts: age_years, user_id, firstname, occupation
    player = create_adult_player(age_years=22, user_id=user_id, firstname='Interviewee',
                                occupation='Unemployed')

    # Set to morning of interview
    player.hourOfDay = 9
    player.minuteOfHour = 0

    # Add some nervousness
    set_player_stats(player, energy=90, happiness=60, stress=50, money=1000)

    # Add office location for interview
    add_test_locations(player)
    player.c.location = 'work'

    return player


def scenario_wedding_day(user_id=None):
    """
    Create scenario: Wedding day.

    Returns:
        playerClass configured for wedding
    """
    player = create_player_with_partner(user_id, age_years=28, married=False)

    # Set to wedding day
    player.date = '06-20'
    player.monthOfYear = 6
    player.hourOfDay = 14
    player.minuteOfHour = 0

    # Very happy and excited
    set_player_stats(player, energy=100, happiness=100, stress=20, money=10000)

    # Add family and friends
    player = create_player_with_relationships(player.userID, num_friends=10, has_family=True)

    return player


def scenario_first_day_at_job(user_id=None, occupation='Software Engineer'):
    """
    Create scenario: First day at new job.

    Args:
        occupation: New job title

    Returns:
        playerClass configured for first day at work
    """
    from functions import personClass

    # create_adult_player accepts: age_years, user_id, firstname, occupation
    player = create_adult_player(age_years=23, user_id=user_id, firstname='NewEmployee',
                                occupation=occupation)

    # Set to first day (Monday morning)
    player.weekDay = 0  # Monday
    player.hourOfDay = 9
    player.minuteOfHour = 0
    player.weekend = False

    # Add nervousness
    set_player_stats(player, energy=90, happiness=70, stress=40, money=2000)

    # Add work location and coworkers
    add_test_locations(player)
    player.c.location = 'work'

    # Add a few coworkers
    for i in range(3):
        coworker = personClass()
        coworker.firstname = f'Coworker{i+1}'
        coworker.sex = 'Male' if i % 2 == 0 else 'Female'
        coworker.ageYears = 25 + i
        coworker.ageDays = (25 + i) * 365
        coworker.relationships = ['coworker']
        coworker.title = 'Coworker'
        coworker.affinity = 0
        coworker.familiarity = 0
        player.r.append(coworker)

    return player


def scenario_weekend_relaxation(user_id=None):
    """
    Create scenario: Relaxing weekend at home.

    Returns:
        playerClass configured for weekend
    """
    # create_adult_player accepts: age_years, user_id, firstname, occupation
    player = create_adult_player(age_years=30, user_id=user_id, firstname='WeekendWarrior')

    # Set to Saturday morning
    player.weekDay = 5  # Saturday
    player.weekend = True
    player.hourOfDay = 10
    player.minuteOfHour = 0

    # Well-rested and happy
    set_player_stats(player, energy=100, happiness=85, stress=10, money=5000)

    add_test_locations(player)
    player.c.location = 'home'

    return player


def scenario_birthday_celebration(user_id=None, age_years=25):
    """
    Create scenario: Birthday celebration.

    Args:
        age_years: Age being celebrated

    Returns:
        playerClass configured for birthday
    """
    # create_adult_player accepts: age_years, user_id, firstname, occupation
    player = create_adult_player(age_years=age_years - 1, user_id=user_id, firstname='BirthdayPerson')

    # Set to birthday (player's birthday is today)
    player.hourOfDay = 18  # Evening party
    player.minuteOfHour = 0

    # Happy and excited
    set_player_stats(player, energy=95, happiness=100, stress=0, money=3000)

    # Add friends and family
    player = create_player_with_relationships(player.userID, num_friends=8, has_family=True)

    add_test_locations(player)
    player.c.location = 'home'

    return player


def scenario_financial_crisis(user_id=None):
    """
    Create scenario: Financial difficulties.

    Returns:
        playerClass configured for financial crisis
    """
    # create_adult_player accepts: age_years, user_id, firstname, occupation
    player = create_adult_player(age_years=35, user_id=user_id, firstname='Struggling')

    # Very low money and high stress
    set_player_stats(player, energy=60, happiness=30, stress=80, money=50)

    add_test_locations(player)
    player.c.location = 'home'

    return player


def scenario_school_exam_week(user_id=None):
    """
    Create scenario: Stressful exam week at school.

    Returns:
        playerClass configured for exam week
    """
    # create_teen_player accepts: age_years, user_id, firstname
    player = create_teen_player(age_years=17, user_id=user_id, firstname='ExamTaker')

    # Set to exam week (December)
    player.date = '12-15'
    player.monthOfYear = 12
    player.hourOfDay = 8
    player.minuteOfHour = 0

    # Tired and stressed
    set_player_stats(player, energy=50, happiness=40, stress=90, money=200)

    add_test_locations(player)
    player.c.location = 'school'

    return player


def scenario_new_relationship(user_id=None):
    """
    Create scenario: Just started dating someone.

    Returns:
        playerClass configured for new relationship
    """
    from functions import personClass

    # create_adult_player accepts: age_years, user_id, firstname, occupation
    player = create_adult_player(age_years=24, user_id=user_id, firstname='NewCouple')

    # Create new partner
    partner = personClass()
    partner.firstname = 'NewPartner'
    partner.sex = 'Female' if player.c.sex == 'Male' else 'Male'
    partner.ageYears = 23
    partner.ageDays = 23 * 365
    partner.relationships = ['dating']
    partner.title = 'Partner'
    partner.affinity = 70  # Still building relationship
    partner.familiarity = 30  # Getting to know each other
    player.r.append(partner)

    # Happy and excited
    set_player_stats(player, energy=90, happiness=90, stress=15, money=3000)

    return player
