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

with lib;

{
  options = {
    internal = mkOption {
      description = "Whether to only make this Way available internally. Will use the internal subdomain.";
      type = types.bool;
      default = false;
    };

    name = mkOption {
      description = "Domain name to use.";
      type = types.str;
      default = let
        basename = "${name}.${config.domainSuffix}";
      in if config.wildcard then "~^(.+)\.${lib.escapeRegex basename}$" else basename;
    };

    dnsRecord = {
      name = mkOption {
        description = "DNS record name for this Way.";
        type = types.str;
        default = if config.wildcard then "^[^_].+\\.${lib.escapeRegex name}" else name;
      };

      value = mkOption {
        description = "DNS record value for this Way.";
        type = types.deferredModule;
        default = {
          consulService = "${name}.ways-proxy";
          rewrite.type = lib.mkIf config.wildcard "regex";
        };
      };
    };

    target = mkOption {
      type = types.str;
    };

    wildcard = mkOption {
      type = types.bool;
      default = false;
    };

    consulService = mkOption {
      type = types.str;
    };

    bucket = mkOption {
      type = types.str;
    };

    healthCheckPath = mkOption {
      type = types.path;
      default = "/.well-known/ways/internal-health-check";
    };

    useConsul = mkOption {
      type = types.bool;
      internal = true;
      default = false;
    };

    nginxUpstreamName = mkOption {
      type = types.str;
      internal = true;
    };

    domainSuffixInternal = mkOption {
      type = types.str;
      internal = true;
    };

    domainSuffixExternal = mkOption {
      type = types.str;
      internal = true;
    };

    domainSuffix = mkOption {
      type = types.str;
      internal = true;
      default = if config.internal then config.domainSuffixInternal else config.domainSuffixExternal;
    };

    extras = mkOption {
      description = "Extra configuration to pass to the nginx virtual host submodule.";
      type = types.deferredModule;
      default = {};
    };
  };

  config = lib.mkMerge [
    (lib.mkIf options.consulService.isDefined {
      useConsul = true;
      nginxUpstreamName = "ways_upstream_${builtins.hashString "md5" options.consulService.value}";
      target = "http://${options.nginxUpstreamName.value}";
    })
    (lib.mkIf options.bucket.isDefined {
      consulService = "garage-web";
    })
  ];
}