# tests/cli/test_fix/vars_main_files.py
import os
import shutil
import tempfile
import unittest
import yaml

# Adjust this import to match the real path in your project
from cli.fix.vars_main_files import run, ROLES_DIR

class TestEnsureVarsMain(unittest.TestCase):
    def setUp(self):
        # create a temporary directory to act as our roles dir
        self.tmpdir = tempfile.mkdtemp()
        self.roles_dir = os.path.join(self.tmpdir, "roles")
        os.mkdir(self.roles_dir)

        # Monkey-patch the module's ROLES_DIR to point here
        self._orig_roles_dir = ROLES_DIR
        setattr(__import__("cli.fix.vars_main_files", fromlist=["ROLES_DIR"]), "ROLES_DIR", self.roles_dir)

    def tearDown(self):
        # restore and cleanup
        setattr(__import__("cli.fix.vars_main_files", fromlist=["ROLES_DIR"]), "ROLES_DIR", self._orig_roles_dir)
        shutil.rmtree(self.tmpdir)

    def _make_role(self, name, vars_content=None):
        """
        Create a role under self.roles_dir/name
        If vars_content is given, writes that to vars/main.yml
        """
        role_path = os.path.join(self.roles_dir, name)
        os.makedirs(os.path.join(role_path, "vars"))
        if vars_content is not None:
            with open(os.path.join(role_path, "vars", "main.yml"), "w") as f:
                yaml.safe_dump(vars_content, f)
        return role_path

    def test_creates_missing_vars_main(self):
        # Create a role with no vars/main.yml
        role = self._make_role("desk-foobar")
        # Ensure no file exists yet
        self.assertFalse(os.path.exists(os.path.join(role, "vars", "main.yml")))

        # Run with overwrite=False, preview=False
        run(prefix="desk-", preview=False, overwrite=False)

        # Now file must exist
        vm = os.path.join(role, "vars", "main.yml")
        self.assertTrue(os.path.exists(vm))

        with open(vm) as f:
            data = yaml.safe_load(f)
        # Expect application_id: 'foobar'
        self.assertEqual(data.get("application_id"), "foobar")

    def test_overwrite_updates_only_application_id(self):
        # Create a role with an existing vars/main.yml
        initial = {"application_id": "wrong", "foo": "bar"}
        role = self._make_role("desk-baz", vars_content=initial.copy())

        run(prefix="desk-", preview=False, overwrite=True)

        path = os.path.join(role, "vars", "main.yml")
        with open(path) as f:
            data = yaml.safe_load(f)

        # application_id must be corrected...
        self.assertEqual(data.get("application_id"), "baz")
        # ...but other keys must survive
        self.assertIn("foo", data)
        self.assertEqual(data["foo"], "bar")

    def test_preview_mode_does_not_write(self):
        # Create a role directory but with no vars/main.yml
        role = self._make_role("desk-preview")
        vm = os.path.join(role, "vars", "main.yml")
        # Run in preview => no file creation
        run(prefix="desk-", preview=True, overwrite=False)
        self.assertFalse(os.path.exists(vm))

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