#!/usr/bin/python3.14

"""Simple Traefik reverse proxy route generator

Following keeps URL path and all 3 variants generate same routes:
  traefik-route api /api 8080
  traefik-route api /api 127.0.0.1:8080
  traefik-route api /api http://127.0.0.1:8080

To strip outside prefix from URL path (/api/method -> http://127.0.0.1:8080/method):
  traefik-route api /api http://127.0.0.1:8080/

To replace URL path:
  traefik-route webSocket /sip http://127.0.0.1:8080/ws
"""

import sys

if len(sys.argv) != 4:
    sys.stderr.write(f"Usage:\n\n\t{sys.argv[0]} routeName /input/path http://service:port/handler\n")
    sys.exit(1)

name = sys.argv[1]
outside = sys.argv[2]
inside = sys.argv[3]

if inside.find("://") == -1:
    inside = f"http://127.0.0.1:{inside}" if inside.isnumeric() else f"http://{inside}"

scheme, host_path = inside.split("://")
pos = host_path.find("/")
if pos == -1:
    host, path = host_path, ""
else:
    host = host_path[:pos]
    path = host_path[pos:]

used_middlewares = """- cors
        - https
        - uAuth"""
middlewares = ""
if outside != path:
    if path == "/":
        used_middlewares += f"\n        - {name}ModifyPath"
        middlewares += f"""
  middlewares:
    {name}ModifyPath:
      stripPrefix:
        prefixes:
          - {outside}
"""
    elif path:
        used_middlewares += f"\n        - {name}ModifyPath"
        middlewares += f"""
  middlewares:
    {name}ModifyPath:
      ReplacePath:
        path: {path}
"""

sys.stdout.write(f"""http:
  routers:
    {name}:
      tls: {{}} # Accessible only via HTTPS
      rule: "PathPrefix(`{outside}`)"
      middlewares:
        {used_middlewares}
      service: {name}
{middlewares}
  services:
    {name}:
      loadBalancer:
        servers:
          - url: {scheme}://{host}
""")
