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

let
  inherit (lib)
    concatStringsSep mapAttrsToList mkIf mkEnableOption mkPackageOption mkOption
    literalExpression;

  cfg = config.programs.freetube;

  settings = settings:
    let
      convertSetting = name: value:
        builtins.toJSON {
          "_id" = name;
          "value" = value;
        };
    in concatStringsSep "\n" (mapAttrsToList convertSetting settings) + "\n";
in {
  meta.maintainers = with lib.maintainers; [ vonixxx ];

  options.programs.freetube = {
    enable = mkEnableOption "FreeTube, a YT client for Windows, Mac, and Linux";

    package = mkPackageOption pkgs "freetube" { };

    settings = mkOption {
      type = lib.types.attrs;
      default = { };
      example = literalExpression ''
        {
          allowDashAv1Formats = true;
          checkForUpdates     = false;
          defaultQuality      = "1080";
          baseTheme           = "catppuccinMocha";
        }
      '';
      description = ''
        Configuration settings for FreeTube.

        All configurable options can be deduced by enabling them through the
        GUI and observing the changes in {file}`settings.db`.
      '';
    };
  };

  config = mkIf cfg.enable {
    home.packages = [ cfg.package ];

    xdg.configFile."FreeTube/hm_settings.db" = {
      source = pkgs.writeText "hm_settings.db" (settings cfg.settings);

      onChange = let
        hmSettingsDb = "${config.xdg.configHome}/FreeTube/hm_settings.db";
        settingsDb = "${config.xdg.configHome}/FreeTube/settings.db";
      in ''
        run install -Dm644 $VERBOSE_ARG '${hmSettingsDb}' '${settingsDb}'
      '';
    };
  };
}