# ============================================================================
# FS & Storage Configuration
# ============================================================================
# This module defines:
# - Disko partition layout (EFI, swap, root)
# - Filesystem options (device, swap size)

{ config, lib, ... }:

{
  options.athenix = {
    host.filesystem = {
      device = lib.mkOption {
        type = lib.types.nullOr lib.types.str;
        default = null;
        description = "The main disk device to use for installation.";
      };
      useSwap = lib.mkOption {
        type = lib.types.bool;
        default = true;
        description = "Whether to create and use a swap partition.";
      };
      swapSize = lib.mkOption {
        type = lib.types.nullOr lib.types.str;
        default = null;
        description = "The size of the swap partition.";
      };
    };
  };

  config = {
    # ========== Disk Partitioning (Disko) ==========
    disko.enableConfig = lib.mkDefault (config.athenix.host.filesystem.device != null);

    disko.devices = {
      disk.main = {
        type = "disk";
        device = config.athenix.host.filesystem.device;
        content = {
          type = "gpt";
          partitions = {
            # EFI System Partition
            ESP = {
              name = "ESP";
              label = "BOOT";
              size = "1G";
              type = "EF00";
              content = {
                type = "filesystem";
                format = "vfat";
                mountpoint = "/boot";
                mountOptions = [ "umask=0077" ];
                extraArgs = [
                  "-n"
                  "BOOT"
                ];
              };
            };

            # Swap Partition (size configurable per host)
            swap = lib.mkIf config.athenix.host.filesystem.useSwap {
              name = "swap";
              label = "swap";
              size = config.athenix.host.filesystem.swapSize;
              content = {
                type = "swap";
              };
            };

            # Root Partition (takes remaining space)
            root = {
              name = "root";
              label = "root";
              size = "100%";
              content = {
                type = "filesystem";
                format = "ext4";
                mountpoint = "/";
                extraArgs = [
                  "-L"
                  "ROOT"
                ];
              };
            };
          };
        };
      };
    };
  };
}
