{ pkgs, ... }:
let
  homeassistant-api = pkgs.python3.pkgs.buildPythonPackage rec {
    pname = "homeassistant_api";
    version = "5.0.0";
    format = "pyproject";
    src = pkgs.fetchPypi {
      inherit pname version;
      sha256 = "sha256-UNKTtgInrVJtjHb1WVlUbcbhjBOtTX00eHmm54ww0rY=";
    };

    # do not run tests
    doCheck = false;
    nativeBuildInputs = with pkgs.python3.pkgs; [ poetry-core requests-cache ];
    dependencies = with pkgs.python3.pkgs; [
      requests-cache
      pydantic
      websockets
    ];
    propagatedBuildInputs = with pkgs.python3.pkgs; [
      aiohttp
      aiohttp-client-cache
      pydantic
      requests
      requests-cache
      simplejson
      websockets
    ];
    pythonRelaxDeps = [
      "requests-cache"
      "pydantic"
      "websockets"
    ];
    pythonImportsCheck = [
      "homeassistant_api"
    ];
  };

  pythonEnv = pkgs.python3.withPackages (ps: [
    homeassistant-api
  ]);

  waybar-hass = pkgs.writeScriptBin "waybar-hass" ''
    #!${pythonEnv}/bin/python
    """run with the special python"""

    import argparse
    import time
    import json
    from homeassistant_api import WebsocketClient

    HASS_URL = 'ws://homeassistant.local:8123/api/websocket'

    parser = argparse.ArgumentParser(prog='hass python wrapper')
    parser.add_argument('--toggle_light')
    parser.add_argument('--get_light')
    args = parser.parse_args()

    def load_key():
        """Read the api key"""
        token_path = "/run/secrets/desktop/hass_token"
        with open(token_path, "r") as key_file:
            key = key_file.readline()
        return key

    def get_light_state(client, light):
        """Get light status"""
        light_entity = client.get_entity(entity_id=light)
        state = light_entity.get_state()
        if state.state == 'on':
            return "󰛨"
        return "󰹏"

    def toggle_light(client, light):
        """Toggle light status"""
        lights = client.get_domain("light")
        lights.toggle(entity_id=light)
        time.sleep(0.5)
        light_entity = client.get_entity(entity_id=light)
        state = light_entity.get_state()
        if state.state == 'on':
            return "󰛨"
        return "󰹏"

    def main():
        """Main"""
        token = load_key()
        status = "err"

        with WebsocketClient(HASS_URL, token) as client:
            # toggle a light
            if args.toggle_light is not None:
                status = toggle_light(client=client, light=args.toggle_light)
            # get the current light status
            if args.get_light is not None:
                status = get_light_state(client=client, light=args.get_light)

        print(json.dumps({ "text": status }))

    main()

  '';
in
{
  home.packages = [ waybar-hass ];
}
