import copy
import os
import unittest

from integration.partial.integration_test_utils import IntegrationTestUtils
from integration.test_suites.epi_test_suite import BaseEpiTestSuite


class TestEpi(BaseEpiTestSuite.EpiTestSuite):

    @classmethod
    def setUpClass(cls) -> None:
        """
        This is overridden in the class setup function to ensure that the value is not set from a previous run
        when being run in a TestSuite
        """
        IntegrationTestUtils.TEST_OUT_PATH = None

    def set_expected_values(self):
        super().set_expected_values()
        BaseEpiTestSuite.EpiTestSuite.TEST_START_DATE = '20221001'
        BaseEpiTestSuite.EpiTestSuite.TEST_JOB_DIR = "EPI_" + BaseEpiTestSuite.EpiTestSuite.TEST_START_DATE


    def setUp(self) -> None:

        self.set_expected_values()

        if BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH is None or not os.path.isdir(BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH):
            TestEpi.write_temp_run_config_files()
            TestEpi.unpack_dependencies()
            # TestEpi.run_epi_pipeline()
        else:
            print(f"output in {BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH} already written, skipping rerun")


    @staticmethod
    def write_temp_run_config_files():
        nowstring: str = IntegrationTestUtils.get_now_string()
        prefix: str = "temp_epi_" + nowstring
        # prefix: str = ""

        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)
        BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH = IntegrationTestUtils.TEST_WORKSPACE_PATH + prefix + os.sep
        run_dict['WorkspacePathout'] = BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH
        run_dict['WorkspacePath'] = BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH
        run_dict['ServerName'] = ''  # nothing, as local machine
        run_dict['Epidemiology']['CalculationSpanDays'] = [0, 1]

        os.makedirs(BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH, exist_ok = True)
        IntegrationTestUtils.TEMP_CONFIG_FILE_NAME = BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH + "temp_config.json"
        name = IntegrationTestUtils.TEMP_CONFIG_FILE_NAME
        IntegrationTestUtils.write_json_file(run_dict, name)


    @staticmethod
    def unpack_dependencies():
        IntegrationTestUtils.unpack_zip(IntegrationTestUtils.EXAMPLE_DEPO_FILE_PATH,
                                        BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH)
        IntegrationTestUtils.unpack_zip(IntegrationTestUtils.EXAMPLE_ENV_SUIT_FILE_PATH,
                                        BaseEpiTestSuite.EpiTestSuite.TEST_OUT_PATH)


    @staticmethod
    def run_epi_pipeline():
        component = 'Epidemiology'
        IntegrationTestUtils.run_unittest_pipeline(component, BaseEpiTestSuite.EpiTestSuite.TEST_START_DATE)


if __name__ == '__main__':
    unittest.main()