#!/usr/bin/env python3
"""DeployHub's CLI using the dhapi module"""

__version__ = '9.2.7'

import os
import stat
import subprocess
import sys
import time
from pprint import pprint

import click
import qtoml
from deployhub import dhapi


@click.command()
@click.argument('action', required=True)
@click.option('--dhurl', help='DeployHub Url', envvar='DHURL')
@click.option('--dhuser', help='DeployHub User', envvar='DHUSER')
@click.option('--dhpass', help='DeployHub Password', envvar='DHPASS')
@click.option('--appname', help='Application Name')
@click.option('--appversion', help='Application Version')
@click.option('--deployenv', help='Deployment Environment')
@click.option('--compname', help='Component Name')
@click.option('--compvariant', help='Component Variant')
@click.option('--compversion', help='Component Version')
@click.option('--from_domain', help='Move from domain')
@click.option('--task', help='Task to use for move')
@click.option('--envvars', help='Env Variables TOML file')
@click.option('--docker', 'kind', flag_value='docker', default=True, help='Component Item Type')
@click.option('--file', 'kind', flag_value='file')
@click.option('--compattr', help='Component Attributes, use multiple time for each attr', multiple=True)
@click.option('--envs', help='Environments to Associate App to, use multiple time for each env', multiple=True)
def main(dhurl, dhuser, dhpass, action, appname, appversion, compname, compvariant, compversion, kind, deployenv, envs, compattr, from_domain, task, envvars):
    """
    ACTION is (deploy, updatecomp, approve, move, envscript) for the type of action to perform.

    deploy: deploy the application to the evironment\n
    approve: approve the application version\n
    move: move the application version using the supplied task\n
    updatecomp: create/replace the component version for the application verion
    """

    if (action.lower() == "deploy" or action.lower() == "updatecomp" or action.lower() == "approve" or action.lower() == "move"):
        if (dhapi.is_empty(dhurl)):
            print("--dhurl is required")
            sys.exit(1)

        if (dhapi.is_empty(dhuser)):
            print("--dhuser is required")
            sys.exit(1)

        if (dhapi.is_empty(dhpass)):
            print("--dhpass is required")
            sys.exit(1)

        applist = []
        if (appname is not None and appname.startswith('@')):
            appname = appname[1:]
            if (os.path.exists(appname)):
                applist = open(appname, 'r').read().split("\n")
        else:
            applist.append(appname)

        print("Logging into DeployHub")
        errors = []

        cookies = dhapi.login(dhurl, dhuser, dhpass, errors)

        if cookies is None:
            if (errors):
                print(errors[0])
            sys.exit(1)

    if (action.lower() == "deploy"):
        # Deploy Application to Environment
        if (dhapi.is_empty(dhurl)):
            print("--dhurl is required")
            sys.exit(1)

        if (dhapi.is_empty(dhuser)):
            print("--dhuser is required")
            sys.exit(1)

        if (dhapi.is_empty(dhpass)):
            print("--dhpass is required")
            sys.exit(1)

        if (dhapi.is_empty(appname)):
            print("--appname is required")
            sys.exit(1)

        if (dhapi.is_empty(deployenv)):
            print("--deployenv is required")
            sys.exit(1)

        for appname in applist:
            print(f'Deploying {appname} to {deployenv}')
            data = dhapi.deploy_application(dhurl, cookies, appname, deployenv)

            deployid = data[0]
            if (deployid < 0):
                print(data[1])
                sys.exit(1)

            print(f"Fetching Logs for {deployid}")
            data = dhapi.get_logs(dhurl, cookies, deployid)

            print(data[1])
            if (data[0]):
                print("Successful")
                sys.exit(0)
            else:
                print("Failed")
                sys.exit(1)
    elif (action.lower() == "updatecomp"):

        if (dhapi.is_empty(dhurl)):
            print("--dhurl is required")
            sys.exit(1)

        if (dhapi.is_empty(dhuser)):
            print("--dhuser is required")
            sys.exit(1)

        if (dhapi.is_empty(dhpass)):
            print("--dhpass is required")
            sys.exit(1)

        if (dhapi.is_empty(appname)):
            print("--appname is required")
            sys.exit(1)

        if (dhapi.is_empty(compname)):
            print("--compname is required")
            sys.exit(1)

        if (dhapi.is_empty(compvariant)):
            compvariant = ""

        # create component version
        print(f"Creating Component")
        compid = dhapi.new_component_version(dhurl, cookies, compname, compvariant, compversion, kind, None)
        print("Creation Done: " + dhapi.get_component_name(dhurl, cookies, compid))

        attrs = {}
        print("Updating Component Attributes\n")
        for attr in compattr:
            if (':' in attr):
                key = attr.split(':')[0]
                value = ':'.join(attr.split(':')[1:])
            else:
                key = attr
                value = ""

            if ("@sha256:" in value):
                value = value.split("@sha256:")[1]

            if (value.startswith('@')):
                value = value[1:]
                if (os.path.exists(value)):
                    value = open(value, 'r').read().replace('\n', '')
                    attrs[key] = value
                else:
                    attrs[key] = ""
            else:
                attrs[key] = value

        gittag = attrs.get("GitTag", None)
        if (dhapi.is_empty(gittag)):
            attrs['GitTag'] = attrs.get('GitBranch', '')

        comptype = attrs.get("CompType", None)
        if (dhapi.is_empty(comptype)):
            attrs['CompType'] = "Application File"

        pprint(attrs)
        print("")

        data = dhapi.update_component_attrs(dhurl, cookies, compname, compvariant, compversion, attrs)
        print("Attribute Update Done")

        for appname in applist:
            print("Creating Application Version")
            data = dhapi.new_application(dhurl, cookies, appname, appversion, envs)
            appid = data[0]
            print("Creation Done: " + dhapi.get_application_name(dhurl, cookies, appid))

            print("Assigning Component Version to Application Version")
            data = dhapi.add_compver_to_appver(dhurl, cookies, appid, compid)
            print("Assignment Done")
    elif (action.lower() == "approve"):
        if (dhapi.is_empty(dhurl)):
            print("--dhurl is required")
            sys.exit(1)

        if (dhapi.is_empty(dhuser)):
            print("--dhuser is required")
            sys.exit(1)

        if (dhapi.is_empty(dhpass)):
            print("--dhpass is required")
            sys.exit(1)

        if (dhapi.is_empty(appname)):
            print("--appname is required")
            sys.exit(1)

        for appname in applist:
            print(f'Approving {appname}')
            data = dhapi.approve_application(dhurl, cookies, appname, appversion)
            print(data[1])
    elif (action.lower() == "move"):
        if (dhapi.is_empty(appname)):
            print("--appname is required")
            sys.exit(1)

        if (dhapi.is_empty(from_domain)):
            print("--from_domain is required")
            sys.exit(1)

        if (dhapi.is_empty(task)):
            print("--task is required")
            sys.exit(1)

        for appname in applist:
            print(f'Moving {appname} from {from_domain}')
            data = dhapi.move_application(dhurl, cookies, appname, appversion, from_domain, task)
            print(data[1])
    elif (action.lower() == "envscript"):
        if (dhapi.is_empty(envvars)):
            print("--envvars is required")
            sys.exit(1)

        print(f'Creating cloudbuild.sh from {envvars}')
        envscript(envvars)
    else:
        print("Action is not defined.  Use deploy or updatecomp for action")
        sys.exit(1)

def envscript(envvars):
    lines = subprocess.run(['cat', envvars], check=False, stdout=subprocess.PIPE).stdout.decode('utf-8')

    vardict = qtoml.loads(lines)

    fp_script = open('cloudbuild.sh', 'w')

    if ("Component" in vardict):
        vardict = vardict["Component"]

    fp_script.write("export BLDDATE=\"" + time.ctime(time.time()) + "\"\n")

    for key in vardict:
        if (key.upper() == "APPLICATIONS"):
            applist = vardict[key]

            fp_applist = open('APPLIST', 'w')

            for app in applist:
                fp_applist.write(app + "\n")

            fp_applist.close()
        else:
            fp_script.write("export COMPONENT_" + key.upper() + '="' + str(vardict[key]) + "\"\n")

    fp_script.close()
    os.chmod('cloudbuild.sh', stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
    

if __name__ == '__main__':
    main()
