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

with lib;

let

  cfg = config.programs.firefox;

in

{
  meta.maintainers = [ maintainers.rycee ];

  options = {
    programs.firefox = {
      enable = mkEnableOption "Firefox";

      package = mkOption {
        type = types.package;
        default = pkgs.firefox-unwrapped;
        defaultText = "pkgs.firefox-unwrapped";
        description = "The unwrapped Firefox package to use.";
      };

      enableAdobeFlash = mkOption {
        type = types.bool;
        default = false;
        description = "Whether to enable the unfree Adobe Flash plugin.";
      };

      enableGoogleTalk = mkOption {
        type = types.bool;
        default = false;
        description = "Whether to enable the unfree Google Talk plugin.";
      };

      enableIcedTea = mkOption {
        type = types.bool;
        default = false;
        description = "Whether to enable the Java applet plugin.";
      };
    };
  };

  config = mkIf cfg.enable {
    home.packages =
      let
        # A bit of hackery to force a config into the wrapper.
        browserName = cfg.package.browserName
          or (builtins.parseDrvName cfg.package.name).name;

        fcfg = setAttrByPath [browserName] {
          enableAdobeFlash = cfg.enableAdobeFlash;
          enableGoogleTalkPlugin = cfg.enableGoogleTalk;
          icedtea = cfg.enableIcedTea;
        };

        wrapper = pkgs.wrapFirefox.override {
          config = fcfg;
        };
      in
        [ (wrapper cfg.package { }) ];
  };
}