# SPDX-FileCopyrightText: 2024 Lubin Bailly <lubin.bailly@dgnum.eu>
#
# SPDX-License-Identifier: EUPL-1.2

{ config, lib, ... }:

let
  inherit (lib)
    mapAttrsToList
    mkEnableOption
    mkOption
    optionalString
    ;

  inherit (lib.types) attrsOf str submodule;

  interface-module =
    { name, config, ... }:
    {
      options = {
        enable = mkEnableOption "the PoE for this interface";
        xml = mkOption {
          type = str;
          visible = false;
          readOnly = true;
        };
      };
      config.xml = ''
        <interface><name>${name}</name>${optionalString (!config.enable) "<disable/>"}</interface>
      '';
    };
in
{
  options = {
    poe.interfaces = mkOption {
      type = attrsOf (submodule interface-module);
      default = { };
      description = ''
        PoE configuration of interfaces.
      '';
    };
    netconf.xmls.poe = mkOption {
      type = str;
      visible = false;
      readOnly = true;
    };
  };
  config.netconf.xmls.poe = ''
    <poe operation="replace">
      ${builtins.concatStringsSep "" (mapAttrsToList (_: intf: intf.xml) config.poe.interfaces)}
    </poe>
  '';
}