from datetime import datetime
from decimal import Decimal
import enum
from typing import Optional
from uuid import UUID
from pydantic import BaseModel

class PhaseType(enum.Enum):
    L1 = "L1"
    L2 = "L2"
    L3 = "L3"
    N = "N"
    L1_N = "L1-N"
    L2_N = "L2-N"
    L3_N = "L3-N"
    L1_L2 = "L1-L2"
    L2_L3 = "L2-L3"
    L3_L1 = "L3-L1"

class Measurand(enum.Enum):
    CURRENT_EXPORT = "Current.Export"
    CURRENT_IMPORT = "Current.Import"
    CURRENT_OFFERED = "Current.Offered"
    ENERGY_ACTIVE_NET = "Energy.Active.Net"
    ENERGY_ACTIVE_EXPORT_REGISTER = "Energy.Active.Export.Register"
    ENERGY_ACTIVE_IMPORT_REGISTER = "Energy.Active.Import.Register"
    ENERGY_ACTIVE_EXPORT_INTERVAL = "Energy.Active.Export.Interval"
    ENERGY_ACTIVE_IMPORT_INTERVAL = "Energy.Active.Import.Interval"
    ENERGY_REACTIVE_NET = "Energy.Reactive.Net"
    ENERGY_REACTIVE_EXPORT_REGISTER = "Energy.Reactive.Export.Register"
    ENERGY_REACTIVE_IMPORT_REGISTER = "Energy.Reactive.Import.Register"
    ENERGY_REACTIVE_EXPORT_INTERVAL = "Energy.Reactive.Export.Interval"
    ENERGY_REACTIVE_IMPORT_INTERVAL = "Energy.Reactive.Import.Interval"
    ENERGY_APPARENT_NET = "Energy.Apparent.Net"
    ENERGY_APPARENT_IMPORT = "Energy.Apparent.Import"
    ENERGY_APPARENT_EXPORT = "Energy.Apparent.Export"
    FREQUENCY = "Frequency"
    POWER_ACTIVE_EXPORT = "Power.Active.Export"
    POWER_ACTIVE_IMPORT = "Power.Active.Import"
    POWER_FACTOR = "Power.Factor"
    POWER_OFFERED = "Power.Offered"
    POWER_REACTIVE_EXPORT = "Power.Reactive.Export"
    POWER_REACTIVE_IMPORT = "Power.Reactive.Import"
    SOC = "SoC"
    VOLTAGE = "Voltage"

class MeterValue(BaseModel):
    id: UUID
    timestamp: datetime
    measurand: Measurand
    phase_type: Optional[PhaseType] = None
    unit: Optional[str] = None
    value: Decimal
    transaction_id: str

    class Config:
        from_attributes = True