import logging

import pytest
import mock
from mlair.run_modules.experiment_setup import ExperimentSetup
from mlair.run_modules.partition_check import PartitionCheck
from mlair.run_modules.run_environment import RunEnvironment


class TestPartitionCheck:

    # @pytest.fixture
    # def obj_super_init(self):
    #     obj = object.__new__(PartitionCheck)
    #     super(PartitionCheck, obj).__init__()
    #     obj.data_store.set("NAME1", 1, "general")
    #     yield obj
    #     RunEnvironment().__del__()

    @pytest.fixture
    @mock.patch("socket.gethostname", return_value="juwels")
    @mock.patch("getpass.getuser", return_value="testUser")
    @mock.patch("os.path.exists", return_value=False)
    @mock.patch("os.makedirs", side_effect=None)
    def obj_with_exp_setup_login(self, mock_host, mock_user,  mock_path, mock_check):
        RunEnvironment().__del__()
        ExperimentSetup(stations=['DEBW107', 'DEBY081', 'DEBW013', 'DEBW076', 'DEBW087', 'DEBW001'],
                        statistics_per_var={'o3': 'dma8eu', 'temp': 'maximum'}, station_type="background")
        pre = object.__new__(PartitionCheck)
        super(PartitionCheck, pre).__init__()
        yield pre
        RunEnvironment().__del__()

    @pytest.fixture
    @mock.patch("socket.gethostname", return_value="hdfmlc01")
    @mock.patch("getpass.getuser", return_value="testUser")
    @mock.patch("os.path.exists", return_value=False)
    @mock.patch("os.makedirs", side_effect=None)
    def obj_with_exp_setup_compute(self, mock_host, mock_user,  mock_path, mock_check):
        RunEnvironment().__del__()
        ExperimentSetup(stations=['DEBW107', 'DEBY081', 'DEBW013', 'DEBW076', 'DEBW087', 'DEBW001'],
                        statistics_per_var={'o3': 'dma8eu', 'temp': 'maximum'}, station_type="background")
        pre = object.__new__(PartitionCheck)
        super(PartitionCheck, pre).__init__()
        yield pre
        RunEnvironment().__del__()

    def test_init(self, caplog):
        ExperimentSetup(stations=['DEBW107', 'DEBY081', 'DEBW013', 'DEBW076', 'DEBW087'],
                        statistics_per_var={'o3': 'dma8eu', 'temp': 'maximum'})
        caplog.clear()
        caplog.set_level(logging.INFO)
        with PartitionCheck():
            assert caplog.record_tuples[0] == ('root', 20, 'PartitionCheck started')

        RunEnvironment().__del__()

    @mock.patch("socket.gethostname", return_value="juwels")
    @mock.patch("getpass.getuser", return_value="testUser")
    @mock.patch("os.path.exists", return_value=False)
    @mock.patch("os.makedirs", side_effect=None)
    def test_run_login(self, mock_host, mock_user,  mock_path, mock_check, obj_with_exp_setup_login, caplog):

        with pytest.raises(OSError) as e:
            obj_with_exp_setup_login.__next__()._run()
        assert "You are on a login node to download data. Use compute nodes and run again if you want to train and " \
               "validate a model." == \
               e.value.args[0]

    @mock.patch("socket.gethostname", return_value="hdfmlc01")
    @mock.patch("getpass.getuser", return_value="testUser")
    @mock.patch("os.path.exists", return_value=False)
    @mock.patch("os.makedirs", side_effect=None)
    def test_run_compute(self, mock_host, mock_user, mock_path, mock_check, obj_with_exp_setup_compute, caplog):
        obj = obj_with_exp_setup_compute.__next__()
        assert obj._run() is None