#!/usr/bin/env python3
"""Rewrite mwj instance LLM routes to the agreed candidate chain.

Hot-fix for friend-377a1e00 / friend-deploy-83490d95-82f.
Must run *inside* the container against /var/lib/friend/friend.db.
"""
import sqlite3
import time

DB = "/var/lib/friend/friend.db"
now = time.strftime("%Y-%m-%d %H:%M:%S.000000+00:00", time.gmtime())

con = sqlite3.connect(DB)
con.row_factory = sqlite3.Row

# Resolve channel_model ids by key (discovered models after sync-models).
key_to_id = {}
for r in con.execute("SELECT id, model_key FROM llm_channel_models"):
    key_to_id[r["model_key"]] = r["id"]

def mid(key):
    if key not in key_to_id:
        raise SystemExit(f"missing model {key}: have {sorted(key_to_id)}")
    return key_to_id[key]

thinking = [
    (mid("minimax/minimax-m3:free"), "minimax/minimax-m3:free"),
    (mid("nvidia/nemotron-3-ultra-550b-a55b:free"), "nvidia/nemotron-3-ultra-550b-a55b:free"),
    (mid("nvidia/nemotron-3-super-120b-a12b:free"), "nvidia/nemotron-3-super-120b-a12b:free"),
]
multimodal = [
    (mid("minimax/minimax-m3:free"), "minimax/minimax-m3:free"),
    (mid("nvidia/nemotron-3-super-120b-a12b:free"), "nvidia/nemotron-3-super-120b-a12b:free"),
]
quick = [
    (mid("nvidia/nemotron-3-nano-30b-a3b:free"), "nvidia/nemotron-3-nano-30b-a3b:free"),
    (mid("nvidia/nemotron-3-super-120b-a12b:free"), "nvidia/nemotron-3-super-120b-a12b:free"),
]
fallback = thinking

purpose_cands = {}
for r in con.execute("SELECT id, purpose FROM llm_purpose_routes"):
    p = r["purpose"]
    if p in ("brain_thinking", "default"):
        purpose_cands[r["id"]] = thinking
    elif p == "tool_multimodal":
        purpose_cands[r["id"]] = multimodal
    elif p == "quick":
        purpose_cands[r["id"]] = quick
    else:
        purpose_cands[r["id"]] = fallback

con.execute("DELETE FROM llm_route_candidates")
cid = 1
for rid, cands in purpose_cands.items():
    for pos, (channel_model_id, key) in enumerate(cands):
        con.execute(
            "INSERT INTO llm_route_candidates "
            "(id, purpose_route_id, position, target_type, group_id, channel_id, "
            "channel_model_id, model_key, enabled, created_at, updated_at) "
            "VALUES (?,?,?,?,?,?,?,?,?,?,?)",
            (cid, rid, pos, "channel", None, 1, channel_model_id, key, 1, now, now),
        )
        cid += 1

con.execute(
    "UPDATE llm_purpose_routes SET use_streaming=1, updated_at=? "
    "WHERE purpose IN ('brain_thinking','tool_multimodal','quick','default')",
    (now,),
)
con.execute(
    "UPDATE llm_channel_models SET enabled=0, updated_at=? "
    "WHERE model_key IN ('glm-5-2','nemotron')",
    (now,),
)
con.execute(
    "UPDATE llm_channel_models SET enabled=1, updated_at=? "
    "WHERE model_key IN ("
    "'minimax/minimax-m3:free',"
    "'nvidia/nemotron-3-ultra-550b-a55b:free',"
    "'nvidia/nemotron-3-super-120b-a12b:free',"
    "'nvidia/nemotron-3-nano-30b-a3b:free'"
    ")",
    (now,),
)
con.execute("DELETE FROM llm_model_runtime_states")
con.execute("DELETE FROM llm_channel_runtime_states")
con.commit()

print("candidates", list(con.execute("SELECT count(*) FROM llm_route_candidates"))[0][0])
print("by purpose:")
for r in con.execute(
    """
    SELECT pr.purpose, group_concat(rc.model_key, ' > ') AS chain
    FROM llm_purpose_routes pr
    JOIN llm_route_candidates rc ON rc.purpose_route_id = pr.id
    GROUP BY pr.id
    ORDER BY pr.id
    """
):
    print(" ", dict(r))
print("enabled models:")
for r in con.execute("SELECT id, model_key, enabled FROM llm_channel_models ORDER BY id"):
    print(" ", dict(r))
print("runtime leftover",
      list(con.execute("SELECT count(*) FROM llm_model_runtime_states"))[0][0],
      list(con.execute("SELECT count(*) FROM llm_channel_runtime_states"))[0][0])
print("streaming",
      [dict(r) for r in con.execute(
          "SELECT purpose, use_streaming FROM llm_purpose_routes "
          "WHERE purpose IN ('brain_thinking','default','quick','tool_multimodal')"
      )])
print("OK")
