import json
import sys
import tempfile
import unittest
from pathlib import Path

PROJECT_ROOT = Path(__file__).resolve().parent.parent

sys.path.insert(0, str(PROJECT_ROOT))

import core.services.scan_service as manager
from core import constants


class TestCSSModScanner(unittest.TestCase):
    def setUp(self) -> None:
        self.sandbox = tempfile.TemporaryDirectory()
        self.sandbox_path = Path(self.sandbox.name)

        constants.SERVER_ROOT = self.sandbox_path
        constants.SERVER_CSTRIKE = self.sandbox_path / "cstrike"
        constants.REPOSITORY = self.sandbox_path / "css_mod_manager" / "repository"
        constants.CONFIG_FILE = self.sandbox_path / "css_mod_manager" / "config.json"

        constants.SERVER_CSTRIKE.mkdir(parents=True, exist_ok=True)
        constants.REPOSITORY.mkdir(parents=True, exist_ok=True)

        with Path(constants.CONFIG_FILE).open("w", encoding="utf-8") as f:
            json.dump({"load_order": []}, f)

    def tearDown(self) -> None:
        self.sandbox.cleanup()

    def test_link_server_cfg_during_scan(self) -> None:
        """Ensures that if a .cfg file already exists on the server, the scan links to it."""
        server_cfg = constants.SERVER_CSTRIKE / "cfg" / "sourcemod" / "vip_system.cfg"
        server_cfg.parent.mkdir(parents=True, exist_ok=True)
        server_cfg.write_text('sm_vip_health "150"', encoding="utf-8")

        # Mod dans le dépôt avec son plugin pour déclencher l'association au nom
        mod_dir = constants.REPOSITORY / "vip_system"
        mod_dir.mkdir(parents=True, exist_ok=True)
        plugin_file = mod_dir / "vip_system.smx"
        plugin_file.write_text("binary", encoding="utf-8")

        manager.initialize_and_scan_mod("vip_system")

        local_cfg = mod_dir / "cstrike" / "cfg" / "sourcemod" / "vip_system.cfg"
        local_base = mod_dir / "cstrike" / "cfg" / "sourcemod" / "vip_system.cfg.base"

        self.assertTrue(local_cfg.exists())
        self.assertTrue(local_base.exists())

        with (mod_dir / "manifest.json").open(encoding="utf-8") as f:
            manifest = json.load(f)
        self.assertIn("cstrike/cfg/sourcemod/vip_system.cfg", manifest["config_files"])

    def test_get_available_mods_returns_uninitialized_flag(self) -> None:
        """Vérifie que lister les mods détecte un dossier brut comme non initialisé sans créer de manifeste sournoisement."""
        raw_mod_id = "new_raw_mod"
        raw_mod_dir = constants.REPOSITORY / raw_mod_id
        raw_mod_dir.mkdir(parents=True, exist_ok=True)

        mods = manager.get_available_mods()

        target_mod = next((m for m in mods if m["id"] == raw_mod_id), None)

        self.assertIsNotNone(
            target_mod, "Le dossier brut doit être détecté comme un mod disponible."
        )
        self.assertFalse(
            target_mod["initialized"],
            "Le mod sans manifest.json doit être marqué comme non initialisé.",
        )

        manifest_path = raw_mod_dir / "manifest.json"
        self.assertFalse(
            manifest_path.exists(),
            "get_available_mods ne doit pas écrire de manifest.json de manière sneaky.",
        )


if __name__ == "__main__":
    unittest.main()
