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

class AttributeType(enum.Enum):
    ACTUAL = "Actual"
    TARGET = "Target"
    MIN_SET = "MinSet"
    MAX_SET = "MaxSet"

class MutabilityType(enum.Enum):
    READ_ONLY = "ReadOnly"
    WRITE_ONLY = "WriteOnly"
    READ_WRITE = "ReadWrite"

class DataType(enum.Enum):
    STRING = "string"
    DECIMAL = "decimal"
    INTEGER = "integer"
    DATETIME = "dateTime"
    BOOLEAN = "boolean"
    OPTION_LIST = "OptionList"
    SEQUENCE_LIST = "SequenceList"
    MEMBER_LIST = "MemberList"

class SetVariableStatusType(enum.Enum):
    ACCEPTED = "Accepted"
    REJECTED = "Rejected"
    UNKNOWN_COMPONENT = "UnknownComponent"
    NOT_SUPPORTED_ATTRIBUTE_TYPE = "NotSupportedAttributeType"
    REBOOT_REQUIRED = "RebootRequired"

class ChargepointVariable(BaseModel):
    id: UUID
    name: str
    type: AttributeType
    value: Optional[str] = None
    mutability: MutabilityType
    persistent: bool
    constant: bool
    unit: Optional[str] = None
    data_type: Optional[DataType] = None
    min_limit: Optional[Decimal] = None
    max_limit: Optional[Decimal] = None
    values_list: Optional[str] = None
    component_name: str
    component_instance: Optional[str] = None
    evse: Optional[int] = None
    connector_id: Optional[int] = None

    class Config:
        from_attributes = True

class ChargepointVariableUpdate(BaseModel):
    value: str

class ChargepointVariableResponse(BaseModel):
    status: SetVariableStatusType