# retoor <retoor@molodetz.nl>

from devplacepy.services.devii.actions.catalog import PLATFORM_CATALOG
from devplacepy.services.devii.actions.dispatcher import (
    CONFIRM_REQUIRED,
    MUTATING_METHODS,
)

BY_NAME = PLATFORM_CATALOG.by_name()


def _records_mutation(name: str) -> bool:
    action = BY_NAME[name]
    return action.method in MUTATING_METHODS and not action.is_read_only


def test_read_only_query_tools_are_marked_read_only():
    # These are POST routes (they carry a body) but only read data. They MUST be
    # read-only so they do not trip the agentic plan gate or the verification gate
    # and drop the rows the user asked for.
    for name in ("db_query", "db_design_query"):
        assert BY_NAME[name].is_read_only is True
        assert _records_mutation(name) is False


def test_db_get_tools_are_read_only():
    for name in ("db_list_tables", "db_table_schema", "db_list_rows", "db_get_row"):
        assert BY_NAME[name].is_read_only is True
        assert _records_mutation(name) is False


def test_db_mutation_tools_record_and_confirm():
    for name in ("db_insert_row", "db_update_row", "db_delete_row"):
        action = BY_NAME[name]
        assert action.is_read_only is False
        assert _records_mutation(name) is True
        assert name in CONFIRM_REQUIRED


def test_seo_report_is_public_read_only_http_action():
    action = BY_NAME["seo_report"]
    assert action.handler == "http"
    assert action.method == "GET"
    assert action.path == "/tools/seo/{uid}/report"
    assert action.requires_auth is False
    assert action.is_read_only is True
    assert _records_mutation("seo_report") is False
    assert "seo_report" not in CONFIRM_REQUIRED
    names = {p.name for p in action.params}
    assert "uid" in names
