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

class TransactionStatus(enum.Enum):
    ONGOING = "ongoing"
    ENDED = "ended"

class TransactionEventTriggerReason(enum.Enum):
    AUTHORIZED = "Authorized"
    CABLE_PLUGGED_IN = "CablePluggedIn"
    CHARGING_RATE_CHANGED = "ChargingRateChanged"
    CHARGING_STATE_CHANGED = "ChargingStateChanged"
    DEAUTHORIZED = "Deauthorized"
    ENERGY_LIMIT_REACHED = "EnergyLimitReached"
    EV_COMMUNICATION_LOST = "EVCommunicationLost"
    EV_CONNECT_TIMEOUT = "EVConnectTimeout"
    METER_VALUE_CLOCK = "MeterValueClock"
    METER_VALUE_PERIODIC = "MeterValuePeriodic"
    TIME_LIMIT_REACHED = "TimeLimitReached"
    TRIGGER = "Trigger"
    UNLOCK_COMMAND = "UnlockCommand"
    STOP_AUTHORIZED = "StopAuthorized"
    EV_DEPARTED = "EVDeparted"
    EV_DETECTED = "EVDetected"
    REMOTE_STOP = "RemoteStop"
    REMOTE_START = "RemoteStart"
    ABNORMAL_CONDITION = "AbnormalCondition"
    SIGNED_DATA_RECEIVED = "SignedDataReceived"
    RESET_COMMAND = "ResetCommand"

class RemoteTransactionStartStopStatus(enum.Enum):
    ACCEPTED = "Accepted"
    REJECTED = "Rejected"

class Transaction(BaseModel):
    id: str
    status: TransactionStatus
    started_at: datetime
    ended_at: Optional[datetime] = None
    meter_start: Decimal
    meter_end: Optional[Decimal] = None
    end_reason: Optional[TransactionEventTriggerReason] = None
    price: Decimal
    user_id: Optional[UUID] = None
    chargepoint_id: UUID

    class Config:
        from_attributes = True

class RemoteTransactionStartStopResponse(BaseModel):
    status: RemoteTransactionStartStopStatus