from pathlib import Path

import pytest
from mjr_am_backend.adapters.db.sqlite_facade import Sqlite


@pytest.mark.asyncio
async def test_sqlite_facade_basic_queries(tmp_path: Path):
    db_path = tmp_path / "it.db"
    db = Sqlite(str(db_path), max_connections=2, timeout=2.0)
    try:
        r1 = await db.aexecute("CREATE TABLE IF NOT EXISTS t (id INTEGER PRIMARY KEY, name TEXT)")
        assert r1.ok

        r2 = await db.aexecutemany("INSERT INTO t (name) VALUES (?)", [("a",), ("b",), ("c",)])
        assert r2.ok

        q1 = await db.aquery("SELECT id, name FROM t ORDER BY id")
        assert q1.ok and len(q1.data) == 3

        q2 = await db.aquery_in("SELECT id, name FROM t WHERE {IN_CLAUSE} ORDER BY id", "id", [1, 3])
        assert q2.ok and [row["id"] for row in q2.data] == [1, 3]
    finally:
        await db.aclose()


@pytest.mark.asyncio
async def test_sqlite_facade_tx_and_schema_helpers(tmp_path: Path):
    db_path = tmp_path / "it2.db"
    db = Sqlite(str(db_path), max_connections=2, timeout=2.0)
    try:
        await db.aexecute("CREATE TABLE IF NOT EXISTS tx_t (id INTEGER PRIMARY KEY, v INTEGER)")

        async with db.atransaction(mode="immediate") as tx:
            assert tx.ok
            token = tx.data
            assert token
            await db.aexecute("INSERT INTO tx_t (v) VALUES (?)", (10,))

        q = await db.aquery("SELECT COUNT(*) AS c FROM tx_t")
        assert q.ok and int((q.data[0] or {}).get("c") or 0) >= 1

        has_t = await db.ahas_table("tx_t")
        assert has_t is True

        v1 = await db.aget_schema_version()
        assert isinstance(v1, int)

        sv = await db.aset_schema_version(v1 + 1)
        assert sv.ok

        v2 = await db.aget_schema_version()
        assert v2 == v1 + 1

        vac = await db.avacuum()
        assert vac.ok
    finally:
        await db.aclose()


@pytest.mark.asyncio
async def test_sqlite_facade_reset_path(tmp_path: Path):
    db_path = tmp_path / "it3.db"
    db = Sqlite(str(db_path), max_connections=2, timeout=2.0)
    try:
        await db.aexecute("CREATE TABLE IF NOT EXISTS z (id INTEGER PRIMARY KEY)")
        rr = await db.areset()
        assert rr.ok or rr.code in {"DELETE_FAILED", "FS_ERROR"}
    finally:
        await db.aclose()
