from __future__ import annotations

from pathlib import Path
import argparse
import json
import sqlite3
import sys

ROOT = Path(__file__).resolve().parents[1]
SRC = ROOT / "src"
sys.path.insert(0, str(SRC))

from ai_archive.paths import INDEX_DIR


def quote_fts_query(query: str) -> str:
    """Treat user input as a literal phrase unless they opt into raw FTS syntax."""
    return '"' + query.replace('"', '""') + '"'


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("query")
    parser.add_argument("--source")
    parser.add_argument("--limit", type=int, default=5)
    parser.add_argument("--json", action="store_true")
    parser.add_argument("--raw-fts", action="store_true", help="Interpret query as raw SQLite FTS5 syntax")
    args = parser.parse_args()

    conn = sqlite3.connect(INDEX_DIR / "archive.db")
    conn.row_factory = sqlite3.Row
    try:
        sql = """
        SELECT
          c.chunk_id,
          c.conversation_id,
          c.source,
          c.title,
          c.message_start,
          c.message_end,
          c.text,
          c.metadata_json,
          snippet(chunks_fts, 4, '[', ']', '…', 18) AS snippet
        FROM chunks_fts f
        JOIN chunks c ON c.rowid = f.rowid
        WHERE chunks_fts MATCH ?
        """
        params: list[object] = [args.query if args.raw_fts else quote_fts_query(args.query)]
        if args.source:
            sql += " AND c.source = ?"
            params.append(args.source)
        sql += " LIMIT ?"
        params.append(args.limit)
        rows = conn.execute(sql, params).fetchall()
    finally:
        conn.close()

    payload = []
    for row in rows:
        item = dict(row)
        try:
            item["metadata"] = json.loads(item.pop("metadata_json") or "{}")
        except json.JSONDecodeError:
            item["metadata"] = {"raw_metadata_json": item.pop("metadata_json")}
        payload.append(item)

    if args.json:
        print(json.dumps(payload, ensure_ascii=False, indent=2))
    else:
        for row in payload:
            md = row.get("metadata") or {}
            print(f"[{row['source']}] {row['title']} :: {row['chunk_id']}")
            print(f"conversation={row['conversation_id']} messages={row['message_start']}-{row['message_end']} raw_path={md.get('raw_path')}")
            print((row.get("snippet") or row["text"][:500]).replace("\\n", " "))
            print("-")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
