# Example usage of the reverse proxy utilities
{ lib, namespace, ... }:
let
  inherit (lib.${namespace} - lib.reverseproxy)
    mkReverseProxy
    mkReverseProxies
    templates
    middlewares
    urls
    ;
in
{
  # Example 1: Simple reverse proxy for a local service
  simpleProxy = mkReverseProxy {
    name = "myapp";
    subdomain = "myapp";
    url = "http://127.0.0.1:3000";
  };

  # Example 2: Authenticated service with custom middlewares
  authProxy = mkReverseProxy {
    name = "admin-panel";
    subdomain = "admin";
    url = "http://127.0.0.1:8080";
    middlewares = middlewares.authBasic;
  };

  # Example 3: Container-based service
  containerProxy = mkReverseProxy {
    name = "nextcloud";
    subdomain = "cloud";
    url = urls.container "nextcloud" 80;
    middlewares = middlewares.basic;
  };

  # Example 4: Multiple proxies at once
  multipleProxies = mkReverseProxies [
    {
      name = "grafana";
      subdomain = "grafana";
      url = urls.localhost 3000;
      middlewares = middlewares.authBasic;
    }
    {
      name = "prometheus";
      subdomain = "prometheus";
      url = urls.localhost 9090;
      middlewares = middlewares.internal;
    }
    {
      name = "alertmanager";
      subdomain = "alerts";
      url = urls.localhost 9093;
      middlewares = middlewares.authBasic;
    }
  ];

  # Example 5: Using templates for common patterns
  webappExample = templates.webapp {
    name = "webapp";
    subdomain = "app";
    port = 8080;
  };

  authWebappExample = templates.authWebapp {
    name = "secure-app";
    subdomain = "secure";
    port = 9000;
  };

  containerExample = templates.containerService {
    name = "gitea";
    subdomain = "git";
    containerName = "gitea";
    port = 3000;
  };

  internalExample = templates.internalService {
    name = "internal-api";
    subdomain = "api-internal";
    port = 8000;
  };

  # Example 6: Custom domain and advanced configuration
  customProxy = mkReverseProxy {
    name = "custom-service";
    subdomain = "custom";
    url = "http://10.0.1.100:8080";
    domain = "example.com";
    priority = 20;
    rule = "Host(`custom.example.com`) && PathPrefix(`/api`)";
    middlewares = [
      "crowdsec"
      "whitelist-geoblock"
      "rate-limit"
    ];
  };

  # Example usage in a Traefik configuration:
  #
  # mjallen.services.traefik = {
  #   enable = true;
  #   extraServices = multipleProxies.extraServices;
  #   extraRouters = multipleProxies.extraRouters;
  # };
  #
  # Or for individual proxies:
  #
  # mjallen.services.traefik = {
  #   enable = true;
  #   extraServices = [ simpleProxy.service ];
  #   extraRouters = [{
  #     inherit (simpleProxy.router) subdomain entryPoints middlewares;
  #     service = simpleProxy.router.service;
  #   }];
  # };
}
