import unittest
import os
import json
from core.validators.config_validator import ConfigValidator  # Adjust import path if needed


class ConfigValidatorTest(unittest.TestCase):

    def setUp(self):
        """
        Set up a temporary directory with test configuration files.
        """
        self.test_config_dir = "temp_config_dir"  # Changed to a string
        if not os.path.exists(self.test_config_dir):
            os.makedirs(self.test_config_dir)

        # Create valid config file
        self.valid_config_path = os.path.join(self.test_config_dir, "valid_config.json")
        with open(self.valid_config_path, 'w') as f:
            json.dump({"version": "1.0", "parameters": {"param1": "value1"}}, f)

        # Create invalid config file (missing version)
        self.invalid_config_path = os.path.join(self.test_config_dir, "invalid_config.json")
        with open(self.invalid_config_path, 'w') as f:
            json.dump({"parameters": {"param1": "value1"}}, f)

        # Create invalid JSON file
        self.bad_json_config_path = os.path.join(self.test_config_dir, "bad_json_config.json")
        with open(self.bad_json_config_path, 'w') as f:
            f.write("{'version': '1.0', 'parameters': 'value1'")  # Invalid JSON

        # Create a file that doesn't end with .json
        self.not_json_config_path = os.path.join(self.test_config_dir, "config.txt")
        with open(self.not_json_config_path, 'w') as f:
            f.write("This is not a JSON file.")


        self.validator = ConfigValidator(self.test_config_dir)


    def tearDown(self):
        """
        Clean up the temporary directory and files.
        """
        for filename in os.listdir(self.test_config_dir):
            filepath = os.path.join(self.test_config_dir, filename)
            os.remove(filepath)
        os.rmdir(self.test_config_dir)

    def test_validate_valid_config(self):
        """
        Test validating a valid configuration file.
        """
        errors = self.validator.validate_file(self.valid_config_path)
        self.assertEqual(self.validator.errors, []) # should be self.errors, not errors
        self.validator.errors = []  # Reset errors for next test


    def test_validate_invalid_config(self):
        """
        Test validating an invalid configuration file (missing version).
        """
        errors = self.validator.validate_file(self.invalid_config_path)
        self.assertNotEqual(self.validator.errors, [])
        self.assertTrue(any("missing 'version' key" in error for error in self.validator.errors))
        self.validator.errors = []  # Reset errors for next test



    def test_validate_bad_json(self):
        """
        Test validating a file with invalid JSON format.
        """
        errors = self.validator.validate_file(self.bad_json_config_path)
        self.assertNotEqual(self.validator.errors, [])
        self.assertTrue(any("Invalid JSON format" in error for error in self.validator.errors))
        self.validator.errors = []  # Reset errors for next test


    def test_validate_all_configs(self):
        """
        Test validating all configuration files in the directory.
        """
        errors = self.validator.validate_all()
        self.assertEqual(len(errors), 2) # Two invalid files: invalid_config.json and bad_json_config.json
        self.assertTrue(any("missing 'version' key" in error for error in errors))
        self.assertTrue(any("Invalid JSON format" in error for error in errors))




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