{
  inputs,
  pkgs,
  lib,
  ...
}:

let
  firefox-addons = inputs.firefox-addons.packages.${pkgs.system};

  commonSettings = {
    # Disable DNS over HTTPS (use system DNS, i.e. VPN's DNS)
    "network.trr.mode" = 5;

    # Set Security Level Safer
    # "browser.security_level.security_slider" = 2;

    # Disable private browsing mode and enable restoring sessions
    "browser.privatebrowsing.autostart" = false;
    "browser.startup.page" = 3;

    # Enable persistence of site data
    "permissions.memory_only" = false;

    # Customise clear on shutdown
    "privacy.clearOnShutdown.cache" = true;
    "privacy.clearOnShutdown.cookies" = true;
    "privacy.clearOnShutdown.sessions" = true;
    "privacy.clearOnShutdown.offlineApps" = true;
    "privacy.clearOnShutdown.openWindows" = false;
    "privacy.clearOnShutdown.siteSettings" = false;
    "privacy.clearOnShutdown.downloads" = false;
    "privacy.clearOnShutdown.formdata" = false;
    "privacy.clearOnShutdown.history" = false;

    # Disable extension auto updates
    "extensions.update.enabled" = false;
    "extensions.update.autoUpdateDefault" = false;

    # Use native file picker instead of GTK file picker
    "widget.use-xdg-desktop-portal.file-picker" = 1;

    # enable WebAuthn
    "security.webauth.webauthn" = true;

    # video acceleration
    "media.ffmpeg.vaapi.enabled" = true;
  };

  commonSearch = {
    force = true;
    # TODO defaults don't work
    default = "Qwant";
    privateDefault = "Qwant";
    order = [
      "Qwant"
      "Ecosia"
      "DuckDuckGo"
      "Startpage"
      "kagi"
    ];
    engines = {
      # builtin
      "Startpage".metaData.alias = "@s";
      "DuckDuckGo".metaData.alias = "@d";

      # extra
      "Qwant" = {
        urls = [ { template = "https://www.qwant.com/?q={searchTerms}"; } ];
        iconURL = "https://www.qwant.com/favicon.ico";
        definedAliases = [ "@q" ];
      };
      "Ecosia" = {
        urls = [ { template = "https://www.ecosia.org/search?q={searchTerms}"; } ];
        iconURL = "https://www.ecosia.org/favicon.ico";
        definedAliases = [ "@e" ];
      };
      "kagi" = {
        urls = [ { template = "https://kagi.com/search?q={searchTerms}"; } ];
        iconURL = "https://kagi.com/favicon.ico";
        definedAliases = [ "@k" ];
      };
      "GitHub" = {
        urls = [ { template = "https://github.com/search?q={searchTerms}"; } ];
        iconURL = "https://github.com/favicon.ico";
        definedAliases = [ "@gh" ];
      };
      "GitLab" = {
        urls = [ { template = "https://gitlab.com/search?search={searchTerms}"; } ];
        iconURL = "https://gitlab.com/favicon.ico";
        definedAliases = [ "@gl" ];
      };
      "Codeberg" = {
        urls = [ { template = "https://codeberg.org/explore/repos?q={searchTerms}"; } ];
        iconURL = "https://codeberg.org/favicon.ico";
        definedAliases = [ "@cb" ];
      };
      "Nix Packages" = {
        urls = [ { template = "https://search.nixos.org/packages?query={searchTerms}"; } ];
        icon = "''${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
        definedAliases = [ "@np" ];
      };
      "NixOS Options" = {
        urls = [ { template = "https://search.nixos.org/options?query={searchTerms}"; } ];
        icon = "''${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
        definedAliases = [ "@no" ];
      };
      "Nix Flakes: Packages" = {
        urls = [ { template = "https://search.nixos.org/flakes?type=packages&query={searchTerms}"; } ];
        icon = "''${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
        definedAliases = [ "@nfp" ];
      };
      "Nix Flakes: Options" = {
        urls = [ { template = "https://search.nixos.org/flakes?type=options&query={searchTerms}"; } ];
        icon = "''${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
        definedAliases = [ "@nfo" ];
      };
      "NixOS Wiki" = {
        urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ];
        icon = "''${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
        definedAliases = [ "@nw" ];
      };
      "Crates.io" = {
        urls = [ { template = "https://crates.io/search?q={searchTerms}"; } ];
        iconURL = "https://crates.io/favicon.ico";
        definedAliases = [ "@rc" ];
      };
      "Docs.rs" = {
        urls = [ { template = "https://docs.rs/releases/search?query={searchTerms}"; } ];
        iconURL = "https://docs.rs/favicon.ico";
        definedAliases = [ "@rd" ];
      };
      "Rust Book" = {
        urls = [ { template = "https://doc.rust-lang.org/book/?search={searchTerms}"; } ];
        iconURL = "https://doc.rust-lang.org/book/favicon.svg";
        definedAliases = [ "@rb" ];
      };
      "Rust std" = {
        urls = [ { template = "https://doc.rust-lang.org/stable/std/?search={searchTerms}"; } ];
        iconURL = "https://www.rust-lang.org/static/images/favicon.svg";
        definedAliases = [ "@rs" ];
      };
      "npm" = {
        urls = [ { template = "https://www.npmjs.com/search?q={searchTerms}"; } ];
        iconURL = "https://static-production.npmjs.com/da3ab40fb0861d15c83854c29f5f2962.png";
        definedAliases = [ "@npm" ];
      };
      "PyPI" = {
        urls = [ { template = "https://pypi.org/search/?q={searchTerms}"; } ];
        iconURL = "https://pypi.org/favicon.ico";
        definedAliases = [ "@pypi" ];
      };
      "Stack Overflow" = {
        urls = [ { template = "https://stackoverflow.com/search?q={searchTerms}"; } ];
        iconURL = "https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico";
        definedAliases = [ "@so" ];
      };
      "Wikipedia" = {
        urls = [ { template = "https://en.wikipedia.org/wiki/{searchTerms}"; } ];
        iconURL = "https://en.wikipedia.org/favicon.ico";
        definedAliases = [ "@w" ];
      };
      "Wolfram Alpha" = {
        urls = [ { template = "https://www.wolframalpha.com/input?i={searchTerms}"; } ];
        iconURL = "https://www.wolframalpha.com/_next/static/images/favicon_1zbE9hjk.ico";
        definedAliases = [ "@wa" ];
      };
      "Reddit" = {
        urls = [ { template = "https://www.reddit.com/search/?q={searchTerms}"; } ];
        iconURL = "https://www.reddit.com/favicon.ico";
        definedAliases = [ "@r" ];
      };
    };
  };

  commonExtensions = with firefox-addons; [
    dictionary-german
    proton-pass
    libredirect
    zotero-connector
  ];
in
{
  imports = [ ../modules/firefox/mullvad-browser.nix ];

  programs.mullvad-browser = {
    enable = true;
    createProfileBins = true;
    profiles = {
      private = {
        id = 0;
        settings = commonSettings;
        search = commonSearch;
        extensions = commonExtensions;
      };
      work = {
        id = 1;
        settings = commonSettings;
        search = commonSearch;
        extensions =
          commonExtensions
          ++ (with firefox-addons; [
            bitwarden
            react-devtools
            reduxdevtools
          ]);
      };
    };
  };
}