"""
Event Registration Module

This module contains functions for registering event handlers and events at server startup.
These functions are called once during initialization and have no runtime performance impact.

Functions:
    - register_all_event_handlers(): Registers all event handler functions with the event handler system
    - register_all_events(): Registers all game events with conditions for efficient filtering
"""

import logging
from events import *
import dayEvents
import conversationEvents
import tutorial_events
from retention import tutorial
from event_handlers import register_event_handler, _registry
from event_registry import register_event, event_count

# Setup logging
logger = logging.getLogger(__name__)


def register_all_event_handlers():
    """Register all valid event handlers"""
    # Event handlers from events.py
    register_event_handler("actTest", actTest)
    register_event_handler("actTestTake", actTestTake)
    register_event_handler("braceletDilemma", braceletDilemma)
    register_event_handler("braces", braces)
    register_event_handler("breakArm", breakArm)
    register_event_handler("bullyDilemma", bullyDilemma)
    register_event_handler("carCrash", carCrash)
    register_event_handler("childBorn", childBorn)
    register_event_handler("childLearnedWalk", childLearnedWalk)
    register_event_handler("childhoodActivity", childhoodActivity)
    register_event_handler("chooseCollege", chooseCollege)
    register_event_handler("chooseMajor", chooseMajor)
    register_event_handler("collegeExtracurricular", collegeExtracurricular)
    register_event_handler("dating_choice", dating_choice)
    register_event_handler("dropBooks", dropBooks)
    register_event_handler("employeeOfTheMonth", employeeOfTheMonth)
    register_event_handler("extracurricular", extracurricular)
    register_event_handler("fieldTrip", fieldTrip)
    register_event_handler("firstCrush", firstCrush)
    register_event_handler("firstJob", firstJob)
    register_event_handler("firstKiss", firstKiss)
    register_event_handler("forgotCombo", forgotCombo)
    register_event_handler("foundAPenny", foundAPenny)
    register_event_handler("freeConcert", freeConcert)
    register_event_handler("foundMoneyStreet", foundMoneyStreet)
    register_event_handler("freeUpgrade", freeUpgrade)
    register_event_handler("unexpectedCompliment", unexpectedCompliment)
    register_event_handler("perfectParkingSpot", perfectParkingSpot)
    register_event_handler("rainbowSighting", rainbowSighting)
    register_event_handler("spilledDrink", spilledDrink)
    register_event_handler("phoneDropped", phoneDropped)
    register_event_handler("birdPooped", birdPooped)
    register_event_handler("forgotWallet", forgotWallet)
    register_event_handler("missedBus", missedBus)
    register_event_handler("glasses", glasses)
    register_event_handler("haveChild", haveChild)
    register_event_handler("healthCondition", healthCondition)
    register_event_handler("jobApplication", jobApplication)
    register_event_handler("latetoSchool", latetoSchool)
    register_event_handler("learnInstrument", learnInstrument)
    register_event_handler("learnedBike", learnedBike)
    register_event_handler("learnedSwim", learnedSwim)
    register_event_handler("learnedWalk", learnedWalk)
    register_event_handler("learningColors", learningColors)
    register_event_handler("likeSchool", likeSchool)
    register_event_handler("lostFirstTooth", lostFirstTooth)
    register_event_handler("lostLastTooth", lostLastTooth)
    register_event_handler("lowAffinity", lowAffinity)
    register_event_handler("lowEnergyEvent", lowEnergyEvent)
    register_event_handler("marriage", marriage)
    register_event_handler("minorInjury", minorInjury)
    register_event_handler("minorSickness", minorSickness)
    register_event_handler("negativeHabitEvent", negativeHabitEvent)
    register_event_handler("newFriend", newFriend)
    register_event_handler("oneTimeEventTest", oneTimeEventTest)
    register_event_handler("openbankAccount", openbankAccount)
    register_event_handler("playDate", playDate)
    register_event_handler("pregnant", pregnant)
    register_event_handler("romanticDate", romanticDate)
    register_event_handler("satTest", satTest)
    register_event_handler("schoolAssembly", schoolAssembly)
    register_event_handler("schoolFight", schoolFight)
    register_event_handler("schoolLunch", schoolLunch)
    register_event_handler("startedPeriod", startedPeriod)
    register_event_handler("tiredinClass", tiredinClass)
    register_event_handler("vendingMachine", vendingMachine)
    register_event_handler("wedding", wedding)

    # New childhood events
    register_event_handler("firstDayOfPreschool", firstDayOfPreschool)
    register_event_handler("imaginaryFriend", imaginaryFriend)
    register_event_handler("firstNightmare", firstNightmare)
    register_event_handler("petGoldfish", petGoldfish)
    register_event_handler("scaredOfDark", scaredOfDark)
    register_event_handler("firstTimeTyingShoes", firstTimeTyingShoes)
    register_event_handler("sandboxDisagreement", sandboxDisagreement)
    register_event_handler("pickySomeEater", pickySomeEater)
    register_event_handler("firstHaircut", firstHaircut)

    # New adolescence life events
    register_event_handler("groupProjectDrama", groupProjectDrama)
    register_event_handler("voiceCracking", voiceCracking)
    register_event_handler("bodySelfConsciousness", bodySelfConsciousness)
    register_event_handler("curfewArgument", curfewArgument)
    register_event_handler("growthSpurt", growthSpurt)
    register_event_handler("embarrassingSituation", embarrassingSituation)
    register_event_handler("sleepover", sleepover)
    register_event_handler("socialMediaPressure", socialMediaPressure)
    register_event_handler("fashionExperimentation", fashionExperimentation)
    register_event_handler("learningToDrive", learningToDrive)

    # Quick wins education events
    register_event_handler("popQuiz", popQuiz)
    register_event_handler("raisedHandNotCalled", raisedHandNotCalled)
    register_event_handler("lostHomework", lostHomework)
    register_event_handler("presentationNerves", presentationNerves)
    register_event_handler("teacherFavorite", teacherFavorite)
    register_event_handler("studyGroupInvite", studyGroupInvite)
    register_event_handler("extracurricularBurnout", extracurricularBurnout)
    register_event_handler("cafeteriaFoodPoisoning", cafeteriaFoodPoisoning)
    register_event_handler("substituteTeacher", substituteTeacher)
    register_event_handler("collegeAllNighter", collegeAllNighter)

    # Adulthood life events
    register_event_handler("firstApartment", firstApartment)
    register_event_handler("workLifeBalance", workLifeBalance)
    register_event_handler("forgotBirthdayCall", forgotBirthdayCall)
    register_event_handler("friendsDrifting", friendsDrifting)
    register_event_handler("unexpectedBill", unexpectedBill)
    register_event_handler("promotionOpportunity", promotionOpportunity)
    register_event_handler("agingParent", agingParent)
    register_event_handler("careerChangeDesire", careerChangeDesire)
    register_event_handler("coworkerRivalry", coworkerRivalry)
    register_event_handler("divorceConsideration", divorceConsideration)

    # Event handlers from dayEvents.py
    register_event_handler("christmas", dayEvents.christmas)
    register_event_handler("newYear", dayEvents.newYear)
    register_event_handler("thanksgiving", dayEvents.thanksgiving)
    register_event_handler("blackfriday", dayEvents.blackfriday)
    register_event_handler("independenceday", dayEvents.independenceday)
    register_event_handler("immunizations", dayEvents.immunizations)
    register_event_handler("vacation", dayEvents.vacation)
    register_event_handler("newFood", dayEvents.newFood)
    register_event_handler("puberty", dayEvents.puberty)
    register_event_handler("school", dayEvents.school)
    register_event_handler("graduate5th", dayEvents.graduate5th)
    register_event_handler("graduate8th", dayEvents.graduate8th)
    register_event_handler("graduate12th", dayEvents.graduate12th)
    register_event_handler("college", dayEvents.college)
    register_event_handler("collegeParty", dayEvents.collegeParty)
    register_event_handler("collegeGreekLife", dayEvents.collegeGreekLife)
    register_event_handler("collegeMissHome", dayEvents.collegeMissHome)
    register_event_handler("adultMissFriends", dayEvents.adultMissFriends)
    register_event_handler("collegeMinor", dayEvents.collegeMinor)
    register_event_handler("birthday", dayEvents.birthday)
    register_event_handler("driversLessons", dayEvents.driversLessons)
    register_event_handler("driversTest", dayEvents.driversTest)
    register_event_handler("positiveInteraction", dayEvents.positiveInteraction)
    register_event_handler("lowEnergyEvents", dayEvents.lowEnergyEvents)
    register_event_handler("extendedFamily", dayEvents.extendedFamily)
    register_event_handler("murderAttempt", dayEvents.murderAttempt)
    register_event_handler("funeral", dayEvents.funeral)

    # Event handlers from conversationEvents.py
    register_event_handler("conversationInit", conversationEvents.conversationInit)

    # Event handlers from tutorial_events.py
    register_event_handler("firstConversation", tutorial_events.firstConversation)
    register_event_handler("firstActivityChoice", tutorial_events.firstActivityChoice)
    register_event_handler("tutorialComplete", tutorial_events.tutorialComplete)

    # Event handlers from retention/tutorial.py
    register_event_handler("tutorialStepComplete", tutorial.handle_tutorial_step_complete)
    register_event_handler("tooltipSeen", tutorial.handle_tooltip_seen)
    register_event_handler("completeOnboarding", tutorial.handle_complete_onboarding)

    print(f"Registered {len(_registry.list_events())} event handlers")


