{ pkgs, ... }:
let
  mkBasicSearchEngine = { aliases, url, param }: {
    urls = [{
      template = url;
      params = [
        { name = param; value = "{searchTerms}"; }
      ];
    }];

    definedAliases = aliases;
  };

  mkNixPackagesEngine = { aliases, type }:
    let basicEngine = mkBasicSearchEngine
      {
        aliases = aliases;
        url = "https://search.nixos.org/${type}";
        param = "query";
      };
    in
    basicEngine // {
      icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
    };
in
{
  programs.firefox = {
    enable = true;
    profiles.adrielus = {
      # Unique user id
      id = 0;

      # Make this the default user
      isDefault = true;

      # Forcefully replace the search configuration 
      search.force = true;

      # Set default search engine
      search.default = "Google";

      # Specify custom search engines
      search.engines = {
        "Nix Packages" = mkNixPackagesEngine {
          aliases = [ "@np" "@nix-packages" ];
          type = "packages";
        };

        "Nix options" = mkNixPackagesEngine {
          aliases = [ "@no" "@nix-options" ];
          type = "options";
        };

        # Purescript packages
        "Pursuit" = mkBasicSearchEngine {
          url = "https://pursuit.purescript.org/search";
          param = "q";
          aliases = [ "@ps" "@pursuit" ];
        };

        "Wikipedia" = mkBasicSearchEngine {
          url = "https://en.wikipedia.org/wiki/Special:Search";
          param = "search";
          aliases = [ "@wk" "@wikipedia" ];
        };

        "Github" = mkBasicSearchEngine {
          url = "https://github.com/search";
          param = "q";
          aliases = [ "@gh" "@github" ];
        };

        "Youtube" = mkBasicSearchEngine {
          url = "https://www.youtube.com/results";
          param = "search_query";
          aliases = [ "@yt" "@youtube" ];
        };

        "Noita wiki" = mkBasicSearchEngine {
          url = "https://noita.wiki.gg/index.php";
          param = "search";
          aliases = [ "@noita" ];
        };

        "Rain world wiki" = mkBasicSearchEngine {
          url = "https://rainworld.miraheze.org/w/index.php";
          param = "search";
          aliases = [ "@rw" "@rain-world" ];
        };

        "Factorio wiki" = mkBasicSearchEngine {
          url = "https://wiki.factorio.com/index.php";
          param = "search";
          aliases = [ "@fw" "@factorio-wiki" ];
        };

        "Factorio mod portal" = mkBasicSearchEngine {
          url = "https://mods.factorio.com/";
          param = "query";
          aliases = [ "@fm" "@factorio-mods" ];
        };

        "Google".metaData.alias = "@g";
      };
    };
  };

  firefox.apps.asana = {
    url = "https://app.asana.com/";
    icon = ./icons/asana.png;
    displayName = "Asana";
    id = 1;
  };
}