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

{
  options.services.alacritty = {
    fontSize = lib.mkOption {
      type = lib.types.float;
      default = 12.0;
    };
  };

  config.environment.systemPackages = [ pkgs.alacritty ];
  config.home-manager.users."${config.system.singleUser}".programs = {
    alacritty = {
      enable = true;
      settings = {
        window = {
          dimensions = {
            columns = 0;
            lines = 0;
          };
          padding = {
            x = 2;
            y = 2;
          };
          dynamic_padding = false;
          dynamic_title = true;
          decorations = "full";
          startup_mode = "Windowed";
        };

        scrolling = {
          history = 10000;
          multiplier = 3;
        };

        font = {
          size = config.services.alacritty.fontSize;
          offset = {
            x = 0;
            y = 0;
          };
          glyph_offset = {
            x = 0;
            y = 0;
          };
          use_thin_strokes = true;
        };
        debug = {
          render_timer = false;
          persistent_logging = false;
        };

        draw_bold_text_with_bright_colors = true;

        colors = {
          primary = {
            background = "0x1e282d";
            foreground = "0xc4c7d1";
          };
          normal = {
            black   = "0x666666";
            red     = "0xeb606b";
            green   = "0xc3e88d";
            yellow  = "0xf7eb95";
            blue    = "0x80cbc4";
            magenta = "0xff2f90";
            cyan    = "0xaeddff";
            white   = "0xffffff";
          };
          bright = {
            black   = "0xff262b";
            red     = "0xeb606b";
            green   = "0xc3e88d";
            yellow  = "0xf7eb95";
            blue    = "0x7dc6bf";
            magenta = "0x6c71c4";
            cyan    = "0x35434d";
            white   = "0xffffff";
          };
        };

        background_opacity = 0.7;
        mouse_bindings = [ {
          mouse = "Middle";
          action = "PasteSelection";
        } ];
        mouse = {
          double_click = {
            threshold = 300;
          };
          triple_click = {
            threshold = 300;
          };

          hide_when_typing = false;
        };

        selection = {
          semantic_scape_chars = ",│`|:\"' ()[]{}<>";
          save_to_clipboard = true;
        };

        cursor = {
          style = "Block";
          unfocused_hollow = true;
        };

        live_config_reload = true;
        enable_experimental_conpty_backend = false;
        alt_send_esc = true;

        key_bindings = [
          {
            key = "Paste";
            action = "Paste";
          }
          {
            key = "Copy";
            action = "Copy";
          }
          {
            key = "L";
            mods = "Control";
            action = "ClearLogNotice";
          }
          {
            key = "L";
            mods = "Control";
            chars = "\\x0c";
          }
          {
            key = "Home";
            chars = "\\x1bOH";
            mode = "AppCursor";
          }
          {
            key = "Home";
            chars = "\\x1b[H";
            mode = "~AppCursor";
          }
          {
            key = "End";
            chars = "\\x1bOF";
            mode = "AppCursor";
          }
          {
            key = "End";
            chars = "\\x1b[F";
            mode = "~AppCursor";
          }
          {
            key = "PageUp";
            mods = "Shift";
            action = "ScrollPageUp";
            mode = "~Alt";
          }
          {
            key = "PageUp";
            mods = "Shift";
            chars = "\\x1b[5;2~";
            mode = "Alt";
          }
          {
            key = "PageDown";
            mods = "Control";
            chars = "\\x1b[6;5~";
          }
          {
            key = "PageDown";
            chars = "\\x1b[6~";
          }
          {
            key = "Tab";
            mods = "Shift";
            chars = "\\x1b[Z";
          }
          {
            key = "Back";
            chars= "\\x7f";
          }
          {
            key = "Back";
            mods = "Alt";
            chars = "\\x1b\\x7f";
          }
          {
            key = "Insert";
            chars = "\\x1b[2~";
          }
          {
            key = "Delete";
            chars = "\\x1b[3~";
          }
          {
            key = "Left";
            mods = "Shift";
            chars = "\\x1b[1;2D";
          }
          {
            key = "Left";
            mods = "Control";
            chars = "\\x1b[1;5D";
          }
          {
            key = "Left";
            mods = "Alt";
            chars = "\\x1b[1;3D";
          }
          {
            key = "Left";
            chars = "\\x1b[D";
            mode = "~AppCursor";
          }
          {
            key = "Left";
            chars = "\\x1bOD";
            mode = "AppCursor";
          }
          {
            key = "Right";
            mods = "Shift";
            chars = "\\x1b[1;2C";
          }
          {
            key = "Right";
            mods = "Control";
            chars = "\\x1b[1;5C";
          }
          {
            key = "Right";
            mods = "Alt";
            chars = "\\x1b[1;3C";
          }
          {
            key = "Right";
            chars = "\\x1b[C";
            mode = "~AppCursor";
          }
          {
            key = "Right";
            chars = "\\x1bOC";
            mode = "AppCursor";
          }
          {
            key = "Up";
            mods = "Shift";
            chars = "\\x1b[1;2A";
          }
          {
            key = "Up";
            mods = "Control";
            chars = "\\x1b[1;5A";
          }
          {
            key = "Up";
            mods = "Alt";
            chars = "\\x1b[1;3A";
          }
          {
            key = "Up";
            chars = "\\x1b[A";
            mode = "~AppCursor";
          }
          {
            key = "Up";
            chars = "\\x1bOA";
            mode = "AppCursor";
          }
          {
            key = "Down";
            mods = "Shift";
            chars = "\\x1b[1;2B";
          }
          {
            key = "Down";
            mods = "Control";
            chars = "\\x1b[1;5B";
          }
          {
            key = "Down";
            mods = "Alt";
            chars = "\\x1b[1;3B";
          }
          {
            key = "Down";
            chars = "\\x1b[B";
            mode = "~AppCursor";
          }
          {
            key = "Down";
            chars = "\\x1bOB";
            mode = "AppCursor";
          }
          {
            key = "F1";
            chars = "\\x1bOP";
          }
          {
            key = "F2";
            chars = "\\x1bOQ";
          }
          {
            key = "F3";
            chars = "\\x1bOR";
          }
          {
            key = "F4";
            chars = "\\x1bOS";
          }
          {
            key = "F5";
            chars = "\\x1b[15~";
          }
          {
            key = "F6";
            chars = "\\x1b[17~";
          }
          {
            key = "F7";
            chars = "\\x1b[18~";
          }
          {
            key = "F8";
            chars = "\\x1b[19~";
          }
          {
            key = "F9";
            chars = "\\x1b[20~";
          }
          {
            key = "F10";
            chars = "\\x1b[21~";
          }
          {
            key = "F11";
            chars = "\\x1b[23~";
          }
          {
            key = "F12";
            chars = "\\x1b[24~";
          }
          {
            key = "F1";
            mods = "Shift";
            chars = "\\x1b[1;2P";
          }
          {
            key = "F2";
            mods = "Shift";
            chars = "\\x1b[1;2Q";
          }
          {
            key = "F3";
            mods = "Shift";
            chars = "\\x1b[1;2R";
          }
          {
            key = "F4";
            mods = "Shift";
            chars = "\\x1b[1;2S";
          }
          {
            key = "F5";
            mods = "Shift";
            chars = "\\x1b[15;2~";
          }
          {
            key = "F6";
            mods = "Shift";
            chars = "\\x1b[17;2~";
          }
          {
            key = "F7";
            mods = "Shift";
            chars = "\\x1b[18;2~";
          }
          {
            key = "F8";
            mods = "Shift";
            chars = "\\x1b[19;2~";
          }
          {
            key = "F9";
            mods = "Shift";
            chars = "\\x1b[20;2~";
          }
          {
            key = "F10";
            mods = "Shift";
            chars = "\\x1b[21;2~";
          }
          {
            key = "F11";
            mods = "Shift";
            chars = "\\x1b[23;2~";
          }
          {
            key = "F12";
            mods = "Shift";
            chars = "\\x1b[24;2~";
          }
          {
            key = "F1";
            mods = "Control";
            chars = "\\x1b[1;5P";
          }
          {
            key = "F2";
            mods = "Control";
            chars = "\\x1b[1;5Q";
          }
          {
            key = "F3";
            mods = "Control";
            chars = "\\x1b[1;5R";
          }
          {
            key = "F4";
            mods = "Control";
            chars = "\\x1b[1;5S";
          }
          {
            key = "F5";
            mods = "Control";
            chars = "\\x1b[15;5~";
          }
          {
            key = "F6";
            mods = "Control";
            chars = "\\x1b[17;5~";
          }
          {
            key = "F7";
            mods = "Control";
            chars = "\\x1b[18;5~";
          }
          {
            key = "F8";
            mods = "Control";
            chars = "\\x1b[19;5~";
          }
          {
            key = "F9";
            mods = "Control";
            chars = "\\x1b[20;5~";
          }
          {
            key = "F10";
            mods = "Control";
            chars = "\\x1b[21;5~";
          }
          {
            key = "F11";
            mods = "Control";
            chars = "\\x1b[23;5~";
          }
          {
            key = "F12";
            mods = "Control";
            chars = "\\x1b[24;5~";
          }
          {
            key = "F1";
            mods = "Alt";
            chars = "\\x1b[1;6P";
          }
          {
            key = "F2";
            mods = "Alt";
            chars = "\\x1b[1;6Q";
          }
          {
            key = "F3";
            mods = "Alt";
            chars = "\\x1b[1;6R";
          }
          {
            key = "F4";
            mods = "Alt";
            chars = "\\x1b[1;6S";
          }
          {
            key = "F5";
            mods = "Alt";
            chars = "\\x1b[15;6~";
          }
          {
            key = "F6";
            mods = "Alt";
            chars = "\\x1b[17;6~";
          }
          {
            key = "F7";
            mods = "Alt";
            chars = "\\x1b[18;6~";
          }
          {
            key = "F8";
            mods = "Alt";
            chars = "\\x1b[19;6~";
          }
          {
            key = "F9";
            mods = "Alt";
            chars = "\\x1b[20;6~";
          }
          {
            key = "F10";
            mods = "Alt";
            chars = "\\x1b[21;6~";
          }
          {
            key = "F11";
            mods = "Alt";
            chars = "\\x1b[23;6~";
          }
          {
            key = "F12";
            mods = "Alt";
            chars = "\\x1b[24;6~";
          }
          {
            key = "F1";
            mods = "Super";
            chars = "\\x1b[1;3P";
          }
          {
            key = "F2";
            mods = "Super";
            chars = "\\x1b[1;3Q";
          }
          {
            key = "F3";
            mods = "Super";
            chars = "\\x1b[1;3R";
          }
          {
            key = "F4";
            mods = "Super";
            chars = "\\x1b[1;3S";
          }
          {
            key = "F5";
            mods = "Super";
            chars = "\\x1b[15;3~";
          }
          {
            key = "F6";
            mods = "Super";
            chars = "\\x1b[17;3~";
          }
          {
            key = "F7";
            mods = "Super";
            chars = "\\x1b[18;3~";
          }
          {
            key = "F8";
            mods = "Super";
            chars = "\\x1b[19;3~";
          }
          {
            key = "F9";
            mods = "Super";
            chars = "\\x1b[20;3~";
          }
          {
            key = "F10";
            mods = "Super";
            chars = "\\x1b[21;3~";
          }
          {
            key = "F11";
            mods = "Super";
            chars = "\\x1b[23;3~";
          }
          {
            key = "F12";
            mods = "Super";
            chars = "\\x1b[24;3~";
          }
          {
            key = "NumpadEnter";
            chars = "\\n";
          }
        ];
      };
    };
  };
}