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

{
  imports =
    [
      ./hardware-configuration.nix
      ../../services/suspend.nix
    ];

  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  boot.kernel.sysctl."net.ipv4.ip_forward" = 1;

  networking = {
    hostName = "olive";
    wireless = {
      iwd.enable = true;
      interfaces = [ "wlan0" ];
      environmentFile = "/home/np/.wireless.env";
      networks = {
        Sanic.psk = "@PSK_SANI@";
        Gopalan.psk = "@PSK_GOPA@";
        Srividhya.psk = "@PSK_SRIV@";
        sage.psk = "@PSK_SAGE@";
      };
      extraConfig = ''
        ctrl_interface=/run/wpa_supplicant
        ctrl_interface_group=wheel
      '';
    };
    useDHCP = false;
    interfaces.wlan0.useDHCP = true;
  };

  networking.nameservers = [ "1.1.1.1" "1.0.0.1" ];

  i18n.defaultLocale = "en_US.UTF-8";
  time.timeZone = "Asia/Kolkata";

  nixpkgs.config = {
    "2bwm".patches = [
      ../../patches/2bwm/nerd-patch.diff
    ];

    st = {
      conf = builtins.readFile ../../programs/st/config.h;
      extraLibs = with pkgs; [ harfbuzz ];
      patches = [
        ../../patches/st/xres.diff
        ../../patches/st/bright.diff
        ../../patches/st/ligatures.diff
      ];
    };

    # for zoom-us
    allowUnfree = true;
  };

  nixpkgs.overlays = with self.overlays; [
    statix
    prompt
  ];

  environment.systemPackages = with pkgs; [
    _2bwm
    man-pages
    man-pages-posix
    (lib.hiPrio pkgs.bashInteractive_5)
  ];

  documentation = {
    dev.enable = true;
    man.generateCaches = true;
  };

  users.motd = with config; ''
    Host       ${networking.hostName}
    OS         NixOS ${system.nixos.release} (${system.nixos.codeName})
    Version    ${system.nixos.version}
    Kernel     ${boot.kernelPackages.kernel.version}
  '';

  programs = {
    light.enable = true;
    adb.enable = true;
  };

  sound.enable = true;

  hardware = {
    pulseaudio = {
      enable = true;
      package = pkgs.pulseaudioFull;
      extraConfig = "load-module module-bluetooth-policy auto_switch=2";
    };
    bluetooth = {
      enable = true;
      powerOnBoot = true;
    };
  };

  # Enable the X11 windowing system.
  services.xserver = {
    enable = true;
    layout = "us";
    displayManager.startx.enable = true;
    libinput.enable = true;
  };

  services.batteryNotifier = {
    enable = true;
    notifyCapacity = 20;
    suspendCapacity = 10;
  };

  services.udev.extraRules = builtins.readFile ./qmk.rules;

  users.users.np = {
    isNormalUser = true;
    home = "/home/np";
    extraGroups = [ "wheel" "users" "tty" "audio" "video" "input" "adbusers" "docker" ];
  };

  nix = {
    package = pkgs.nixUnstable;
    extraOptions = ''
      experimental-features = nix-command flakes
      warn-dirty = false
      keep-outputs = false
      keep-derivations = false
    '';
    settings = {
      trusted-users = [
        "root"
        "np"
      ];
    };
  };

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "20.03"; # Did you read the comment?
}