# -*- coding: utf-8 -*-

from enum import Enum
from typing import List, Optional

import numpy as np
from pydantic import BaseModel

from app.schemas.space import Space


class AirValveSpeed(float, Enum):
    off = 0.0
    low = 1.0
    medium = 2.0
    high = 3.0


class VRFMode(str, Enum):
    cooling = "cooling"
    heating = "heating"
    ventilation = "ventilation"
    unknown = "unknown"


class BaseEquipment(BaseModel):
    id: Optional[str]
    running_status: Optional[bool]
    in_cloud_status: Optional[bool]
    on_time: Optional[str]
    off_time: Optional[str]
    equip_switch_set: Optional[bool]


class FCU(BaseEquipment):
    work_mode: Optional[int]
    air_valve_speed: Optional[AirValveSpeed] = AirValveSpeed.off
    air_valve_speed_set: Optional[AirValveSpeed] = AirValveSpeed.off
    recommended_speed: Optional[AirValveSpeed] = AirValveSpeed.off
    space: Optional[Space]
    setting_temperature: Optional[float]
    supply_air_temperature: Optional[float]
    water_out_temperature: Optional[float]
    water_in_temperature: Optional[float]
    speed_limit: Optional[AirValveSpeed] = AirValveSpeed.high


class VAVBox(BaseEquipment):
    spaces: Optional[List[Space]]
    supply_air_temperature: Optional[float] = np.NAN
    supply_air_flow: Optional[float] = np.NAN
    supply_air_flow_set: Optional[float] = np.NAN
    supply_air_flow_lower_limit: Optional[float] = np.NAN
    supply_air_flow_upper_limit: Optional[float] = np.NAN
    recommended_supply_air_flow: Optional[float] = np.NAN
    valve_opening: Optional[float] = np.NAN
    setting_temperature: Optional[float] = 0.0
    virtual_realtime_temperature: Optional[float] = np.NAN
    virtual_target_temperature: Optional[float] = np.NAN


class AHU(BaseEquipment):
    supply_air_temperature: Optional[float]
    supply_air_temperature_set: Optional[float]
    return_air_temperature: Optional[float]
    return_air_temperature_set: Optional[float]
    freq: Optional[float]
    freq_set: Optional[float]
    fan_freq_upper_limit_set: Optional[float]
    fan_freq_lower_limit_set: Optional[float]


class VentilationFan(BaseEquipment):
    pass


class PAU(BaseEquipment):
    pass


class VRF(BaseEquipment):
    equip_switch_set: Optional[str]
    work_mode: Optional[VRFMode]
    speed: Optional[str]
    speed_set: Optional[str]
    current_temperature_set: Optional[float]
    temperature_set: Optional[float]
    mode_set: Optional[str]
    return_air_temp: Optional[float]


class ASHP(BaseEquipment):
    out_temp_15min: List[float]
    out_temp_set_15min: List[float]
    out_temp_30min: List[float]
    out_temp_set_30min: List[float]
    out_temp_set: Optional[float]
    iplr_15min: List[float]
    iplr_30min: List[float]