import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import spi
from esphome.const import CONF_ID, CONF_DATA_RATE, CONF_MODE

DEPENDENCIES = ["spi"]
CODEOWNERS = ["@clydebarrow"]

MULTI_CONF = True
spi_device_ns = cg.esphome_ns.namespace("spi_device")

spi_device = spi_device_ns.class_("SPIDeviceComponent", cg.Component, spi.SPIDevice)

Mode = spi.spi_ns.enum("SPIMode")
MODES = {
    "0": Mode.MODE0,
    "1": Mode.MODE1,
    "2": Mode.MODE2,
    "3": Mode.MODE3,
    "MODE0": Mode.MODE0,
    "MODE1": Mode.MODE1,
    "MODE2": Mode.MODE2,
    "MODE3": Mode.MODE3,
}

BitOrder = spi.spi_ns.enum("SPIBitOrder")
ORDERS = {
    "msb_first": BitOrder.BIT_ORDER_MSB_FIRST,
    "lsb_first": BitOrder.BIT_ORDER_LSB_FIRST,
}
CONF_BIT_ORDER = "bit_order"

CONFIG_SCHEMA = cv.Schema(
    {
        cv.GenerateID(CONF_ID): cv.declare_id(spi_device),
        cv.Optional(CONF_DATA_RATE, default="1MHz"): spi.SPI_DATA_RATE_SCHEMA,
        cv.Optional(CONF_BIT_ORDER, default="msb_first"): cv.enum(ORDERS, lower=True),
        cv.Optional(CONF_MODE, default="0"): cv.enum(MODES, upper=True),
    }
).extend(spi.spi_device_schema(False))


async def to_code(config):
    var = cg.new_Pvariable(config[CONF_ID])
    await cg.register_component(var, config)
    cg.add(var.set_data_rate(config[CONF_DATA_RATE]))
    cg.add(var.set_mode(config[CONF_MODE]))
    cg.add(var.set_bit_order(config[CONF_BIT_ORDER]))
    await spi.register_spi_device(var, config)
