#
# Copyright (c) 2024 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#

from software_client.common import utils


def do_show(cc, args):
    """Show the software deployments states"""
    resp, data = cc.deploy.show()
    if args.debug:
        utils.print_result_debug(resp, data)

    rc = utils.check_rc(resp, data)
    if rc == 0:
        if len(data) == 0:
            print("No deploy in progress")
        else:
            header_data_list = {"From Release": "from_release",
                                "To Release": "to_release",
                                "RR": "reboot_required",
                                "State": "state"}
            utils.format_data(data, header="state", format_func=lambda x: f"deploy-{x}")
            utils.display_result_list(header_data_list, data)
    else:
        utils.display_info(resp)

    return rc


def do_host_list(cc, args):
    """List of hosts for software deployment """
    resp, data = cc.deploy.host_list()
    if args.debug:
        utils.print_result_debug(resp, data)

    rc = utils.check_rc(resp, data)
    if rc == 0:
        if len(data) == 0:
            print("No deploy in progress")
        else:
            header_data_list = {"Host": "hostname", "From Release": "software_release",
                                "To Release": "target_release", "RR": "reboot_required",
                                "State": "host_state"}
            utils.format_data(data, header="host_state", format_func=lambda x: f"deploy-host-{x}")
            utils.display_result_list(header_data_list, data)
    else:
        utils.display_info(resp)

    return rc


@utils.arg('deployment',
           help='Verify if prerequisites are met for this Deployment ID')
@utils.arg('-f',
           '--force',
           action='store_true',
           required=False,
           help='Allow bypassing non-critical checks')
@utils.arg('--region_name',
           default=None,
           required=False,
           help='Run precheck against a subcloud')
@utils.arg('-s',
           '--snapshot',
           action='store_true',
           required=False,
           help='Execute LVM snapshot feature specific health checks (AIO-SX only)')
def do_precheck(cc, args):
    """Verify whether prerequisites for installing the software deployment are satisfied"""
    resp, data = cc.deploy.precheck(args)
    if args.debug:
        utils.print_result_debug(resp, data)

    rc = utils.check_rc(resp, data)
    if rc == 0:
        if data.get("system_healthy") is False:
            print("System is unhealthy for deploy")
            rc = 1

    utils.display_info(resp)
    return rc


@utils.arg('deployment',
           help='Deployment ID to start')
@utils.arg('-f',
           '--force',
           action='store_true',
           required=False,
           help='Allow bypassing non-critical checks')
@utils.arg('-s',
           '--snapshot',
           action='store_true',
           required=False,
           help='Use LVM snapshots for faster rollback/recovery (AIO-SX only)')
def do_start(cc, args):
    """Start the software deployment"""
    resp, data = cc.deploy.start(args)
    if args.debug:
        utils.print_result_debug(resp, data)

    rc = utils.check_rc(resp, data)
    if rc == 0:
        if "system_healthy" in data and data["system_healthy"] is False:
            print("System is unhealthy for deploy")
            rc = 1

    utils.display_info(resp)
    return rc


@utils.arg('host',
           help="Name of the host that the deploy is triggered")
@utils.arg('-f',
           '--force',
           action='store_true',
           required=False,
           help="Force deploy host")
def do_host(cc, args):
    """Deploy prestaged software deployment to the host"""
    resp, data = cc.deploy.host(args)

    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)


@utils.arg('host',
           help="Name of the host that the deploy is triggered")
@utils.arg('-f',
           '--force',
           action='store_true',
           required=False,
           help="Force deploy host")
def do_host_rollback(cc, args):
    """Deploy prestaged software deployment to the host"""
    resp, data = cc.deploy.host_rollback(args)

    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)


def do_abort(cc, args):
    """Abort the software deployment"""
    resp, data = cc.deploy.abort(args)

    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)


def do_activate(cc, args):
    """Activate the software deployment"""
    resp, data = cc.deploy.activate(args)
    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)


def do_activate_rollback(cc, args):
    """Rolls back the activate of software deployment"""
    resp, data = cc.deploy.activate_rollback(args)
    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)


def do_complete(cc, args):
    """Complete the software deployment"""
    resp, data = cc.deploy.complete(args)

    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)


def do_delete(cc, args):
    """Delete the software deployment"""
    resp, data = cc.deploy.delete(args)

    if args.debug:
        utils.print_result_debug(resp, data)

    utils.display_info(resp)

    return utils.check_rc(resp, data)