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

{
  options.custom = {
    username = lib.mkOption {
      type = lib.types.str;
      default = "dakedres";
    };

    nonFreePackages = lib.mkOption {
      type = lib.types.listOf lib.types.str;
      default = [];
    };

    wallpaper = lib.mkOption {
      type = lib.types.path;
    };

    colors =
    let
      colorOption = lib.mkOption {
        type = lib.types.str;
        default = "#000000";
      };
    in
    {
      base00 = colorOption;
      base01 = colorOption;
      base02 = colorOption;
      base03 = colorOption;
      base04 = colorOption;
      base05 = colorOption;
      base06 = colorOption;
      base07 = colorOption;
      base08 = colorOption;
      base09 = colorOption;
      base0A = colorOption;
      base0B = colorOption;
      base0C = colorOption;
      base0D = colorOption;
      base0E = colorOption;
      base0F = colorOption;
    };
  };

  config =
  let
    username = config.custom.username;
    nonFreePackages = config.custom.nonFreePackages;
  in
  {
    home = {
      username = username;
      homeDirectory = "/home/${username}";
    };

    # Unfree packages
    nixpkgs.config.allowUnfreePredicate = pkg:
      builtins.elem (lib.getName pkg) nonFreePackages;

    home.packages =
      map (name: pkgs.${name}) nonFreePackages;

    # Take over my xsession
    xsession.enable = true;

    # Let Home Manager install and manage itself.
    programs.home-manager.enable = true;
  };
}