"""Structural safety tests for the read-only package surface."""

from __future__ import annotations

import importlib
import importlib.util
import inspect
import socket
import subprocess
import sys

import pytest

from osm_lead_source_service.errors import UnsupportedOperation
from osm_lead_source_service.ports.noco_read import NocoReadRepository


def test_noco_read_repository_exposes_only_read_contract_methods() -> None:
    methods = {
        name
        for name, member in inspect.getmembers(NocoReadRepository, inspect.isfunction)
        if not name.startswith("__")
    }
    assert methods == {"iter_pages", "read_schema"}
    prohibited_names = {
        "create",
        "insert",
        "update",
        "patch",
        "delete",
        "upsert",
        "write",
        "execute_sql",
    }
    assert not methods & prohibited_names


@pytest.mark.parametrize(
    "module_name",
    [
        "osm_lead_source_service.production_writer",
        "osm_lead_source_service.noco_write",
        "osm_lead_source_service.delete_service",
        "osm_lead_source_service.stale_deleter",
        "osm_lead_source_service.scheduler",
        "osm_lead_source_service.ports.noco_write",
    ],
)
def test_unrestricted_writer_modules_are_absent(module_name: str) -> None:
    assert importlib.util.find_spec(module_name) is None


def test_read_only_worker_module_is_present() -> None:
    assert importlib.util.find_spec("osm_lead_source_service.worker") is not None


def test_package_does_not_expose_production_writer_exports() -> None:
    package = importlib.import_module("osm_lead_source_service")
    assert not hasattr(package, "NocoWriteRepository")
    assert not hasattr(package, "production_writer")
    assert not hasattr(package, "delete_service")


def test_unsupported_operation_is_typed() -> None:
    error = UnsupportedOperation("not available")
    assert isinstance(error, Exception)


def test_direct_socket_construction_is_blocked() -> None:
    with pytest.raises(AssertionError, match="network access is forbidden"):
        socket.socket()


def test_connection_helper_is_blocked() -> None:
    with pytest.raises(AssertionError, match="network access is forbidden"):
        socket.create_connection(("127.0.0.1", 1))


def test_import_and_cli_do_not_attempt_network_or_database() -> None:
    assert importlib.import_module("osm_lead_source_service")
    from osm_lead_source_service.cli import main

    assert main(["doctor", "--offline"]) == 0
    probe = subprocess.run(
        [
            sys.executable,
            "-c",
            (
                "import sys; import osm_lead_source_service; "
                "from osm_lead_source_service.cli import main; main(['doctor', '--offline']); "
                "print('psycopg' in sys.modules or 'psycopg2' in sys.modules)"
            ),
        ],
        check=True,
        capture_output=True,
        text=True,
    )
    assert probe.stdout.splitlines()[-1] == "False"
