## Mount
##
## Mount filesystems

{
  lib,
  pkgs,
  config,
  ...
}:
let
  inherit (lib) mkOption types;
  inherit (pkgs) liminix;

in
{
  options = {
    system.service.mount = mkOption {
      type = liminix.lib.types.serviceDefn;
    };
  };
  imports = [
    ../mdevd.nix
    ../uevent-rule
  ];
  config.system.service.mount =
    let
      svc = config.system.callService ./service.nix {
        partlabel = mkOption {
          type = types.str;
          example = "my-usb-stick";
        };
        mountpoint = mkOption {
          type = types.str;
          example = "/mnt/media";
        };
        options = mkOption {
          type = types.listOf types.str;
          default = [ ];
          example = [
            "noatime"
            "ro"
            "sync"
          ];
        };
        fstype = mkOption {
          type = types.str;
          default = "auto";
          example = "vfat";
        };
      };
    in
    svc
    // {
      build =
        args:
        let
          args' = args // {
            dependencies = (args.dependencies or [ ]) ++ [
              config.services.mdevd
              config.services.devout
            ];
          };
        in
        svc.build args';
    };

  config.programs.busybox = {
    applets = [
      "blkid"
      "findfs"
    ];
    options = {
      FEATURE_BLKID_TYPE = "y";
      FEATURE_MOUNT_FLAGS = "y";
      FEATURE_MOUNT_LABEL = "y";
      FEATURE_VOLUMEID_EXT = "y";
    };
  };
}