{ lib, config, pkgs, ... }:

with lib;
let
  toml = pkgs.formats.toml { };
  cfg = config.my.services.spotify-player;

  tomlConfig =
    if cfg.configFile != null
    then cfg.configFile
    else toml.generate "app.toml" cfg.config;

  configFolder = pkgs.runCommand "spotify-player-config" { } ''
    mkdir $out
    ln -s "${tomlConfig}" $out/app.toml
  '';
in
{
  options.my.services.spotify-player = {
    enable = mkEnableOption "spotify_player";
    config = mkOption {
      inherit (toml) type;
      default = { };
    };
    configFile = mkOption {
      type = with types; nullOr path;
      default = null;
    };
    package = mkOption {
      type = types.package;
      default = pkgs.spotify-player;
    };
    target = mkOption {
      type = types.str;
      default = "graphical-session.target";
    };
  };

  config = mkIf cfg.enable {
    assertions = [
      {
        assertion = cfg.config == { } || cfg.configFile == null;
        message = "At least one of the options 'config' or 'configFile' must be set.";
      }
      {
        assertion = cfg.config != { } || cfg.configFile != null;
        message = "Only one of the options 'config' or 'configFile' may be set.";
      }
    ];
    systemd.user.services.spotify-player = {
      after = [ cfg.target "network.target" ];
      wantedBy = [ cfg.target ];
      serviceConfig = {
        Type = "forking";
        Restart = "always";
        RestartSec = "1s";
        ExecStart = "${getExe cfg.package} --daemon --config-folder ${configFolder}";
      };
    };
  };
}
