"""
Unit tests for BaoLife daily plan generation.

Tests the daily schedule generation system for different character types.
"""
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))

import pytest
from tests.fixtures.player_fixtures import (
    create_newborn_player, create_child_player, create_student_player,
    create_adult_player
)


class TestDailyPlanGeneration:
    """Tests for daily plan generation."""

    def test_get_daily_plan_newborn(self):
        """Test daily plan for newborn."""
        from intradayActivity import get_dailyPlan

        player = create_newborn_player()
        player.c.dailyPlan = []

        result = get_dailyPlan(player, player.c)

        # Newborns should have a simple daily plan
        assert isinstance(result.dailyPlan, list)

    def test_get_daily_plan_child(self):
        """Test daily plan for child."""
        from intradayActivity import get_dailyPlan

        player = create_child_player(age_years=8)
        player.c.dailyPlan = []
        player.c.occupation = 'elementary school'

        result = get_dailyPlan(player, player.c)

        # Children should have school-related activities
        assert isinstance(result.dailyPlan, list)

    def test_get_daily_plan_student(self):
        """Test daily plan for high school student."""
        from intradayActivity import get_dailyPlan

        player = create_student_player(age_years=16, grade='high school')
        player.c.dailyPlan = []

        result = get_dailyPlan(player, player.c)

        assert isinstance(result.dailyPlan, list)
        # High school students should have activities
        # (specific checks would depend on implementation)

    def test_get_daily_plan_adult(self):
        """Test daily plan for working adult."""
        from intradayActivity import get_dailyPlan

        player = create_adult_player(age_years=30, occupation='Engineer')
        player.c.dailyPlan = []

        result = get_dailyPlan(player, player.c)

        assert isinstance(result.dailyPlan, list)
        # Adults should have work-related activities

    def test_daily_plan_not_empty(self):
        """Test that daily plans are generated with activities."""
        from intradayActivity import get_dailyPlan

        player = create_adult_player()
        player.c.dailyPlan = []

        result = get_dailyPlan(player, player.c)

        # Most characters should have some planned activities
        # (unless they're very young or unemployed)
        assert hasattr(result, 'dailyPlan')


class TestIntradayActivities:
    """Tests for intraday activity execution."""

    def test_get_intraday_activity_basic(self):
        """Test basic intraday activity."""
        from intradayActivity import getIntradayActivity
        from functions import dailyEvent

        player = create_adult_player()

        # Add a daily event
        event = dailyEvent(10, 'work')  # 10 AM, at work
        event.title = 'Work'
        player.c.dailyPlan = [event]
        player.hourOfDay = 10

        result = getIntradayActivity(player, player.c)

        # Should process the activity
        assert result is not None

    @pytest.mark.skip(reason="parseOneTimeEvents function not yet implemented in intradayActivity.py")
    def test_parse_one_time_events(self):
        """Test parsing one-time events."""
        from intradayActivity import parseOneTimeEvents
        from functions import oneTimeEvent

        player = create_adult_player()
        player.hourOfDay = 10
        player.date = '01-15'

        # Add a one-time event
        event = oneTimeEvent(
            title='Test Event',
            message='This is a test',
            date='01-15',
            hour=10
        )
        player.c.oneTimeEvents = [event]

        parseOneTimeEvents(player)

        # Event should have been processed
        # (specific behavior depends on implementation)
        assert True  # Placeholder


class TestScheduleManagement:
    """Tests for schedule management."""

    def test_character_has_schedules(self):
        """Test that characters have schedules attribute."""
        player = create_adult_player()

        assert hasattr(player.c, 'schedules')
        assert isinstance(player.c.schedules, list)

    def test_daily_plan_structure(self):
        """Test that daily plan items have correct structure."""
        from functions import dailyEvent

        event = dailyEvent(9, 'work')
        event.title = 'Morning Work'
        event.name = 'work_morning'

        assert event.time == 9
        assert event.location == 'work'
        assert event.title == 'Morning Work'
        assert event.name == 'work_morning'
