import copy
import os
import sys
from unittest import TestLoader, TestSuite

from HtmlTestRunner import HTMLTestRunner

from integration.partial.integration_test_utils import IntegrationTestUtils
from integration.test_suites.depo_test_suite import BaseDepoTestSuite


class FullTestDeposition(BaseDepoTestSuite.DepoTestSuite):

    def set_expected_values(self):
        self.EA_CSV_COUNT = 9
        self.ETH_CSV_COUNT = 9
        self.EA_PNG_COUNT = 3
        self.ETH_PNG_COUNT = 3


    def setUp(self) -> None:

        self.set_expected_values()

        if BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH is None \
                or not os.path.isdir(BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH):
            FullTestDeposition.write_temp_run_config_file()
            FullTestDeposition.run_depo_pipeline()
        else:
            print(f"output in {BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH} already written, skipping rerun")


    @staticmethod
    def write_temp_run_config_file():

        default_config = IntegrationTestUtils.DEFAULT_CONFIG_FILE_PATH
        default_config_dict: dict = IntegrationTestUtils.load_json_file(default_config)
        run_dict: dict = copy.deepcopy(default_config_dict)
        # BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH = IntegrationTestUtils.TEST_WORKSPACE_PATH + prefix + os.sep
        run_dict['WorkspacePathout'] = BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH
        run_dict['WorkspacePath'] = BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH

        os.makedirs(BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH, exist_ok = True)
        IntegrationTestUtils.TEMP_CONFIG_FILE_NAME = BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH + "temp_config.json"
        IntegrationTestUtils.write_json_file(run_dict, IntegrationTestUtils.TEMP_CONFIG_FILE_NAME)


    @staticmethod
    def run_depo_pipeline():
        component = 'Deposition'
        IntegrationTestUtils.run_external_pipeline(component,
                                                   BaseDepoTestSuite.DepoTestSuite.TEST_START_DATE,
                                                   IntegrationTestUtils.EMAIL_CRED_PATH)


if __name__ == '__main__':

    _parser = IntegrationTestUtils.build_arg_parser()

    _args = _parser.parse_args()
    _config_file: str = _args.config
    _outdir: str = _args.outdir
    _email_cred_path: str = _args.email_cred
    _test_report_dir: str = _args.test_report_dir
    _run_date_type: str = _args.run_date_type
    _custom_run_date: str = _args.custom_run_date

    IntegrationTestUtils.DEFAULT_CONFIG_FILE_PATH = _config_file

    nowstring: str = IntegrationTestUtils.get_now_string()
    # prefix: str = "temp_depo_" + nowstring
    prefix: str = "temp_depo"
    BaseDepoTestSuite.DepoTestSuite.TEST_OUT_PATH = _outdir + prefix + os.sep
    IntegrationTestUtils.EMAIL_CRED_PATH = _email_cred_path

    BaseDepoTestSuite.DepoTestSuite.TEST_START_DATE = IntegrationTestUtils.generate_run_date(_run_date_type, _custom_run_date)

    BaseDepoTestSuite.DepoTestSuite.TEST_JOB_DIR = "DEPOSITION_" + BaseDepoTestSuite.DepoTestSuite.TEST_START_DATE

    #  Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone)
    sys.argv[1:] = _args.unittest_args
    tests: TestSuite = TestLoader().loadTestsFromTestCase(FullTestDeposition)

    if _test_report_dir is None:
        _test_report_dir = BaseDepoTestSuite.DepoTestSuite.TEST_JOB_DIR

    runner = HTMLTestRunner(output=_test_report_dir, combine_reports = True)
    runner.run(tests)