from pydantic import BaseModel, Field, field_validator
from typing import Optional


class LaserParameters(BaseModel):
    """Model for laser control parameters"""

    # Laser 1 Temperature parameters
    min_temp_1: float = Field(..., ge=-1, le=45, description="Минимальная температура лазера 1 (C)")
    max_temp_1: float = Field(..., ge=-1, le=45, description="Максимальная температура лазера 1 (C)")
    delta_temp_1: float = Field(..., ge=0.05, le=1.0, description="Шаг дискретизации температуры лазера 1 (C)")

    # Laser 1 Current parameters
    min_current_1: float = Field(..., ge=15, le=70, description="Минимальный ток лазера 1 (мА)")
    max_current_1: float = Field(..., ge=15, le=70, description="Максимальный ток лазера 1 (мА)")
    delta_current_1: float = Field(..., ge=0.002, le=0.5, description="Шаг дискретизации тока лазера 1 (мА)")

    # Laser 2 Temperature parameters
    min_temp_2: float = Field(..., ge=-1, le=45, description="Минимальная температура лазера 2 (C)")
    max_temp_2: float = Field(..., ge=-1, le=45, description="Максимальная температура лазера 2 (C)")
    delta_temp_2: float = Field(..., ge=0.05, le=1.0, description="Шаг дискретизации температуры лазера 2 (C)")

    # Laser 2 Current parameters
    min_current_2: float = Field(..., ge=15, le=60, description="Минимальный ток лазера 2 (мА)")
    max_current_2: float = Field(..., ge=15, le=60, description="Максимальный ток лазера 2 (мА)")
    delta_current_2: float = Field(..., ge=0.002, le=0.5, description="Шаг дискретизации тока лазера 2 (мА)")

    # Time parameters
    delta_time: int = Field(..., ge=20, le=100, description="Шаг дискретизации времени (мкс), шаг 10")
    tau: int = Field(..., ge=3, le=10, description="Время задержки (мс)")

    # Enable flags for different control modes
    enable_t1: bool = Field(False, description="Включить изменение температуры лазера 1")
    enable_t2: bool = Field(False, description="Включить изменение температуры лазера 2")
    enable_c1: bool = Field(False, description="Включить изменение тока лазера 1")
    enable_c2: bool = Field(False, description="Включить изменение тока лазера 2")

    @field_validator('delta_time')
    @classmethod
    def validate_delta_time(cls, v):
        if v % 10 != 0:
            raise ValueError('delta_time должен быть кратен 10 мкс')
        return v

    @field_validator('max_temp_1')
    @classmethod
    def validate_temp_1_range(cls, v, info):
        if 'min_temp_1' in info.data and v < info.data['min_temp_1']:
            raise ValueError('max_temp_1 должен быть больше min_temp_1')
        return v

    @field_validator('max_temp_2')
    @classmethod
    def validate_temp_2_range(cls, v, info):
        if 'min_temp_2' in info.data and v < info.data['min_temp_2']:
            raise ValueError('max_temp_2 должен быть больше min_temp_2')
        return v

    @field_validator('max_current_1')
    @classmethod
    def validate_current_1_range(cls, v, info):
        if 'min_current_1' in info.data and v < info.data['min_current_1']:
            raise ValueError('max_current_1 должен быть больше min_current_1')
        return v

    @field_validator('max_current_2')
    @classmethod
    def validate_current_2_range(cls, v, info):
        if 'min_current_2' in info.data and v < info.data['min_current_2']:
            raise ValueError('max_current_2 должен быть больше min_current_2')
        return v


class LaserStatus(BaseModel):
    """Model for laser status response"""

    temp_1: Optional[float] = Field(None, description="Текущая температура лазера 1 (C)")
    temp_2: Optional[float] = Field(None, description="Текущая температура лазера 2 (C)")
    current_1: Optional[float] = Field(None, description="Текущий ток фотодиода 1 (мА)")
    current_2: Optional[float] = Field(None, description="Текущий ток фотодиода 2 (мА)")
    temp_ext_1: Optional[float] = Field(None, description="Температура внешнего термистора 1 (C)")
    temp_ext_2: Optional[float] = Field(None, description="Температура внешнего термистора 2 (C)")
    voltage_3v3: Optional[float] = Field(None, description="Напряжение 3V3 (В)")
    voltage_5v1: Optional[float] = Field(None, description="Напряжение 5V1 (В)")
    voltage_5v2: Optional[float] = Field(None, description="Напряжение 5V2 (В)")
    voltage_7v0: Optional[float] = Field(None, description="Напряжение 7V0 (В)")
    is_running: bool = Field(False, description="Запущен ли цикл измерений")
    connected: bool = Field(False, description="Подключено ли устройство")


class LaserStartResponse(BaseModel):
    """Response model for laser start endpoint"""

    success: bool = Field(..., description="Успешность операции")
    message: str = Field(..., description="Сообщение о результате")
    parameters: Optional[LaserParameters] = Field(None, description="Примененные параметры")


class LaserStopResponse(BaseModel):
    """Response model for laser stop endpoint"""

    success: bool = Field(..., description="Успешность операции")
    message: str = Field(..., description="Сообщение о результате")


class ManualLaserParameters(BaseModel):
    """Model for manual laser control with simple parameters"""

    t1: float = Field(..., ge=-1, le=45, description="Температура лазера 1 (°C)")
    t2: float = Field(..., ge=-1, le=45, description="Температура лазера 2 (°C)")
    i1: float = Field(..., ge=15, le=70, description="Ток лазера 1 (мА)")
    i2: float = Field(..., ge=15, le=60, description="Ток лазера 2 (мА)")


class ManualLaserStartResponse(BaseModel):
    """Response model for manual laser start endpoint"""

    success: bool = Field(..., description="Успешность операции")
    message: str = Field(..., description="Сообщение о результате")
    parameters: Optional[ManualLaserParameters] = Field(None, description="Примененные параметры")
