# provides:
#   switch
#   automation
#   binary_sensor
#   sensor
#   input_select
#   timer
let
  inherit (import ../lib) zigbee;
  prefix = zigbee.prefix;
in
{
  services.home-assistant.config = {
    sensor =

      [
      # Sensor for monitoring the bridge state
      {
        platform = "mqtt";
        name = "Zigbee2mqtt Bridge state";
        state_topic = "${prefix}/bridge/state";
        icon = "mdi:router-wireless";
      }
      # Sensor for Showing the Zigbee2mqtt Version
      {
        platform = "mqtt";
        name = "Zigbee2mqtt Version";
        state_topic = "${prefix}/bridge/config";
        value_template = "{{ value_json.version }}";
        icon = "mdi:zigbee";
      }
      # Sensor for Showing the Coordinator Version
      {
        platform = "mqtt";
        name = "Coordinator Version";
        state_topic = "${prefix}/bridge/config";
        value_template = "{{ value_json.coordinator }}";
        icon = "mdi:chip";
      }
    ];
    switch = [
    {
      platform = "mqtt";
      name = "Zigbee2mqtt Main join";
      state_topic = "${prefix}/bridge/config/permit_join";
      command_topic = "${prefix}/bridge/config/permit_join";
      payload_on = "true";
      payload_off = "false";
    }
    ];
    automation = [
      {
        alias = "Zigbee2mqtt Log Level";
        initial_state = "on";
        trigger = {
          platform = "state";
          entity_id = "input_select.zigbee2mqtt_log_level";
        };
        action = [
          {
            service =  "mqtt.publish";
            data = {
              payload_template = "{{ states('input_select.zigbee2mqtt_log_level') }}";
              topic =  "${prefix}/bridge/config/log_level";
            };
          }
        ];
      }
  # Automation to start timer when enable join is turned on
      {
        id = "zigbee_join_enabled";
        alias = "Zigbee Join Enabled";
        trigger =
        {
          platform = "state";
          entity_id = "switch.zigbee2mqtt_main_join";
          to = "on";
        };
        action =
        {
          service = "timer.start";
          entity_id = "timer.zigbee_permit_join";
        };
      }
  #  # Automation to stop timer when switch turned off and turn off switch when timer finished
      {
        id = "zigbee_join_disabled";
        alias = "Zigbee Join Disabled";
        trigger = [
          {
            platform = "event";
            event_type = "timer.finished";
            event_data.entity_id = "timer.zigbee_permit_join";
          }
          {
            platform = "state";
            entity_id = "switch.zigbee2mqtt_main_join";
            to = "off";
          }
        ];
        action = [
          { service = "timer.cancel";
            data.entity_id = "timer.zigbee_permit_join";
          }
          { service = "switch.turn_off";
            entity_id = "switch.zigbee2mqtt_main_join";
          }
        ];
      }
    ];
    input_select.zigbee2mqtt_log_level =
    {
      name = "Zigbee2mqtt Log Level";
      options = [
        "debug"
        "info"
        "warn"
        "error"
      ];
      initial = "info";
      icon = "mdi:format-list-bulleted";
    };

    timer.zigbee_permit_join =
    {
      name = "Zigbee Time remaining";
      duration = 120;
    };
  };
}