#!/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  # NOQA


@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(
    "-port_https", default=443, show_default=True, help="HTTPS port value."
)
@click.option(
    "-port_ipmi", default=623, show_default=True, help="IPMI port value."
)
@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,
    port_https,
    port_ipmi,
    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, port_https, port_ipmi, config, type
    ):
        this_ffdc = ffdc_collector(
            remote,
            username,
            password,
            port_https,
            port_ipmi,
            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, port_https, port_ipmi, 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()
