{ config, pkgs, lib, ... }:
let
  unstable = import (pkgs.fetchFromGitHub {
    owner = "nixos";
    repo = "nixpkgs";
    rev = (lib.importJSON ../../../nixpkgs-unstable.json).rev;
    sha256 = (lib.importJSON ../../../nixpkgs-unstable.json).sha256;
  }) {};
in {
  services.nginx.virtualHosts."hass.shack" = {
    serverAliases = [ "glados.shack" ];
    locations."/" = {
      proxyPass = "http://localhost:8123";
      extraConfig = ''
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host             $host;
          proxy_set_header X-Real-IP        $remote_addr;

          proxy_buffering off;
        '';
    };
  };
  imports = [
    ./multi/shackopen.nix
    ./multi/wasser.nix
    ./multi/schlechte_luft.nix
    ./multi/rollos.nix

    ./switch/power.nix

    ./sensors/power.nix
    ./sensors/mate.nix
    ./sensors/darksky.nix
    ./sensors/spaceapi.nix
    ./sensors/sensemap.nix

    ./automation/shack-startup.nix
    ./automation/party-time.nix
    ./automation/hass-restart.nix

  ];
  services.home-assistant =
    {
    enable = true;
    autoExtraComponents = true;
    package = unstable.home-assistant.overrideAttrs (old: {
      doInstallCheck = false;
    });
    config = {
      homeassistant = {
        name = "Glados";
        time_zone = "Europe/Berlin";
        latitude = "48.8265";
        longitude = "9.0676";
        elevation = 303;
        auth_providers = [
          { type = "homeassistant";}
          { type = "trusted_networks";
            trusted_networks = [
              "127.0.0.1/32"
              "10.42.0.0/16"
              "::1/128"
              "fd00::/8"
            ];
          }
        ];
      };
      # https://www.home-assistant.io/components/influxdb/
      influxdb = {
        database = "glados";
        host = "influx.shack";
        component_config_glob = {
          "sensor.*particulate_matter_2_5um_concentration".override_measurement = "2_5um particles";
          "sensor.*particulate_matter_10_0um_concentration".override_measurement ="10um particles";
        };
        tags = {
          instance = "wolf";
          source = "glados";
        };
      };
      esphome = {};
      api = {};
      mqtt = {
        broker = "localhost";
        port = 1883;
        client_id = "home-assistant";
        keepalive = 60;
        protocol = 3.1;
        discovery = true; #enable esphome discovery
        discovery_prefix = "homeassistant";
        birth_message = {
          topic = "glados/hass/status/LWT";
          payload = "Online";
          qos = 1;
          retain = true;
        };
        will_message = {
          topic = "glados/hass/status/LWT";
          payload = "Offline";
          qos = 1;
          retain = true;
        };
      };
      light =  [];
      media_player = [
        { platform = "mpd";
          name = "lounge";
          host = "lounge.mpd.shack";
        }
        { platform = "mpd";
          name = "kiosk";
          host = "lounge.kiosk.shack";
        }
      ];

      camera = [];
      frontend = { };
      config = { };
      sun = {};
      http = {
        base_url = "http://hass.shack";
        use_x_forwarded_for = true;
        trusted_proxies = "127.0.0.1";
      };
      #conversation = {};

      history = {};
      logbook = {};
      #recorder = {};

      logger.default = "info";

      tts = [
        { platform = "google_translate";
          service_name = "say";
          language = "de";
          cache = true;
          time_memory = 57600;
        }
      ];
      device_tracker = [];
    };
  };
}
