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

from enum import Enum

from fastapi import APIRouter, Query
from loguru import logger

from app.controllers.equipment.fcu import get_fcu_control_result
from app.controllers.equipment.vav import get_vav_control_result
from app.models.schemas.equipment import EquipmentControlResponse, EquipmentControlRequest
from app.utils.date import get_time_str
from app.utils.math import round_half_up


class EquipmentName(str, Enum):
    FCU = 'ACATFC'
    VAV = 'ACATVA'


router = APIRouter()


@router.get('/control', response_model=EquipmentControlResponse, tags=['equipment'])
async def get_equipment_command(
        projectId: str = Query(..., max_length=50, regex='^Pj'),
        equipId: str = Query(..., max_length=50, regex='^Eq'),
        equipType: EquipmentName = Query(...),
        method: int = Query(3),
):
    if equipType.value == EquipmentName.FCU:
        fcu = await get_fcu_control_result(projectId, equipId)
        output = {
            'RunStatus': 1 if fcu.running_status else 0,
            'WorkModeSet': 3,
            'FanGearSet': fcu.air_valve_speed.value,
            'IndoorAirTempSet': fcu.setting_temperature
        }
    elif equipType.value == EquipmentName.VAV:
        vav = await get_vav_control_result(projectId, equipId)
        output = {
            'SupplyAirFlowSet': vav.supply_air_flow_set
        }
    else:
        output = {}

    response = {
        'projectId': projectId,
        'equipId': equipId,
        'time': get_time_str(),
        'output': output
    }
    return response


@router.post('/control', response_model=EquipmentControlResponse, tags=['equipment'])
async def get_equipment_command_v2(equipment_control_info: EquipmentControlRequest):
    if equipment_control_info.equipType == EquipmentName.FCU:
        fcu = await get_fcu_control_result(equipment_control_info.projectId, equipment_control_info.equipId)
        output = {
            'RunStatus': 1 if fcu.running_status else 0,
            'WorkModeSet': 3,
            'FanGearSet': fcu.air_valve_speed.value,
            'IndoorAirTempSet': int(round_half_up(fcu.setting_temperature, 1) * 10)
        }
    elif equipment_control_info.equipType == EquipmentName.VAV:
        vav = await get_vav_control_result(equipment_control_info.projectId, equipment_control_info.equipId)
        output = {
            'SupplyAirFlowSet': vav.supply_air_flow_set
        }
    else:
        output = {}

    response = {
        'projectId': equipment_control_info.projectId,
        'equipId': equipment_control_info.equipId,
        'time': get_time_str(),
        'output': output
    }
    logger.info(response)
    return response