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

with lib;
let

  cfg = config.i18n.inputMethod;

  gtk2Cache = pkgs.runCommandLocal "gtk2-immodule.cache" {
    buildInputs = [ pkgs.gtk2 cfg.package ];
  } ''
    mkdir -p $out/etc/gtk-2.0/
    GTK_PATH=${cfg.package}/lib/gtk-2.0/ \
      gtk-query-immodules-2.0 > $out/etc/gtk-2.0/immodules.cache
  '';

  gtk3Cache = pkgs.runCommandLocal "gtk3-immodule.cache" {
    buildInputs = [ pkgs.gtk3 cfg.package ];
  } ''
    mkdir -p $out/etc/gtk-3.0/
    GTK_PATH=${cfg.package}/lib/gtk-3.0/ \
      gtk-query-immodules-3.0 > $out/etc/gtk-3.0/immodules.cache
  '';

in {
  imports =
    [ ./fcitx.nix ./fcitx5.nix ./hime.nix ./kime.nix ./nabi.nix ./uim.nix ];

  options.i18n = {
    inputMethod = {
      enabled = mkOption {
        type = types.nullOr
          (types.enum [ "fcitx" "fcitx5" "nabi" "uim" "hime" "kime" ]);
        default = null;
        example = "fcitx";
        description = ''
          Select the enabled input method. Input methods is a software to input
          symbols that are not available on standard input devices.
          </para><para>
          Input methods are specially used to input Chinese, Japanese and Korean
          characters.
          </para><para>
          Currently the following input methods are available in Home Manager:

          <variablelist>
          <varlistentry>
            <term><literal>fcitx</literal></term>
            <listitem><para>
              A customizable lightweight input method
              extra input engines can be added using
              <literal>i18n.inputMethod.fcitx.engines</literal>.
            </para></listitem>
          </varlistentry>
          <varlistentry>
            <term><literal>fcitx5</literal></term>
            <listitem><para>
              The next generation of fcitx,
              addons (including engines, dictionaries, skins) can be added using
              <literal>i18n.inputMethod.fcitx5.addons</literal>.
            </para></listitem>
          </varlistentry>
          <varlistentry>
            <term><literal>nabi</literal></term>
            <listitem><para>
              A Korean input method based on XIM. Nabi doesn't support Qt 5.
            </para></listitem>
          </varlistentry>
          <varlistentry>
            <term><literal>uim</literal></term>
            <listitem><para>
              The universal input method, is a library with a XIM bridge.
              uim mainly support Chinese, Japanese and Korean.
            </para></listitem>
          </varlistentry>
          <varlistentry>
            <term><literal>hime</literal></term>
            <listitem><para>An extremely easy-to-use input method framework.</para></listitem>
          </varlistentry>
          <varlistentry>
            <term><literal>kime</literal></term>
            <listitem><para>A Korean IME.</para></listitem>
          </varlistentry>
          </variablelist>
        '';
      };

      package = mkOption {
        internal = true;
        type = types.nullOr types.path;
        default = null;
        description = ''
          The input method method package.
        '';
      };
    };
  };

  config = mkIf (cfg.enabled != null) {
    assertions = [
      (hm.assertions.assertPlatform "i18n.inputMethod" pkgs platforms.linux)
    ];

    home.packages = [ cfg.package gtk2Cache gtk3Cache ];
  };

  meta.maintainers = with lib; [ hm.maintainers.kranzes ];
}