#!/usr/bin/env python

"""
Base Event Classes and Helper Functions
Extracted from events.py for use across all event modules

Contains:
- Event class definitions (questionEvent, messageEvent, timeEvent, dilemmaClass, answerOption)
- Helper functions (messageFunction, questionFunction)
"""

import random
import math
import asyncio
import os
from config import config


class questionEvent:
    def __init__(self):
        self.query = ""
        self.answers = [answerOption("Yes"),answerOption("No")]
        self.type = 'questionEvent'
        self.characters = []      # NEW
        self.image = ""           # NEW


class messageEvent:
    def __init__(self):
        self.id = ""
        self.date = ""
        self.hour = ""
        self.type = 'messageEvent'
        self.energyCost = 0
        self.diamondCost = 0
        self.moneyCost = 0
        self.affinityChange = 0
        self.message = ""
        self.title = ""
        self.image = ""
        self.characters = []


class timeEvent:
    def __init__(self):
        self.type = 'timeEvent'


class dilemmaClass:
    def __init__(self,fname,answerOptions):
        self.type = 'dilemma'
        self.function = fname
        self.answer = None
        self.answerOptions = answerOptions
        self.step = 2


class answerOption:
    def __init__(self,option,data="",energyCost = 0,diamondCost = 0, moneyCost = 0):
        self.option = option
        self.data = data
        self.id = data+option
        self.energyCost = energyCost
        self.diamondCost = diamondCost
        self.moneyCost = moneyCost


def messageFunction(fname,message,player=False,check=False,title="",image="",energyCost = 0,diamondCost = 0, moneyCost = 0,affinityChange = 0,characters=None):
    if (check):
        m = messageEvent()
        m.id = fname
        m.message = message
        m.date = player.date
        m.hour = player.hourOfDay
        m.title = title
        m.image = image
        m.energyCost = energyCost
        m.diamondCost = diamondCost
        m.moneyCost = moneyCost
        m.affinityChange = affinityChange

        # Serialize characters to reduce payload size
        if characters:
            m.characters = [
                {
                    'id': char.id,
                    'firstname': char.firstname,
                    'lastname': char.lastname,
                    'image': char.image
                }
                for char in characters
            ]

        return m


def questionFunction(fname,message,player=False,check=False,answerOptions=False,characters=None,image=""):
    if (check):
        player.previousGameSpeed = player.gameSpeed
        player.gameSpeed = config.SPEED_QUESTION_PAUSE
        print('question!' + fname)
        m = questionEvent()
        m.id = fname
        if (hasattr(message,'message')):
            m.message = message.message
            m.objectId = message.id
        else:
            m.message = message
        if (answerOptions):
            if (type(answerOptions[0]) == str):
                # create answer option classes with numeric ids
                answerOptions = [answerOption(option,str(i)) for i,option in enumerate(answerOptions)]
            m.answers = answerOptions

        # Add characters and image
        if characters:
            m.characters = [
                {
                    'id': char.id,
                    'firstname': char.firstname,
                    'lastname': char.lastname,
                    'image': char.image
                }
                for char in characters
            ]

        m.image = image

        return m


# Export all classes and functions
__all__ = [
    'questionEvent',
    'messageEvent',
    'timeEvent',
    'dilemmaClass',
    'answerOption',
    'messageFunction',
    'questionFunction',
]
