import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import sensor, uart
from esphome.const import (
    CONF_DURATION,
    CONF_TEMPERATURE,
    DEVICE_CLASS_DURATION,
    DEVICE_CLASS_SPEED,
    DEVICE_CLASS_TEMPERATURE,
    STATE_CLASS_MEASUREMENT,
    STATE_CLASS_TOTAL_INCREASING,
    UNIT_CELSIUS,
    UNIT_HOUR,
    UNIT_REVOLUTIONS_PER_MINUTE,
)

from . import CONF_OPTOMA_RS232_ID, optoma_ns, OptomaRS232Component

DEPENDENCIES = ["optoma_rs232"]

CONF_FAN_SPEED = "fan_speed"
CONF_LAMP_TIME = "lamp_hours"

CONFIG_SCHEMA = (
    cv.Schema({
        cv.GenerateID(CONF_OPTOMA_RS232_ID): cv.use_id(OptomaRS232Component),
        cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
            unit_of_measurement=UNIT_CELSIUS,
            accuracy_decimals=1,
            device_class=DEVICE_CLASS_TEMPERATURE,
            state_class=STATE_CLASS_MEASUREMENT,
        ),
        cv.Optional(CONF_LAMP_TIME): sensor.sensor_schema(
            unit_of_measurement=UNIT_HOUR,
            accuracy_decimals=0,
            device_class=DEVICE_CLASS_DURATION,
            state_class=STATE_CLASS_TOTAL_INCREASING,
        ),
        cv.Optional(CONF_FAN_SPEED): sensor.sensor_schema(
            unit_of_measurement=UNIT_REVOLUTIONS_PER_MINUTE,
            accuracy_decimals=0,
            device_class=DEVICE_CLASS_SPEED,
            state_class=STATE_CLASS_MEASUREMENT,
        ),
    })
    .extend(
        cv.polling_component_schema("10s"),
        uart.UART_DEVICE_SCHEMA
    )
)


async def to_code(config):
    hub = await cg.get_variable(config[CONF_OPTOMA_RS232_ID])

    if cfg := config.get(CONF_TEMPERATURE):
        sens = await sensor.new_sensor(cfg)
        cg.add(hub.set_beamer_temp_sensor(sens))
    if cfg := config.get(CONF_DURATION):
        sens = await sensor.new_sensor(cfg)
        cg.add(hub.set_beamer_lamp_time_sensor(sens))
    if cfg := config.get(CONF_FAN_SPEED):
        sens = await sensor.new_sensor(cfg)
        cg.add(hub.set_beamer_fan1_sensor(sens))
    # if cfg := config.get():
    #     sens = await sensor.new_sensor(cfg)
    #     cg.add(hub.set_beamer_color_mode_sensor(sens))