from __future__ import annotations

import ast
import importlib
import platform as stdlib_platform
from pathlib import Path

from alembic.config import Config
from alembic.script import ScriptDirectory


ROOT = Path(__file__).resolve().parents[1]


def _python_sources():
    excluded = {"venv", ".git", "storage", "__pycache__"}
    for path in ROOT.rglob("*.py"):
        if not excluded.intersection(path.parts):
            yield path


def test_platform_name_resolves_to_stdlib():
    assert "flask_server/platform" not in str(getattr(stdlib_platform, "__file__", ""))
    assert not (ROOT / "platform").exists()


def test_bridge_platform_and_v1_apps_import():
    importlib.import_module("bridge_platform")
    importlib.import_module("apps.qr_service")
    importlib.import_module("apps.messaging_service")


def test_no_internal_import_uses_platform_namespace():
    violations = []
    for path in _python_sources():
        tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path))
        for node in ast.walk(tree):
            if isinstance(node, ast.ImportFrom) and (node.module or "").startswith("platform."):
                violations.append(str(path.relative_to(ROOT)))
            if isinstance(node, ast.Import):
                violations.extend(
                    str(path.relative_to(ROOT))
                    for alias in node.names
                    if alias.name.startswith("platform.")
                )
    assert not violations, f"forbidden internal platform imports: {sorted(set(violations))}"


def test_alembic_has_one_expected_head_and_no_embedded_database_password():
    ini = ROOT / "bridge_platform/migrations/alembic.ini"
    config = Config(str(ini))
    scripts = ScriptDirectory.from_config(config)
    assert scripts.get_heads() == ["c9a31f2e7d44"]
    contents = ini.read_text(encoding="utf-8")
    assert "NUEVA_PASSWORD_FUERTE" not in contents
    env_contents = (ini.parent / "alembic/env.py").read_text(encoding="utf-8")
    assert "target_metadata = None" not in env_contents
