#!/usr/bin/env python3
import traceback
import sys
import os

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from config import cfg as _cfg
_paths = _cfg.paths

from om_log import LOGGER as LOG
from storage_operate.dr_deploy_operate.dr_deploy_pre_check import DRDeployPreCheck, ParamCheck
from storage_operate.dr_deploy_operate.dr_deploy import DRDeploy
from storage_operate.dr_deploy_operate.dr_undeploy import UNDeploy
from storage_operate.dr_deploy_operate.dr_deploy_progress_query import ProgressQuery
from storage_operate.dr_deploy_operate.dr_deploy_switchover import SwitchOver, DRRecover, FailOver
from storage_operate.dr_deploy_operate.update_dr_params import UpdateDRParams

HELP_MSG = ("example:\n"
            "        sh appctl.sh dr_operate pre_check active/standby --conf=config_file_path\n"
            "        sh appctl.sh dr_operate deploy standby/active\n"
            "        sh appctl.sh dr_operate progress_query --action=deploy --display=table/json\n"
            "        sh appctl.sh dr_operate undeploy active/standby\n"
            "        sh appctl.sh dr_operate switch_over\n"
            "        sh appctl.sh dr_operate recover\n"
            "        sh appctl.sh dr_operate fail_over\n"
            "        sh appctl.sh dr_operate update_conf\n")


class DRDeployOperate(object):
    @staticmethod
    def pre_check():
        del sys.argv[1]
        dr_pre_check = DRDeployPreCheck()
        dr_pre_check.execute()

    @staticmethod
    def deploy():
        del sys.argv[1]
        dr_pre_check = DRDeploy()
        dr_pre_check.execute()

    @staticmethod
    def param_check():
        del sys.argv[1]
        dr_pre_check = ParamCheck()
        dr_pre_check.execute()

    @staticmethod
    def progress_query():
        del sys.argv[1]
        dr_process_query = ProgressQuery()
        dr_process_query.execute()

    @staticmethod
    def undeploy():
        del sys.argv[1]
        dr_pre_check = UNDeploy()
        dr_pre_check.execute()

    @staticmethod
    def switch_over():
        del sys.argv[1]
        switch_over = SwitchOver()
        switch_over.execute()

    @staticmethod
    def recover():
        del sys.argv[1]
        dr_recover = DRRecover()
        dr_recover.execute()

    @staticmethod
    def fail_over():
        del sys.argv[1]
        fail_over = FailOver()
        fail_over.execute()

    @staticmethod
    def update_conf():
        del sys.argv[1]
        update_dr_params = UpdateDRParams()
        update_dr_params.execute()

    @staticmethod
    def help():
        print(HELP_MSG)


def main():
    err_msg = "Failed to parse the DR setup command, deploy operate commands " \
              + HELP_MSG
    dr_deploy_operate = DRDeployOperate()
    if len(sys.argv) <= 1:
        raise Exception(err_msg)
    action = sys.argv[1]
    try:
        getattr(dr_deploy_operate, action)
    except AttributeError as _err:
        raise Exception(err_msg) from _err
    getattr(dr_deploy_operate, action)()


if __name__ == "__main__":
    try:
        main()
    except Exception as err:
        exit(str(err))