#!/usr/bin/env python

import requests

from kubernetes import client, config
from rich.console import Console
from time import sleep

# Essential services
ingresses = [
    {
        'name': 'argocd-server',
        'fullname': 'ArgoCD',
        'namespace': 'argocd'
    },
    {
        'name': 'hajimari',
        'fullname': 'Homepage',
        'namespace': 'hajimari'
    },
    {
        'name': 'vault',
        'fullname': 'Vault',
        'namespace': 'vault'
    },
    {
        'name': 'gitea',
        'fullname': 'Gitea',
        'namespace': 'gitea'
    }
]


def wait_app(name: str, fullname: str, namespace: str) -> None:
    console = Console()
    success = False

    with console.status(f"Waiting for {fullname}"):
        while not success:
            try:
                ingress = client.NetworkingV1Api().read_namespaced_ingress(
                    name,
                    namespace
                )
                url = f"https://{ingress.spec.rules[0].host}"
                requests.get(url, verify=False).raise_for_status()
                console.log(f"{fullname} is ready, visit {url}")
                success = True
            except Exception:
                sleep(60)


def main() -> None:
    Console().rule("Waiting for essential applications")
    config.load_kube_config(config_file='./metal/kubeconfig.yaml')
    requests.urllib3.disable_warnings()

    for ingress in ingresses:
        wait_app(ingress['name'], ingress['fullname'], ingress['namespace'])

    print("There's more, but you can start exploring right away!")


if __name__ == '__main__':
    main()
