import json
import sqlite3

from ops.sqlite_to_postgres_dump import convert_sqlite_to_postgres


def test_sqlite_to_postgres_dump_escapes_and_counts(tmp_path):
    db_path = tmp_path / "source.db"
    conn = sqlite3.connect(db_path)
    conn.execute("create table audit_log (id integer primary key, detail text, score real, payload blob)")
    conn.execute(
        "insert into audit_log (id, detail, score, payload) values (?, ?, ?, ?)",
        (1, "line one\nline two\tbackslash\\literal \\N", 1.25, b"\x00\x01abc"),
    )
    conn.execute("insert into audit_log (id, detail, score, payload) values (?, ?, ?, ?)", (2, None, None, None))
    conn.execute("create table mixed (value integer)")
    conn.execute("insert into mixed (value) values (?)", ("not actually integer",))
    conn.commit()
    conn.close()

    sql_path = tmp_path / "restore.sql"
    summary_path = tmp_path / "summary.json"
    target_counts_path = tmp_path / "counts.sql"

    summary = convert_sqlite_to_postgres(
        sqlite_path=db_path,
        output_sql=sql_path,
        summary_json=summary_path,
        schema="teleo_restore",
        target_counts_sql=target_counts_path,
    )

    sql = sql_path.read_text()
    assert 'create schema "teleo_restore";' in sql
    assert 'copy "teleo_restore"."audit_log"' in sql
    assert r"line one\nline two\tbackslash\\literal \\N" in sql
    assert "0001616263" in sql
    assert summary["source_integrity_check"] == "ok"
    assert summary["table_count"] == 2
    assert summary["source_total_rows"] == 3

    stored_summary = json.loads(summary_path.read_text())
    mixed_column = stored_summary["tables"][1]["columns"][0]
    assert mixed_column["name"] == "value"
    assert mixed_column["postgres_type"] == "text"
    assert target_counts_path.read_text().startswith("copy (")
