#!/usr/bin/env python3

import argparse
import json
import re


def assemble_drive(
    environment,
    function,
    instance,
    number,
):
    domainname = "drive.sunet.se"
    if environment != "prod":
        domainname = f"drive.{environment}.sunet.se"
    if instance not in ["common", "gss", "lookup", "multinode", "internal"]:
        domainname = f"{instance}.{domainname}"
    return f"{function}{number}.{domainname}"


def assemble_platform(
    environment,
    function,
    instance,
    location,
    number,
    service,
):
    return f"{instance}-{location}-{environment}-{function}-{number}.{service}.sunet.se"


def parse_drive(fqdn: str) -> str:
    type_regex = r"-*[1-9]*\..*"
    function = re.sub(type_regex, "", fqdn)

    env_regex = r".*(pilot|test).*"
    environment = re.sub(env_regex, r"\1", fqdn)
    domainname = f"drive.{environment}.sunet.se"

    if environment not in ["pilot", "test"]:
        environment = "prod"
        domainname = "drive.sunet.se"

    instance = fqdn.split(".")[1]
    if instance == "drive":
        instance = "common"
    elif function in ["gss", "lookup"]:
        instance = function
    elif function in ["gssbackup", "gss-db"]:
        instance = "gss"
    elif function in ["lookupbackup", "lookup-db"]:
        instance = "lookup"
    elif function.startswith("multinode") or function == "kube":
        instance = "multinode"

    hostname = fqdn.split(".")[0]
    number = hostname[-1]
    location = "sto4"
    if number == "3":
        location = "sto3"
    if number == "1":
        location = "dco"
    return json.dumps({
        "domainname": domainname,
        "environment": environment,
        "function": function,
        "hostname": hostname,
        "instance": instance,
        "location": location,
        "number": number,
        "service": "drive",
    })


def parse_platform(fqdn) -> str:
    domainname = ".".join([x for x in fqdn.split(".")[1:]])
    hostname = fqdn.split(".")[0]
    instance, location, environment, function, number = hostname.split("-")
    service = fqdn.split(".")[1]
    return json.dumps({
        "domainname": domainname,
        "environment": environment,
        "function": function,
        "hostname": hostname,
        "instance": instance,
        "location": location,
        "number": number,
        "service": service,
    })


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--flavor", "-f", type=str, default="platform")
    subparsers = parser.add_subparsers(title="subcommands", dest="command")
    parse = subparsers.add_parser(name="parse")
    parse.add_argument("--fqdn", "-F", type=str, required=True)
    assemble = subparsers.add_parser(name="assemble")
    assemble.add_argument("--environment", "-e", type=str, default="")
    assemble.add_argument("--function", "-F", type=str, default="")
    assemble.add_argument("--instance", "-i", type=str, default="")
    assemble.add_argument("--location", "-l", type=str, default="")
    assemble.add_argument("--number", "-n", type=str, default="")
    assemble.add_argument("--service", "-s", type=str, default="")
    args = parser.parse_args()
    flavor = args.flavor
    command = args.command
    if command == "parse":
        if flavor == "drive":
            print(parse_drive(args.fqdn))
        else:
            print(parse_platform(args.fqdn))
    elif command == "assemble":
        if flavor == "drive":
            print(
                assemble_drive(
                    args.environment, args.function, args.instance, args.number
                )
            )
        else:
            print(
                assemble_platform(
                    args.environment,
                    args.function,
                    args.instance,
                    args.location,
                    args.number,
                    args.service,
                )
            )
    else:
        parser.print_help()


if __name__ == "__main__":
    main()