import unittest
from aiva.config import AIVAConfig, DEFAULT_HYSTERESIS
import json
import os

class TestAIVAConfig(unittest.TestCase):

    def setUp(self):
        # Create a temporary config file for testing
        self.config_file = 'test_config.json'
        self.valid_config_data = {
            'critical': {'hysteresis': 0.1},
            'warning': {'hysteresis': 0.05},
            'info': {}
        }
        self.invalid_config_data_negative_hysteresis = {
            'critical': {'hysteresis': -0.1}
        }

        self.invalid_config_data_hysteresis_too_high = {
            'critical': {'hysteresis': 1.1}
        }

        self.invalid_config_data_invalid_type = {
            'critical': {'hysteresis': "invalid"}
        }

        with open(self.config_file, 'w') as f:
            json.dump(self.valid_config_data, f)

    def tearDown(self):
        # Remove the temporary config file
        if os.path.exists(self.config_file):
            os.remove(self.config_file)

    def test_load_config(self):
        config = AIVAConfig(self.config_file)
        self.assertEqual(config.config_data, self.valid_config_data)

    def test_load_config_file_not_found(self):
        config = AIVAConfig('nonexistent_config.json')
        self.assertEqual(config.config_data, {})

    def test_get_hysteresis_configured(self):
        config = AIVAConfig(self.config_file)
        self.assertEqual(config.get_hysteresis('critical'), 0.1)
        self.assertEqual(config.get_hysteresis('warning'), 0.05)

    def test_get_hysteresis_default(self):
        config = AIVAConfig(self.config_file)
        self.assertEqual(config.get_hysteresis('info'), DEFAULT_HYSTERESIS)
        self.assertEqual(config.get_hysteresis('nonexistent'), DEFAULT_HYSTERESIS)

    def test_invalid_hysteresis_negative(self):
        with open(self.config_file, 'w') as f:
            json.dump(self.invalid_config_data_negative_hysteresis, f)
        with self.assertRaises(ValueError):
            AIVAConfig(self.config_file)

    def test_invalid_hysteresis_too_high(self):
        with open(self.config_file, 'w') as f:
            json.dump(self.invalid_config_data_hysteresis_too_high, f)
        with self.assertRaises(ValueError):
            AIVAConfig(self.config_file)

    def test_invalid_hysteresis_invalid_type(self):
        with open(self.config_file, 'w') as f:
            json.dump(self.invalid_config_data_invalid_type, f)
        with self.assertRaises(ValueError):
            AIVAConfig(self.config_file)


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