"""Account-2 order dispatch requires a fresh persisted TradingView request."""
from contextlib import closing
import json
import os
import sqlite3
import sys
import uuid
from datetime import datetime, timezone
from pathlib import Path
from alert_time_guard import time_guard_error

ROOT = Path(__file__).resolve().parent
DB_PATH = ROOT / "logs/webhook_queue.db"
AUDIT_PATH = ROOT / "logs/order_dispatch_audit.jsonl"

def validate_order_dispatch(params):
    link = params.get("orderLinkId", "")
    if not isinstance(link, str) or not link.startswith("tv2-") or len(link) != 36:
        raise RuntimeError("ORDER_DISPATCH_BLOCKED missing TradingView request link")
    try:
        request_id = str(uuid.UUID(hex=link[4:]))
    except ValueError as exc:
        raise RuntimeError("ORDER_DISPATCH_BLOCKED invalid request link") from exc
    with closing(sqlite3.connect(DB_PATH.resolve().as_uri() + "?mode=ro", uri=True, timeout=5)) as db:
        row = db.execute("SELECT status,received_at,payload FROM queue WHERE request_id=?", (request_id,)).fetchone()
    if not row or row[0] != "pending":
        raise RuntimeError("ORDER_DISPATCH_BLOCKED request missing or terminal")
    payload = json.loads(row[2])
    reason = time_guard_error(payload)
    if reason:
        raise RuntimeError("ORDER_DISPATCH_BLOCKED " + reason)
    received = datetime.fromisoformat(row[1].replace("Z", "+00:00"))
    if received.tzinfo is None:
        received = received.replace(tzinfo=timezone.utc)
    age = (datetime.now(timezone.utc)-received).total_seconds()
    if not -5 <= age <= 600:
        raise RuntimeError("ORDER_DISPATCH_BLOCKED stale queue request")
    symbol = str(payload.get("symbol", "")).strip().replace(".P", "").replace(".PZ", "").upper()
    if not symbol.endswith("USDT") and "USDT" not in symbol:
        symbol += "USDT"
    side = str(payload.get("side", "")).lower().strip()
    side = {"long":"buy", "short":"sell"}.get(side, side)
    if params.get("category") != "linear" or params.get("symbol") != symbol or str(params.get("side", "")).lower() != side:
        raise RuntimeError("ORDER_DISPATCH_BLOCKED request/order mismatch")
    return {"request_id":request_id,"orderLinkId":link,"symbol":symbol,
            "side":params.get("side"),"qty":params.get("qty"),
            "reduceOnly":params.get("reduceOnly",False),"pid":os.getpid(),
            "program":Path(sys.argv[0]).name}

def audit_dispatch(stage, record):
    line = dict(record,stage=stage,at=datetime.now(timezone.utc).isoformat())
    with AUDIT_PATH.open("a", encoding="utf-8") as stream:
        stream.write(json.dumps(line,ensure_ascii=True)+"\n")
        stream.flush()
        os.fsync(stream.fileno())
