{
  lib,
  config,
  ...
}: let
  configDir = "/var/lib/hass";
in {
  options.host.home-assistant = {
    enable = lib.mkEnableOption "should home-assistant be enabled on this computer";
    subdomain = lib.mkOption {
      type = lib.types.str;
      description = "subdomain of base domain that home-assistant will be hosted at";
      default = "home-assistant";
    };
  };

  config = lib.mkIf config.host.home-assistant.enable (lib.mkMerge [
    {
      systemd.tmpfiles.rules = [
        "f ${config.services.home-assistant.configDir}/automations.yaml 0755 hass hass"
      ];
      services.home-assistant = {
        enable = true;
        configDir = configDir;
        extraComponents = [
          "met"
          "radio_browser"
          "isal"
          "zha"
          "jellyfin"
          "webostv"
          "tailscale"
          "syncthing"
          "sonos"
          "analytics_insights"
          "unifi"
          "openweathermap"
        ];
        config = {
          http = {
            server_port = 8082;
            use_x_forwarded_for = true;
            trusted_proxies = ["127.0.0.1" "::1"];
            ip_ban_enabled = true;
            login_attempts_threshold = 10;
          };
          # recorder.db_url = "postgresql://@/${db_user}";
          "automation manual" = [];
          "automation ui" = "!include automations.yaml";
        };
        extraPackages = python3Packages:
          with python3Packages; [
            hassil
            numpy
            gtts
          ];
      };
      host = {
        reverse_proxy.subdomains.${config.host.home-assistant.subdomain} = {
          target = "http://localhost:${toString config.services.home-assistant.config.http.server_port}";

          websockets.enable = true;
          forwardHeaders.enable = true;

          extraConfig = ''
            add_header Upgrade $http_upgrade;
            add_header Connection \"upgrade\";

            proxy_buffering off;

            proxy_read_timeout 90;
          '';
        };
      };
    }
    (lib.mkIf config.host.impermanence.enable {
      assertions = [
        {
          assertion = config.services.home-assistant.configDir == configDir;
          message = "home assistant config directory does not match persistence";
        }
      ];
      environment.persistence."/persist/system/root" = {
        enable = true;
        hideMounts = true;
        directories = [
          {
            directory = configDir;
            user = "hass";
            group = "hass";
          }
        ];
      };
    })
  ]);
}