import ast
import unittest
from pathlib import Path


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


def module(path: str) -> ast.Module:
    return ast.parse((ROOT / path).read_text(encoding="utf-8"))


def function_names(parsed: ast.Module) -> set[str]:
    return {
        node.name
        for node in ast.walk(parsed)
        if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))
    }


def source(path: str) -> str:
    return (ROOT / path).read_text(encoding="utf-8")


class DeliveryReadinessTests(unittest.TestCase):
    def test_config_routes_require_current_user_or_admin(self) -> None:
        config_source = source("app/api/config.py")

        self.assertTrue(
            "get_current_user" in config_source or "require_admin" in config_source
        )
        self.assertIn("current_user", config_source)

    def test_security_defines_admin_guard(self) -> None:
        parsed = module("app/core/security.py")

        self.assertIn("require_admin", function_names(parsed))

    def test_runtime_services_read_database_config(self) -> None:
        email_source = source("app/services/email_service.py")
        telegram_source = source("app/services/telegram_service.py")

        self.assertIn("get_smtp_config", email_source)
        self.assertIn("get_telegram_config", telegram_source)

    def test_no_hard_coded_delivery_secrets(self) -> None:
        forbidden = [
            "erp-super-secret",
            "Admin@2026!",
            "1234567890",
        ]

        for relative_path in [
            "app/core/security.py",
            "create_admin.py",
            "init_db.py",
            ".env",
        ]:
            file_source = source(relative_path)
            for marker in forbidden:
                self.assertNotIn(
                    marker,
                    file_source,
                    f"{marker!r} found in {relative_path}",
                )

    def test_localhost_mysql_is_not_forced_to_sqlite(self) -> None:
        db_source = source("app/core/database.py")

        self.assertNotIn('DB_HOST == "localhost"', db_source)


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