#!/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', envvar='OPENBMC_HOST',
              help="Name/IP of the remote (targeting) host. [default: OPENBMC_HOST]")
@click.option('-u', '--username', envvar='OPENBMC_USERNAME',
              help="User on the remote host with access to FFDC files.[default: OPENBMC_USERNAME]")
@click.option('-p', '--password', envvar='OPENBMC_PASSWORD',
              help="Password for user on remote host. [default: OPENBMC_PASSWORD]")
@click.option('-c', '--ffdc_config', default=abs_path + "/ffdc_config.yaml",
              show_default=True, help="YAML Configuration file listing commands and files for FFDC.")
@click.option('-l', '--location', default="/tmp",
              show_default=True, help="Location to store collected FFDC data")
@click.option('-t', '--remote_type',
              help="OS type of the remote (targeting) host. OPENBMC, RHEL, UBUNTU, SLES, AIX")
@click.option('-rp', '--remote_protocol', default="ALL",
              show_default=True,
              help="Select protocol (SSH, SCP, REDFISH) to communicate with remote host. \
                    Default: all available.")
@click.option('-e', '--env_vars', show_default=True,
              help="Environment variables as dictionary e.g: {'var':value}")
@click.option('--log_level', default="INFO",
              show_default=True,
              help="python logging level (CRITICAL, ERROR, WARNING, INFO, DEBUG)")
def cli_ffdc(remote, username, password,
             ffdc_config, location, remote_type,
             remote_protocol, env_vars, 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, ffdc_config, remote_type):
        thisFFDC = FFDCCollector(remote, username, password,
                                 ffdc_config, location, remote_type,
                                 remote_protocol, env_vars, 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, ffdc_config, remote_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 or env OPENBMC_HOST.")
    if not username:
        all_options_ok = False
        print("\
        \n>>>>>\tERROR: User on the remote host is not specified in CLI options or env OPENBMC_USERNAME.")
    if not password:
        all_options_ok = False
        print("\
        \n>>>>>\tERROR: Password for user on remote host is not specified in CLI options "
              + "or env OPENBMC_PASSWORD.")
    if not remote_type:
        all_options_ok = False
        print("\
        \n>>>>>\tERROR: Remote host os type is not specified in CLI options.")
    if not os.path.isfile(ffdc_config):
        all_options_ok = False
        print("\
        \n>>>>>\tERROR: Config file %s is not found.  Please verify path and filename." % ffdc_config)

    return all_options_ok


if __name__ == '__main__':
    cli_ffdc()
