#!/usr/bin/env python3

import json
import subprocess
import sys
from pathlib import Path

from jinja2 import Environment, FileSystemLoader


def get_terraform_outputs():
    result = subprocess.run(
        ["terraform", "output", "-json"],
        cwd="../terraform",
        capture_output=True,
        text=True,
    )

    if result.returncode != 0:
        print(f"Error running terraform output: {result.stderr}")
        sys.exit(1)

    return json.loads(result.stdout)


def main():
    outputs = get_terraform_outputs()

    control_plane_names = outputs["control_plane_names"]["value"]
    control_plane_ips = outputs["control_plane_ips"]["value"]
    control_plane_private_ips = outputs["control_plane_private_ips"]["value"]
    worker_names = outputs["worker_names"]["value"]
    worker_ips = outputs["worker_ips"]["value"]
    worker_private_ips = outputs["worker_private_ips"]["value"]
    kube_api_lb_ip = outputs.get("kube_api_lb_ip", {}).get("value", control_plane_ips[0])

    control_planes = [
        {
            "name": name,
            "public_ip": public_ip,
            "private_ip": private_ip,
        }
        for name, public_ip, private_ip in zip(
            control_plane_names, control_plane_ips, control_plane_private_ips
        )
    ]

    workers = [
        {
            "name": name,
            "public_ip": public_ip,
            "private_ip": private_ip,
        }
        for name, public_ip, private_ip in zip(
            worker_names, worker_ips, worker_private_ips
        )
    ]

    data = {
        "control_planes": control_planes,
        "workers": workers,
        "private_key_file": outputs["ssh_private_key_path"]["value"],
        "kube_api_lb_ip": kube_api_lb_ip,
    }

    env = Environment(loader=FileSystemLoader("."))
    template = env.get_template("inventory.tmpl")
    inventory = template.render(**data)

    Path("inventory.ini").write_text(inventory)
    print("Generated inventory.ini")


if __name__ == "__main__":
    main()
