# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{
  config,
  pkgs,
  inputs,
  ...
}:

{

  imports = [
    inputs.home-manager.nixosModules.home-manager
    inputs.nix-flatpak.nixosModules.nix-flatpak
    ../../nixosModules
  ];

  # Bootloader.
  boot.loader = {
    systemd-boot.enable = true;
    efi.canTouchEfiVariables = true;
  };

  # Enable networking
  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "Europe/Prague";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_GB.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "cs_CZ.UTF-8";
    LC_IDENTIFICATION = "cs_CZ.UTF-8";
    LC_MEASUREMENT = "cs_CZ.UTF-8";
    LC_MONETARY = "cs_CZ.UTF-8";
    LC_NAME = "cs_CZ.UTF-8";
    LC_NUMERIC = "cs_CZ.UTF-8";
    LC_PAPER = "cs_CZ.UTF-8";
    LC_TELEPHONE = "cs_CZ.UTF-8";
    LC_TIME = "cs_CZ.UTF-8";
  };

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "cz";
    variant = "bksl";
  };

  # Configure console keymap
  console.keyMap = "cz-lat2";

  # Define a user account. Don't forget to set a password with ‘passwd’.
  # Replace name <krop> with a variable
  users.users.krop = {
    isNormalUser = true;
    description = "Jakub Kropáček";
    extraGroups = [
      "networkmanager"
      "wheel"
    ];
    shell = pkgs.zsh;
  };

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # Enable flakes
  nix.settings.experimental-features = [
    "nix-command"
    "flakes"
  ];

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    alacritty
    alacritty-theme
    nixd
    nil
    fzf
    zoxide
    jetbrains-mono
    mattermost-desktop
    gh
    gparted
    prismlauncher # REMOVE AND MOVE TO games module after refactoring
    joplin-desktop
    albert
    (octaveFull.withPackages (
      ps: with ps; [
        octavePackages.signal
      ]
    ))
    wireshark
  ];

  programs = {
    tmux.enable = true;
    zsh.enable = true;
    git.enable = true;
    dconf.enable = true;
    thunderbird.enable = true;
    firefox.enable = true;
    gnupg.agent = {
      enable = true;
    };
    nix-ld = {
      enable = true;
    };
  };

  services = {
    tailscale = {
      enable = true;
    };
    flatpak = {
      enable = true;
      remotes = [
        {
          name = "flathub";
          location = "https://dl.flathub.org/repo/flathub.flatpakrepo";
        }
        {
          name = "flathub-beta";
          location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo";
        }
      ];
      packages = [
        "org.gnome.World.PikaBackup"
        "ca.desrt.dconf-editor"
        "org.onlyoffice.desktopeditors"
        "tv.kodi.Kodi"
        "com.valvesoftware.Steam"
        "com.github.tchx84.Flatseal"
        "io.dbeaver.DBeaverCommunity"
      ];
    };
    avahi = {
      enable = true;
      nssmdns4 = true;
      openFirewall = true;
    };
    printing = {
      enable = true;
      drivers = [ pkgs.samsung-unified-linux-driver ];
    };
  };

  networking = {
    nftables.enable = true;
    firewall.checkReversePath = "loose";
  };

  # 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 = "24.05"; # Did you read the comment?

}