{
  config,
  lib,
  pkgs,
  namespace,
  ...
}:
with lib;
let
  inherit (lib.${namespace}) mkOpt;
  cfg = config.${namespace}.services.home-assistant.automation;

    automationToYaml = lscfg: ''
    - id: '${toString lscfg.id}'
      alias: ${lscfg.alias}
      description: '${lscfg.description}'
      triggers:
      - device_id: ${lscfg.mqttDeviceId}
        domain: mqtt
        id: on press
        subtype: on-press
        trigger: device
        type: action
      - device_id: ${lscfg.mqttDeviceId}
        domain: mqtt
        id: off press
        subtype: off-press
        trigger: device
        type: action
      - device_id: ${lscfg.mqttDeviceId}
        domain: mqtt
        id: up press
        subtype: up-press
        trigger: device
        type: action
      - device_id: ${lscfg.mqttDeviceId}
        domain: mqtt
        id: down press
        subtype: down-press
        trigger: device
        type: action
      - device_id: ${lscfg.mqttDeviceId}
        domain: mqtt
        id: on hold
        subtype: on-hold
        trigger: device
        type: action
      conditions: []
      actions:
      - choose:
        - conditions:
          - condition: trigger
            id:
            - on press
          sequence:
          - action: light.turn_on
            data:
              brightness_pct: ${toString lscfg.brightnessPercent}
              kelvin: ${toString lscfg.lightTemperature}
              transition: ${toString lscfg.transitionTime}
            metadata: {}
            target:
              entity_id:
              - ${lscfg.lightEntityId}
        - conditions:
          - condition: trigger
            id:
            - off press
          sequence:
          - action: light.turn_off
            data:
              transition: ${toString lscfg.transitionTime}
            metadata: {}
            target:
              entity_id:
              - ${lscfg.lightEntityId}
        - conditions:
          - condition: trigger
            id:
            - up press
          sequence:
          - action: light.turn_on
            data:
              brightness_step_pct: ${toString lscfg.brightnessStepPercent}
            metadata: {}
            target:
              entity_id: ${lscfg.lightEntityId}
        - conditions:
          - condition: trigger
            id:
            - down press
          sequence:
          - action: light.turn_on
            data:
              brightness_step_pct: ${toString (-lscfg.brightnessStepPercent)}
            metadata: {}
            target:
              entity_id: ${lscfg.lightEntityId}
        - conditions:
          - condition: trigger
            id:
            - on hold
          sequence:
          - action: light.turn_on
            data:
              brightness_pct: 100
              rgb_color:
              - 255
              - 0
              - 0
              transition: 0
            metadata: {}
            target:
              entity_id:
              - ${lscfg.lightEntityId}
      mode: single
  '';
  
  lightswitchAutomations = concatStringsSep "\n" (mapAttrsToList (_: automationToYaml) cfg.lightswitch);
in
{
  options.${namespace}.services.home-assistant.automation = {
    lightswitch =
      mkOpt
        (types.attrsOf (
          types.submodule {
            options = {
              id = mkOpt types.int 0 "Automation Id";
              alias = mkOpt types.str "" "Alias/Friendly Name";
              description = mkOpt types.str "" "Automation Description";
              mqttDeviceId = mkOpt types.str "" "mqtt device id of the sitch";
              lightEntityId = mkOpt types.str "" "home assistant entity id for the lights";
              transitionTime = mkOpt types.int 2 "light transition time in seconds";
              brightnessPercent = mkOpt types.int 100 "brightness percentage when turned on";
              lightTemperature = mkOpt types.int 6000 "light temperature when turned on";
              brightnessStepPercent = mkOpt types.int 10 "dimmer step in brightness percent";
            };
          }
        ))
        { }
        "lightswitch automations";
  };

  config = {
    environment.etc."lightswitch-automations.yaml".source = 
      yamlFormat.generate "lightswitch-automations.yaml" lightswitchAutomations;
  };
}
