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

let
  # Проверяем, использует ли система UEFI
  isUEFI = lib.pathExists "/sys/firmware/efi/efivars";

  # Определяем PCI ID вашей звуковой карты (при необходимости)
  soundcardPciId = "1002:4383"; 
in
{
  imports = [
    ./hardware-configuration.nix
    # <musnix>  # Раскомментируйте, если хотите использовать musnix 
  ];

  # 1. Конфигурация загрузчика
  boot.loader = {
    efi.canTouchEfiVariables = isUEFI; 
    systemd-boot.enable = isUEFI;
    grub = {
      enable = !isUEFI;
      device = if !isUEFI then "/dev/sda" else null;
      useOSProber = !isUEFI;
    };
  };

  # 2. Сетевые настройки
  networking = {
    hostName = "nixos";
    networkmanager.enable = true;
    nameservers = [ "45.90.28.0" "45.90.30.0" ]; # NextDNS серверы
    firewall = {
      enable = true;
      allowedTCPPorts = [ 22 80 443 ];
      allowedUDPPortRanges = [
        { from = 10000; to = 20000; }
      ];
    };
  };

  # 3. Локализация
  i18n = {
    defaultLocale = "en_ZA.UTF-8";
    supportedLocales = [
      "en_ZA.UTF-8/UTF-8"
      "zu_ZA.UTF-8/UTF-8"
      "zu_ZA/ISO-8859-1"
    ];
    extraLocaleSettings = {
      LC_ADDRESS = "zu_ZA.UTF-8";
      LC_IDENTIFICATION = "zu_ZA.UTF-8";
      LC_MEASUREMENT = "zu_ZA.UTF-8";
      LC_MONETARY = "zu_ZA.UTF-8";
      LC_NAME = "zu_ZA.UTF-8";
      LC_NUMERIC = "zu_ZA.UTF-8";
      LC_PAPER = "zu_ZA.UTF-8";
      LC_TELEPHONE = "zu_ZA.UTF-8";
      LC_TIME = "zu_ZA.UTF-8";
    };
  };

  # 4. X11 и окружение рабочего стола
  services.xserver = {
    enable = true;
    displayManager.lightdm.enable = true;
    desktopManager.mate.enable = true;
    xkb = {
      layout = "us,ru";
      variant = "";
      options = "grp:alt_shift_toggle"; 
    };
  };

  # 5. Конфигурация звука с PipeWire
  sound.enable = true;
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;

  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true; 
    jack.enable = true;

    extraConfig = {
      pipewire = {
        "context.properties" = {
          "default.clock.rate" = 48000;
          "default.clock.quantum" = 512;
          "default.clock.min-quantum" = 128;
          "default.clock.max-quantum" = 512;
        };
      };
    };
  };

  # 6. Настройки ядра для аудиофилов
  boot.kernelPackages = pkgs.linuxPackages_latest;
  boot.kernel.sysctl = {
    "vm.swappiness" = 10;  # Уменьшено для систем с ограниченной памятью
    "vm.max_map_count" = 262144;
    "net.core.rmem_max" = 16777216;
    "net.core.wmem_max" = 16777216;
    "kernel.sched_rt_period_us" = 1000000;
    "kernel.sched_rt_runtime_us" = 950000;
    "kernel.sched_latency_ns" = 1000000;
    "kernel.sched_min_granularity_ns" = 100000;
    "kernel.sched_wakeup_granularity_ns" = 2000000;
  };

  # 7. Ограничения PAM для группы @audio
  security.pam.services = {
    login.limits = lib.mkForce [
      { domain = "audio"; type = "hard"; item = "rtprio"; value = 95; }
      { domain = "audio"; type = "hard"; item = "memlock"; value = 1000000; }
      { domain = "audio"; type = "hard"; item = "nice"; value = -19; }
      { domain = "audio"; type = "hard"; item = "nofile"; value = 4096; }
    ];
    sshd.limits = lib.mkForce [
      { domain = "audio"; type = "hard"; item = "rtprio"; value = 95; }
      { domain = "audio"; type = "hard"; item = "memlock"; value = 1000000; }
      { domain = "audio"; type = "hard"; item = "nice"; value = -19; }
      { domain = "audio"; type = "hard"; item = "nofile"; value = 4096; }
    ];
  };

  # 8. Приоритеты процессов PipeWire 
  systemd.services.pipewire = {
    serviceConfig = {
      Nice = -19;
      CPUSchedulingPolicy = "SCHED_FIFO";
      CPUSchedulingPriority = 95;
    };
  };
  
  systemd.services."pipewire-pulse" = {
    serviceConfig = {
      Nice = -19;
      CPUSchedulingPolicy = "SCHED_FIFO";
      CPUSchedulingPriority = 95;
    };
  };

  # 9. Управление доступом и группами
  users.groups.audio = {};

  users.users.m = {
    isNormalUser = true;
    description = "m";
    extraGroups = [ "networkmanager" "wheel" "bluetooth" "docker" "audio" "pipewire" ];
    # hashedPassword = "ваш_хешированный_пароль_здесь";  # Раскомментируйте и замените на реальный хеш пароля, если нужно
    packages = with pkgs; [
      firefox
      telegram-desktop
    ];
    openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..." ];
  };

  # 10. Автовход и конфигурация TTY
  services.displayManager.autoLogin = {
    enable = true;
    user = "m";
  };

  # Оставляем один TTY включённым для устранения неполадок
  systemd.services."getty@tty1".enable = true;
  systemd.services."autovt@tty1".enable = false;

  # 11. Разрешение на использование неофициальных пакетов
  nixpkgs.config.allowUnfree = true;

  # 12. Системные пакеты
  environment.systemPackages = with pkgs; [
    vim
    stdenv.cc.cc.lib
    gcc
    zlib
    portaudio
    vscode
    wget
    docker
    htop
    git
    curl
    alsa-utils
    pulsemixer
    pavucontrol
    easyeffects
    easytag
    qjackctl
  ];

  # 13. Версия состояния системы
  system.stateVersion = "22.05"; # Убедитесь, что эта версия совпадает с вашей версией NixOS

  # 14. Переменные окружения
  environment.variables = {
    EDITOR = "pluma";
    ALSA_CARD = "default";
  };

  # 15. Конфигурация Docker
  virtualisation.docker.enable = true;

  # 16. Оптимизация для SSD
  fileSystems."/".options = [ "noatime" "nodiratime" "discard" ];

  # 17. Использование zram вместо файла подкачки
  zramSwap.enable = true;
  zramSwap.algorithm = "zstd";
  zramSwap.memoryPercent = 20; # Используем 50% от ОЗУ для zram

  # 18. Шрифты
  fonts.packages = with pkgs; [
    noto-fonts
    noto-fonts-cjk
    noto-fonts-emoji
  ];

  # 19. Синхронизация времени
  services.timesyncd.enable = true;

  # 20. Автоматические обновления
  system.autoUpgrade = {
    enable = true;      
    allowReboot = false; # Изменено на false для безопасности
    dates = "02:00";
    flags = [
      "--no-build-nix"
      "--recreate-lock-file"
      "--refresh"
      "-I" "nixpkgs=channel:nixos-stable"
    ];
  };

  # 21. Управление энергопотреблением
  powerManagement.cpuFreqGovernor = "ondemand";

  # 22. Экспериментальные функции (раскомментируйте, если ваша версия NixOS поддерживает flakes)
  # nix.settings.experimental-features = [ "nix-command" "flakes" ];
} предложи улучшения для аудиофила