{ config, lib, pkgs, inputs, ... }:
with lib;
let
  colorType = types.str;
  color = (name:
    (mkOption {
      description = "${name} color of palette";
      type = colorType;
    }));
  fromBase16 = { base00, base01, base02, base03, base04, base05, base06, base07
    , base08, base09, base0A, base0B, base0C, base0D, base0E, base0F, ... }:
    builtins.mapAttrs (_: v: "#" + v) {
      bg = base00;
      fg = base07;

      gray = base03;
      alt = base02;
      dark = base01;

      red = base08;
      orange = base09;
      yellow = base0A;
      green = base0B;
      cyan = base0C;
      blue = base0D;
      purple = base0E;
    };

  fromYAML = yaml:
    builtins.fromJSON (builtins.readFile (pkgs.stdenv.mkDerivation {
      name = "fromYAML";
      phases = [ "buildPhase" ];
      buildPhase = "echo '${yaml}' | ${pkgs.yaml2json}/bin/yaml2json > $out";
    }));
in {
  options = {
    themes = {
      colors = mkOption {
        description =
          "Set of colors from which the themes for various applications will be generated";
        type = with types;
          submodule {
            options = {
              bg = color "background";
              fg = color "foreground";
              gray = color "gray";

              alt = color "alternative";
              dark = color "darker";

              blue = color "blue";
              green = color "green";
              red = color "red";
              orange = color "orange";
              yellow = color "yellow";
              cyan = color "cyan";
              purple = color "purple";
            };
          };
      };
    };
  };
  config = {
    themes.colors = (fromBase16 (fromYAML
      (builtins.readFile "${inputs.base16-unclaimed-schemes}/irblack.yaml")))
      // {
        alt = "#001d6c";

        red = "#da1e28";
        green = "#24a148";
        orange = "#ff832b";
        yellow = "#f1c21b";
      };
  };
}