#!/usr/bin/env python3
import logging
import os
import sys

from edbpotdeploy import cli
from edbpotdeploy import command
from edbpotdeploy.cloud import CloudCliError
from edbpotdeploy.project import Project, ProjectError
from edbpotdeploy.terraform import TerraformCliError
from edbpotdeploy.ansible import AnsibleCliError
from edbpotdeploy.specifications import SpecValidatorError

def configure_project_logging(project, sub_command):

    project.create_log_dir()

    logging.basicConfig(
        filename=project.log_file,
        level=logging.DEBUG,
        format='%(asctime)s %(levelname)7s '+sub_command+': %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
    )

def configure_root_logging(cloud, sub_command):
    # Configure logging module for the sub-commands that do not take project
    # name argument.
    Project.create_root_log_dir()

    logging.basicConfig(
        filename=os.path.join(
            Project.projects_root_path, "log", "%s_%s.log" % (cloud, sub_command)
        ),
        level=logging.DEBUG,
        format='%(asctime)s %(levelname)7s '+sub_command+': %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
    )


if __name__ == "__main__":

    try:

        # Parse the commande line
        env = cli.parse()
        env.postgres_version = "13"
        env.reference_architecture = "EDB-RA-2"
        env.operating_system = "CentOS8"

        # Create a new Commander in charge of executing the sub-command
        commander = command.Commander(env)

        # Configure logging
        if commander.project:
            configure_project_logging(commander.project, env.sub_command)
        else:
            configure_root_logging(env.cloud, env.sub_command)

        logging.debug("env=%s", env)

        # Execute the sub-command
        commander.execute()

    except (
        command.CommanderError,
        CloudCliError,
        ProjectError,
        TerraformCliError,
        AnsibleCliError,
        SpecValidatorError
    ) as e:
        # Update states
        if isinstance(e, TerraformCliError):
            commander.project.update_state('terraform', 'FAIL')
        if isinstance(e, AnsibleCliError):
            commander.project.update_state('ansible', 'FAIL')

        sys.stderr.write("ERROR: %s\n" % str(e))
        sys.exit(2)
    except KeyboardInterrupt as e:
        sys.exit(1)
    except Exception as e:
        # Unhandled error
        sys.stderr.write("ERROR: %s\n" % str(e))
        logging.exception(str(e))
        sys.exit(2)
