#!/usr/bin/env python

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 FFDCCollector


@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):
        thisFFDC = FFDCCollector(remote,
                                 username,
                                 password,
                                 config,
                                 location,
                                 type,
                                 protocol,
                                 env_vars,
                                 econfig,
                                 log_level)
        thisFFDC.collect_ffdc()

        if len(os.listdir(thisFFDC.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(thisFFDC.ffdc_dir_path)))
                           + " files were retrieved from " + remote))
            click.echo("\tFiles are stored in " + thisFFDC.ffdc_dir_path)

        click.echo("\tTotal elapsed time " + thisFFDC.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()