from esphome import automation
from esphome.automation import maybe_simple_id
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.const import (
    CONF_ID,
    CONF_ON_STATE,
    CONF_STATE,
    CONF_TRIGGER_ID,
)

empty_automation_ns = cg.esphome_ns.namespace("empty_automation")
EmptyAutomation = empty_automation_ns.class_("EmptyAutomation", cg.Component)
# Actions
EmptyAutomationSetStateAction = empty_automation_ns.class_(
    "EmptyAutomationSetStateAction", automation.Action
)
# Conditions
EmptyAutomationCondition = empty_automation_ns.class_(
    "EmptyAutomationCondition", automation.Condition
)
# Triggers
StateTrigger = empty_automation_ns.class_(
    "StateTrigger", automation.Trigger.template(bool)
)


CONFIG_SCHEMA = cv.Schema(
    {
        cv.GenerateID(): cv.declare_id(EmptyAutomation),
        cv.Optional(CONF_ON_STATE): automation.validate_automation(
            {
                cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(StateTrigger),
            }
        ),
    }
).extend(cv.COMPONENT_SCHEMA)


EMPTY_AUTOMATION_ACTION_SCHEMA = cv.maybe_simple_value(
    {
        cv.Required(CONF_ID): cv.use_id(EmptyAutomation),
        cv.Required(CONF_STATE): cv.boolean,
    },
    key=CONF_STATE,
)


EMPTY_AUTOMATION_CONDITION_SCHEMA = maybe_simple_id(
    {
        cv.Required(CONF_ID): cv.use_id(EmptyAutomation),
    }
)


@automation.register_action(
    "empty_automation.set_state",
    EmptyAutomationSetStateAction,
    EMPTY_AUTOMATION_ACTION_SCHEMA,
)
async def empty_automation_set_state_to_code(config, action_id, template_arg, args):
    paren = await cg.get_variable(config[CONF_ID])
    var = cg.new_Pvariable(action_id, template_arg, paren)
    cg.add(var.set_state(config[CONF_STATE]))
    return var


@automation.register_condition(
    "empty_automation.component_on",
    EmptyAutomationCondition,
    EMPTY_AUTOMATION_CONDITION_SCHEMA,
)
async def empty_automation_component_on_to_code(
    config, condition_id, template_arg, args
):
    paren = await cg.get_variable(config[CONF_ID])
    return cg.new_Pvariable(condition_id, template_arg, paren, True)


@automation.register_condition(
    "empty_automation.component_off",
    EmptyAutomationCondition,
    EMPTY_AUTOMATION_CONDITION_SCHEMA,
)
async def empty_automation_component_off_to_code(
    config, condition_id, template_arg, args
):
    paren = await cg.get_variable(config[CONF_ID])
    return cg.new_Pvariable(condition_id, template_arg, paren, False)


async def to_code(config):
    var = cg.new_Pvariable(config[CONF_ID])
    await cg.register_component(var, config)

    for conf in config.get(CONF_ON_STATE, []):
        trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
        await automation.build_automation(trigger, [(bool, "x")], conf)
