import shutil
import sys
import unittest
from datetime import UTC, datetime
from pathlib import Path

from core.io.umc_parser import parse_umc_file

# Détermination du dossier racine du projet pour garantir le bon fonctionnement des imports
PROJECT_ROOT = Path(__file__).resolve().parent.parent
if str(PROJECT_ROOT) not in sys.path:
    sys.path.insert(0, str(PROJECT_ROOT))

# Imports des nouvelles classes orientées objet mises à jour
from core.io.umc_writer import write


class TestCSSModUMCWriter(unittest.TestCase):
    """Système de tests unitaires en Sandbox pour valider le bon fonctionnement de UMCWriter."""

    def setUp(self):
        """Inițializarea Sandbox-ului și pregătirea datelor de testare curate."""
        self.results_sandbox = Path(__file__).parent / "results_sandbox"
        self.results_dir = self.results_sandbox / "results"

        self.results_dir.mkdir(parents=True, exist_ok=True)
        self.timestamp = datetime.now(tz=UTC).strftime("%Y-%m-%d_%H-%M-%S")

        self.sandbox_output = self.results_dir / f"writer_result_{self.timestamp}.txt"

        self.mock_umc_data = {
            "Normal": {
                "options": {"maps_invote": "5"},
                "maps": {"de_dust2": {}, "de_inferno": {"tier": "2", "weight": "3"}},
            },
            "Aim": {"options": {}, "maps": {"aim_map": {}}},
        }

    def tearDown(self):
        """Thoroughly clean the sandbox after running the test."""
        if self.results_sandbox.exists():
            shutil.rmtree(self.results_sandbox)

    def test_writer_serialization_and_roundtrip(self):
        """Verify that UMCWriter generates a KeyValues file that is syntactically correct and readable."""
        write(self.sandbox_output, self.mock_umc_data, create_backup=False)

        self.assertTrue(
            self.sandbox_output.exists(), "UMCWriter did not create the file on the disk"
        )
        self.assertGreater(
            self.sandbox_output.stat().st_size, 0, "The generated file is completely empty."
        )

        parsed_data = parse_umc_file(self.sandbox_output)

        self.assertEqual(
            len(parsed_data), 2, "The rewritten file has lost or duplicated some categories."
        )
        self.assertIn("Normal", parsed_data)
        self.assertIn("Aim", parsed_data)

        self.assertIn("maps", parsed_data["Normal"])
        self.assertIn("options", parsed_data["Normal"])

        self.assertEqual(parsed_data["Normal"]["options"].get("maps_invote"), "5")
        self.assertIn("de_dust2", parsed_data["Normal"]["maps"])
        self.assertEqual(parsed_data["Normal"]["maps"]["de_inferno"].get("tier"), "2")


if __name__ == "__main__":
    unittest.main()
