#!/usr/bin/python3
import argparse
import sys

from tunnel_script.client import ServiceManagerClient
from tunnel_script.config import CONFIG_FILE
from tunnel_script.logger import setup_logger

logger = setup_logger("/var/log/replibit/tunnel-script.log")


def setup_tunnel_port(server_id, tunnel_purpose, machine_id=None, password=None):
    try:
        client = ServiceManagerClient(CONFIG_FILE, logger)
        return client.setup_tunnel_port(server_id, tunnel_purpose, machine_id, password)
    except Exception:
        logger.exception("Unable to setup {} tunnel port for server {}".format(tunnel_purpose, server_id))
        return None


def get_tunnel_address(tunnel_purpose, target_type, target_id):
    try:
        client = ServiceManagerClient(CONFIG_FILE, logger)
        return client.get_tunnel_address(tunnel_purpose, target_type, target_id)
    except Exception:
        logger.exception("Unable to get {} tunnel address for {} {}".format(tunnel_purpose, target_type, target_id))
        return None


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="DTS port setup utility")
    parser.add_argument("server_id", help="Server ID")
    parser.add_argument("tunnel_purpose", help="The purpose of communication channel")
    parser.add_argument("--machine_id", default=None, help="Virtual machine ID")
    parser.add_argument("--password", default=None, help="The password")
    parser.add_argument("--target_type", default=None, help='Target type ("appliance", "vault" or "device")')
    parser.add_argument("--sid", default=None, help="Appliance or Vault SID")

    args = parser.parse_args()

    if args.target_type:
        target_id = args.machine_id if args.target_type == "device" else args.sid
        logger.info("Getting {} tunnel address for {} {}".format(args.tunnel_purpose, args.target_type, target_id))
        response = get_tunnel_address(args.tunnel_purpose, args.target_type, target_id)
    else:
        logger.info("Allocating {} tunnel port for server {}".format(args.tunnel_purpose, args.server_id))
        response = setup_tunnel_port(args.server_id, args.tunnel_purpose, args.machine_id, args.password)

    if not response:
        msg = "Operation failed"
        print(msg, file=sys.stderr)
        logger.error(msg)
        sys.exit(1)

    logger.info("Operation done")
    print(response)

    sys.exit(0)
