{ name, config, lib, kubenix, ... }:

with lib;

let
  inst-exact = config.submodules.instances.inst-exact.config;
  inst-regex = config.submodules.instances.inst-regex.config;
  inst-latest = config.submodules.instances.inst-latest.config;

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

    options.version = mkOption {
      type = types.str;
      default = "undefined";
    };

    config.submodule.name = "subm";
  };
in {
  imports = with kubenix.modules; [ test submodules ];

  test = {
    name = "submodules-versioning";
    description = "Submodules versioning test";
    assertions = [{
      message = "should select exact version";
      assertion = inst-exact.version == "1.1.0";
    } {
      message = "should select regex version";
      assertion = inst-regex.version == "1.2.1";
    } {
      message = "should select latest version";
      assertion = inst-latest.version == "1.2.1";
    }];
  };

  submodules.imports = [{
    modules = [{
      config.submodule.version = "1.0.0";
      config.version = "1.0.0";
    } submodule];
  } {
    modules = [{
      config.submodule.version = "1.1.0";
      config.version = "1.1.0";
    } submodule];
  } {
    modules = [{
      config.submodule.version = "1.2.0";
      config.version = "1.2.0";
    } submodule];
  } {
    modules = [{
      config.submodule.version = "1.2.1";
      config.version = "1.2.1";
    } submodule];
  }];

  submodules.instances.inst-exact = {
    submodule = "subm";
    version = "1.1.0";
  };

  submodules.instances.inst-regex = {
    submodule = "subm";
    version = "~1.2.*";
  };

  submodules.instances.inst-latest.submodule = "subm";
}