def register_all_events():
    """Register all game events with conditions for efficient filtering"""

    # Early childhood events (age 0-5)
    register_event("learnedWalk", learnedWalk, age_range=(0, 5))
    register_event("learningColors", learningColors, age_range=(2, 3))
    register_event("lostFirstTooth", lostFirstTooth, age_range=(5, 8))
    register_event("lostLastTooth", lostLastTooth, age_range=(10, 14))
    register_event("immunizations", dayEvents.immunizations, age_range=(0, 5))
    register_event("childhoodActivity", childhoodActivity, age_range=(3, 12))
    register_event("learnedBike", learnedBike, age_range=(4, 10))
    register_event("learnedSwim", learnedSwim, age_range=(4, 12))
    register_event("newFood", dayEvents.newFood, age_range=(0, 10))

    # School-age events (age 6-18)
    register_event("school", dayEvents.school, age_range=(6, 18))
    register_event("likeSchool", likeSchool, age_range=(6, 18))
    register_event("dropBooks", dropBooks, age_range=(6, 18))
    register_event("fieldTrip", fieldTrip, age_range=(6, 18))
    register_event("schoolAssembly", schoolAssembly, age_range=(6, 18))
    register_event("schoolFight", schoolFight, age_range=(11, 18))
    register_event("schoolLunch", schoolLunch, age_range=(6, 18))
    register_event("forgotCombo", forgotCombo, age_range=(11, 18))
    register_event("latetoSchool", latetoSchool, age_range=(6, 18))
    register_event("tiredinClass", tiredinClass, age_range=(6, 18))
    register_event("graduate5th", dayEvents.graduate5th, age_range=(10, 11))
    register_event("graduate8th", dayEvents.graduate8th, age_range=(13, 14))
    register_event("graduate12th", dayEvents.graduate12th, age_range=(17, 18))
    register_event("extracurricular", extracurricular, age_range=(6, 18))
    register_event("learnInstrument", learnInstrument, age_range=(6, 18))
    register_event("braces", braces, age_range=(11, 16))
    register_event("glasses", glasses, age_range=(6, 30))
    register_event("actTest", actTest, age_range=(15, 18))
    register_event("actTestTake", actTestTake, age_range=(15, 18))
    register_event("satTest", satTest, age_range=(15, 18))

    # Puberty and teen events (age 10-18)
    register_event("puberty", dayEvents.puberty, age_range=(10, 16))
    register_event("startedPeriod", startedPeriod, age_range=(10, 16))
    register_event("firstCrush", firstCrush, age_range=(11, 18))
    register_event("firstKiss", firstKiss, age_range=(12, 22))
    register_event("driversLessons", dayEvents.driversLessons, age_range=(15, 17))
    register_event("driversTest", dayEvents.driversTest, age_range=(15, 18))

    # Adolescence life events (age 11-18)
    register_event("groupProjectDrama", groupProjectDrama, age_range=(12, 18))
    register_event("voiceCracking", voiceCracking, age_range=(12, 14))
    register_event("bodySelfConsciousness", bodySelfConsciousness, age_range=(11, 14))
    register_event("curfewArgument", curfewArgument, age_range=(14, 17))
    register_event("growthSpurt", growthSpurt, age_range=(12, 15))
    register_event("embarrassingSituation", embarrassingSituation, age_range=(13, 17))
    register_event("sleepover", sleepover, age_range=(12, 15))
    register_event("socialMediaPressure", socialMediaPressure, age_range=(11, 14))
    register_event("fashionExperimentation", fashionExperimentation, age_range=(13, 17))
    register_event("learningToDrive", learningToDrive, age_range=(15, 16))

    # College events (age 17-25)
    register_event("chooseCollege", chooseCollege, age_range=(17, 18))
    register_event("chooseMajor", chooseMajor, age_range=(17, 22))
    register_event("college", dayEvents.college, age_range=(18, 25))
    register_event("collegeParty", dayEvents.collegeParty, age_range=(18, 25))
    register_event("collegeGreekLife", dayEvents.collegeGreekLife, age_range=(18, 22))
    register_event("collegeMissHome", dayEvents.collegeMissHome, age_range=(18, 22))
    register_event("collegeMinor", dayEvents.collegeMinor, age_range=(18, 22))
    register_event("collegeExtracurricular", collegeExtracurricular, age_range=(18, 25))

    # Employment events (age 16+)
    register_event("firstJob", firstJob, age_range=(16, 25))
    register_event("jobApplication", jobApplication, age_range=(16, 65))
    register_event("employeeOfTheMonth", employeeOfTheMonth, age_range=(16, 65), requires_job=True)

    # Relationship events (age 13+)
    register_event("playDate", playDate, age_range=(3, 12), requires_relationship=True)
    register_event("newFriend", newFriend, age_range=(5, 80))
    register_event("lowAffinity", lowAffinity, age_range=(5, 100), requires_relationship=True)
    register_event("dating_choice", dating_choice, age_range=(16, 40), requires_relationship=True)
    register_event("romanticDate", romanticDate, age_range=(16, 80), requires_relationship=True)
    register_event("marriage", marriage, age_range=(18, 60), requires_relationship=True)
    register_event("wedding", wedding, age_range=(18, 60), requires_relationship=True)
    register_event("positiveInteraction", dayEvents.positiveInteraction, age_range=(0, 100), requires_relationship=True)

    # Family events (age 18+)
    register_event("haveChild", haveChild, age_range=(18, 50), requires_relationship=True)
    register_event("pregnant", pregnant, age_range=(18, 50), requires_relationship=True)
    register_event("childBorn", childBorn, age_range=(18, 50), requires_relationship=True)
    register_event("childLearnedWalk", childLearnedWalk, age_range=(18, 80), requires_relationship=True)
    register_event("extendedFamily", dayEvents.extendedFamily, age_range=(0, 100), requires_relationship=True)

    # Adult events (age 18+)
    register_event("adultMissFriends", dayEvents.adultMissFriends, age_range=(18, 40))
    register_event("openbankAccount", openbankAccount, age_range=(16, 25))

    # Adulthood life events (age 18+)
    register_event("firstApartment", firstApartment, age_range=(18, 25))
    register_event("workLifeBalance", workLifeBalance, age_range=(25, 50), requires_job=True)
    register_event("forgotBirthdayCall", forgotBirthdayCall, age_range=(22, 65))
    register_event("friendsDrifting", friendsDrifting, age_range=(25, 40))
    register_event("unexpectedBill", unexpectedBill, age_range=(20, 65))
    register_event("promotionOpportunity", promotionOpportunity, age_range=(25, 55), requires_job=True)
    register_event("agingParent", agingParent, age_range=(35, 60), requires_relationship=True)
    register_event("careerChangeDesire", careerChangeDesire, age_range=(30, 50), requires_job=True)
    register_event("coworkerRivalry", coworkerRivalry, age_range=(25, 60), requires_job=True)
    register_event("divorceConsideration", divorceConsideration, age_range=(25, 65), requires_relationship=True)

    # Health and life events (any age)
    register_event("minorInjury", minorInjury, age_range=(3, 100))
    register_event("minorSickness", minorSickness, age_range=(0, 100))
    register_event("breakArm", breakArm, age_range=(5, 80))
    register_event("carCrash", carCrash, age_range=(16, 100))
    register_event("healthCondition", healthCondition, age_range=(0, 100))
    register_event("lowEnergyEvent", lowEnergyEvent, age_range=(5, 100))
    register_event("lowEnergyEvents", dayEvents.lowEnergyEvents, age_range=(5, 100))
    register_event("negativeHabitEvent", negativeHabitEvent, age_range=(10, 100))
    register_event("murderAttempt", dayEvents.murderAttempt, age_range=(10, 100), requires_relationship=True)
    register_event("funeral", dayEvents.funeral, age_range=(5, 100), requires_relationship=True)

    # Random events (any age)
    register_event("foundAPenny", foundAPenny, age_range=(5, 100))
    register_event("freeConcert", freeConcert, age_range=(13, 80))
    register_event("vendingMachine", vendingMachine, age_range=(10, 100))
    register_event("vacation", dayEvents.vacation, age_range=(0, 100))

    # Holiday events (day-specific, any age)
    register_event("birthday", dayEvents.birthday)
    register_event("newYear", dayEvents.newYear)
    register_event("christmas", dayEvents.christmas)
    register_event("thanksgiving", dayEvents.thanksgiving)
    register_event("blackfriday", dayEvents.blackfriday)
    register_event("independenceday", dayEvents.independenceday)

    # Dilemma events (age-specific)
    register_event("braceletDilemma", braceletDilemma, age_range=(6, 18))
    register_event("bullyDilemma", bullyDilemma, age_range=(6, 18), requires_relationship=True)

    # Conversation events (any age with relationships)
    register_event("conversationInit", conversationEvents.conversationInit, age_range=(5, 100), requires_relationship=True)

    # Tutorial events (age 0-5)
    register_event("firstConversation", tutorial_events.firstConversation, age_range=(0, 5))
    register_event("firstActivityChoice", tutorial_events.firstActivityChoice, age_range=(0, 5))
    register_event("tutorialComplete", tutorial_events.tutorialComplete, age_range=(0, 5))

    # Test events (for development)
    register_event("oneTimeEventTest", oneTimeEventTest)

    logger.info(f"Registered {event_count()} game events in event registry")
    print(f"Registered {event_count()} game events in event registry")
