from pathlib import Path

import pytest

from osx_backup.mapfile import GLOBAL_EXCLUDES, DotfileEntry, default_map_path, load_map


def test_load_map(map_path: Path) -> None:
    entries = load_map(map_path)
    assert entries[0] == DotfileEntry(path=".zshrc", description="zsh")
    assert entries[1].exclude == ("fish_variables",)
    assert [e.path for e in entries if e.secret] == [".ssh", ".config/gh"]


def test_default_map_path_env(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
    monkeypatch.setenv("OSX_BACKUP_MAP", str(tmp_path / "m.toml"))
    assert default_map_path() == tmp_path / "m.toml"


def test_repo_map_loads(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.delenv("OSX_BACKUP_MAP", raising=False)
    entries = load_map()
    assert any(e.path == ".ssh" and e.secret for e in entries)
    assert any(e.path == ".config/fish" and not e.secret for e in entries)


def test_global_excludes() -> None:
    assert "**/node_modules" in GLOBAL_EXCLUDES


@pytest.mark.parametrize("bad", ["/Users/x/.config/foo", "../../etc/passwd", ".config/../../x"])
def test_load_map_refuses_paths_that_escape_home(tmp_path: Path, bad: str) -> None:
    """Un `path` absolu ou remontant ferait supprimer un fichier hors du dossier de sauvegarde."""
    p = tmp_path / "bad.toml"
    p.write_text(f'[[dotfiles]]\npath = "{bad}"\n')
    with pytest.raises(ValueError, match=bad):
        load_map(p)


def test_repo_map_excludes_the_ssh_agent_socket(monkeypatch: pytest.MonkeyPatch) -> None:
    monkeypatch.delenv("OSX_BACKUP_MAP", raising=False)
    ssh = next(e for e in load_map() if e.path == ".ssh")
    assert "agent" in ssh.exclude
