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

let
  inherit (lib) mkDefault mkEnableOption mkIf;

  cfg = config.hardware.microsoft-surface.firmware.surface-go-ath10k;

in {
  options = {
    hardware.microsoft-surface.firmware.surface-go-ath10k = {
      replace = mkEnableOption ''Use the "board.bin" firmware for ath10k-based WiFi on Surface Go.'';
    };
  };

  config = mkIf cfg.replace {
    warnings = [''A working version of the ath10k QCA6174 firmware has been added to the kernel.org linux-firmware
                  repo, making this fix obsolete.
                  See:
                  -  https://github.com/linux-surface/linux-surface/issues/542#issuecomment-976995453
                  - https://github.com/linux-surface/linux-surface/wiki/Surface-Go#wi-fi-firmware

                  NOTE: This module option will probably be removed in the near future.
    ''];

    hardware.enableAllFirmware = true;
    hardware.firmware = [
      (pkgs.callPackage ./ath10k-replace.nix {})
    ];

    boot.extraModprobeConfig = mkDefault ''
      options ath10k_core skip_otp=Y
    '';
  };
}