from __future__ import annotations

import argparse
import json
import sqlite3
from pathlib import Path


SAFE_PAYLOAD_FIELDS = (
    "symbol",
    "strategy",
    "side",
    "qty",
    "quantity",
    "price",
    "order_id",
    "comment",
    "market_position",
    "prev_market_position",
    "position_size",
)


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("db", type=Path)
    parser.add_argument("needle")
    args = parser.parse_args()

    uri = args.db.resolve().as_uri() + "?mode=ro"
    with sqlite3.connect(uri, uri=True, timeout=10) as connection:
        connection.row_factory = sqlite3.Row
        queue_columns = {row[1] for row in connection.execute("PRAGMA table_info(queue)")}
        order_columns = {row[1] for row in connection.execute("PRAGMA table_info(orders)")}

        queue_fields = [
            name
            for name in ("id", "request_id", "received_at", "status", "error", "order_id", "payload")
            if name in queue_columns
        ]
        queue_rows = connection.execute(
            f"SELECT {','.join(queue_fields)} FROM queue "
            "WHERE lower(COALESCE(payload,'')) LIKE ? OR lower(COALESCE(error,'')) LIKE ? "
            "ORDER BY id DESC LIMIT 50",
            (f"%{args.needle.lower()}%", f"%{args.needle.lower()}%"),
        ).fetchall()

        request_ids = {str(row["request_id"]) for row in queue_rows if "request_id" in row.keys()}
        output_queue = []
        for row in queue_rows:
            item = {key: row[key] for key in row.keys() if key != "payload"}
            try:
                payload = json.loads(row["payload"] or "{}") if "payload" in row.keys() else {}
            except json.JSONDecodeError:
                payload = {}
            item["payload"] = {key: payload.get(key) for key in SAFE_PAYLOAD_FIELDS if key in payload}
            output_queue.append(item)

        order_fields = [
            name
            for name in ("id", "request_id", "order_id", "symbol", "side", "qty", "price", "strategy", "created_at")
            if name in order_columns
        ]
        where = ["lower(COALESCE(symbol,'')) LIKE ?", "lower(COALESCE(strategy,'')) LIKE ?"]
        params: list[str] = [f"%{args.needle.lower()}%", f"%{args.needle.lower()}%"]
        if request_ids:
            where.append("request_id IN (" + ",".join("?" for _ in request_ids) + ")")
            params.extend(sorted(request_ids))
        order_rows = connection.execute(
            f"SELECT {','.join(order_fields)} FROM orders WHERE {' OR '.join(where)} ORDER BY id DESC LIMIT 50",
            params,
        ).fetchall()

    print(json.dumps({"needle": args.needle, "queue": output_queue, "orders": [dict(row) for row in order_rows]}, indent=2))


if __name__ == "__main__":
    main()
