#!/usr/bin/env python3

r"""
CLI FFDC Collector.
"""

import os
import sys
import click

# ---------Set sys.path for cli command execution---------------------------------------
# Absolute path to openbmc-test-automation/ffdc
abs_path = os.path.abspath(os.path.dirname(sys.argv[0]))
full_path = abs_path.split('ffdc')[0]
sys.path.append(full_path)
# Walk path and append to sys.path
for root, dirs, files in os.walk(full_path):
    for found_dir in dirs:
        sys.path.append(os.path.join(root, found_dir))

from ffdc_collector import ffdc_collector


@click.command(context_settings=dict(help_option_names=['-h', '--help']))
@click.option('-r', '--remote',
              help="Hostname/IP of the remote host")
@click.option('-u', '--username',
              help="Username of the remote host.")
@click.option('-p', '--password',
              help="Password of the remote host.")
@click.option('-c', '--config', default=abs_path + "/ffdc_config.yaml",
              show_default=True, help="YAML Configuration file for log collection.")
@click.option('-l', '--location', default="/tmp",
              show_default=True, help="Location to save logs")
@click.option('-t', '--type',
              help="OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU, SLES, AIX")
@click.option('-rp', '--protocol', default="ALL",
              show_default=True,
              help="Select protocol to communicate with remote host.")
@click.option('-e', '--env_vars', show_default=True,
              help="Environment variables e.g: {'var':value}")
@click.option('-ec', '--econfig', show_default=True,
              help="Predefine environment variables, refer en_vars_template.yaml ")
@click.option('--log_level', default="INFO",
              show_default=True,
              help="Log level (CRITICAL, ERROR, WARNING, INFO, DEBUG)")
def cli_ffdc(remote,
             username,
             password,
             config,
             location,
             type,
             protocol,
             env_vars,
             econfig,
             log_level):
    r"""
    Stand alone CLI to generate and collect FFDC from the selected target.
    """

    click.echo("\n********** FFDC (First Failure Data Collection) Starts **********")

    if input_options_ok(remote, username, password, config, type):
        this_ffdc = ffdc_collector(remote,
                                   username,
                                   password,
                                   config,
                                   location,
                                   type,
                                   protocol,
                                   env_vars,
                                   econfig,
                                   log_level)
        this_ffdc.collect_ffdc()

        if len(os.listdir(this_ffdc.ffdc_dir_path)) == 0:
            click.echo("\n\tFFDC Collection from " + remote + " has failed.\n\n")
        else:
            click.echo(str("\n\t" + str(len(os.listdir(this_ffdc.ffdc_dir_path)))
                           + " files were retrieved from " + remote))
            click.echo("\tFiles are stored in " + this_ffdc.ffdc_dir_path)

        click.echo("\tTotal elapsed time " + this_ffdc.elapsed_time + "\n\n")
    click.echo("\n********** FFDC Finishes **********\n\n")


def input_options_ok(remote, username, password, config, type):
    r"""
    Verify script options exist via CLI options or environment variables.
    """

    all_options_ok = True

    if not remote:
        all_options_ok = False
        print("\
        \n\tERROR: Name/IP of the remote host is not specified in CLI options.")
    if not username:
        all_options_ok = False
        print("\
        \n\tERROR: User of the remote host is not specified in CLI options.")
    if not password:
        all_options_ok = False
        print("\
        \n\tERROR: Password of the user remote host is not specified in CLI options.")
    if not type:
        all_options_ok = False
        print("\
        \n\tERROR: Remote host os type is not specified in CLI options.")
    if not os.path.isfile(config):
        all_options_ok = False
        print("\
        \n\tERROR: Config file %s is not found.  Please verify path and filename." % config)

    return all_options_ok


if __name__ == '__main__':
    cli_ffdc()
