{
  name,
  config,
  lib,
  kubenix,
  ...
}:
with lib; let
  inherit (config.submodules.instances) instance1;
  inherit (config.submodules.instances) instance2;
  inherit (config.submodules.instances) instance3;
  inherit (config.submodules.instances) instance4;
  inherit (config.submodules.instances) instance5;
  inherit (config.submodules.instances) versioned-submodule;

  submodule = {...}: {
    imports = [kubenix.modules.submodule];

    options.submodule.args = {
      value = mkOption {
        description = "Submodule value";
        type = types.str;
      };

      defaultValue = mkOption {
        description = "Submodule default value";
        type = types.str;
      };
    };
  };
in {
  imports = with kubenix.modules; [test submodules];

  test = {
    name = "submodules-defaults";
    description = "Simple submodule test";
    assertions = [
      {
        message = "should apply defaults by tag1";
        assertion = instance1.config.submodule.args.value == "value1";
      }
      {
        message = "should apply defaults by tag2";
        assertion = instance2.config.submodule.args.value == "value2";
      }
      {
        message = "should apply defaults by tag2";
        assertion = instance3.config.submodule.args.value == "value2";
      }
      {
        message = "should apply defaults to all";
        assertion =
          instance1.config.submodule.args.defaultValue
          == "value"
          && instance2.config.submodule.args.defaultValue == "value";
      }
      {
        message = "instance1 and instance3 should have value of default-value";
        assertion = instance3.config.submodule.args.defaultValue == "default-value";
      }
      {
        message = "should apply defaults by submodule name";
        assertion = instance4.config.submodule.args.value == "value4";
      }
      {
        message = "should apply defaults by custom condition";
        assertion = instance5.config.submodule.args.defaultValue == "my-custom-value";
      }
      {
        message = "should apply defaults to versioned submodule";
        assertion = versioned-submodule.config.submodule.args.defaultValue == "versioned-submodule";
      }
    ];
  };

  submodules.imports = [
    {
      modules = [
        submodule
        {
          submodule = {
            name = "submodule1";
            tags = ["tag1"];
          };
        }
      ];
    }
    {
      modules = [
        submodule
        {
          submodule = {
            name = "submodule2";
            tags = ["tag2"];
          };
        }
      ];
    }
    {
      modules = [
        submodule
        {
          submodule = {
            name = "submodule3";
            tags = ["tag2"];
          };
        }
      ];
    }
    {
      modules = [
        submodule
        {
          submodule = {
            name = "submodule4";
          };
        }
      ];
    }
    {
      modules = [
        submodule
        {
          submodule = {
            name = "submodule5";
          };
          submodule.args.value = "custom-value";
        }
      ];
    }
    {
      modules = [
        submodule
        {
          submodule = {
            name = "versioned-submodule";
            version = "2.0.0";
          };
        }
      ];
    }
  ];

  submodules.defaults = [
    {
      default.submodule.args.defaultValue = mkDefault "value";
    }
    {
      tags = ["tag1"];
      default.submodule.args.value = mkDefault "value1";
    }
    {
      tags = ["tag2"];
      default.submodule.args.value = mkDefault "value2";
    }
    {
      name = "submodule4";
      default.submodule.args.value = mkDefault "value4";
    }
    {
      default = {config, ...}: {
        submodule.args.defaultValue = mkIf (config.submodule.args.value == "custom-value") "my-custom-value";
      };
    }
    {
      name = "versioned-submodule";
      version = "2.0.0";
      default.submodule.args.value = mkDefault "versioned";
    }
  ];

  submodules.instances.instance1.submodule = "submodule1";
  submodules.instances.instance2.submodule = "submodule2";
  submodules.instances.instance3 = {
    submodule = "submodule3";
    args.defaultValue = "default-value";
  };
  submodules.instances.instance4.submodule = "submodule4";
  submodules.instances.instance5.submodule = "submodule5";
  submodules.instances.versioned-submodule = {
    submodule = "versioned-submodule";
    args.defaultValue = "versioned-submodule";
  };
}
