#!/usr/bin/env python3
"""Релей контекста из прода — БЕЗ единого сетевого подключения агента к нему.

Стенд намеренно не умеет и не пытается соединяться с продовой базой/сетью.
Когда для детальной проверки не хватает реальных данных (дев-база = только
конфигурация, без документов), агент формулирует точный запрос, пользователь
сам выполняет его в проде и отдаёт результат — вот тогда данные попадают в
локальную песочницу и используются как обычные файлы.

  context_relay.py request "<текст запроса или описание>" [--format csv|json|text]
      → sandbox/requests/<id>_<slug>.md, печатает запрос и id
  context_relay.py ingest <id> <файл-с-результатом>
      → sandbox/data/<id>/, запрос переезжает в requests/done/
  context_relay.py list
      → открытые и выполненные запросы
"""
from __future__ import annotations

import re
import shutil
import sys
from pathlib import Path

SANDBOX = Path(__file__).resolve().parent.parent / "sandbox"
REQUESTS = SANDBOX / "requests"
DONE = REQUESTS / "done"
DATA = SANDBOX / "data"


def slugify(text: str) -> str:
    slug = re.sub(r"[^\w\-]+", "_", text.strip().lower())[:40].strip("_")
    return slug or "запрос"


def next_id() -> str:
    REQUESTS.mkdir(parents=True, exist_ok=True)
    existing = [p.name.split("_", 1)[0] for p in REQUESTS.glob("*.md")]
    existing += [p.name.split("_", 1)[0] for p in DONE.glob("*.md")] \
        if DONE.exists() else []
    nums = [int(n) for n in existing if n.isdigit()]
    return f"{(max(nums) + 1) if nums else 1:03d}"


def cmd_request(text: str, fmt: str) -> None:
    rid = next_id()
    path = REQUESTS / f"{rid}_{slugify(text)}.md"
    path.write_text(
        f"# Запрос {rid}\n\nФормат ответа: {fmt}\n\n## Что выполнить в проде\n\n"
        f"```\n{text}\n```\n\n## Как вернуть результат\n\n"
        f"Вставь результат в чат, или сохрани файлом и назови путь — "
        f"агент положит его в песочницу командой:\n"
        f"`context_relay.py ingest {rid} <файл>`\n",
        encoding="utf-8")
    print(f"Запрос {rid} → {path}")
    print(f"\nВыполни в проде и верни результат ({fmt}):\n\n{text}\n")


def cmd_ingest(rid: str, src: str) -> None:
    matches = list(REQUESTS.glob(f"{rid}_*.md"))
    if not matches:
        raise SystemExit(f"запроса {rid} нет в requests/ (уже принят?)")
    req = matches[0]
    dest_dir = DATA / rid
    dest_dir.mkdir(parents=True, exist_ok=True)
    src_path = Path(src).expanduser().resolve()
    if not src_path.exists():
        raise SystemExit(f"файла нет: {src_path}")
    dest = dest_dir / src_path.name
    shutil.copy2(src_path, dest)
    DONE.mkdir(parents=True, exist_ok=True)
    shutil.move(str(req), str(DONE / req.name))
    print(f"принято: {dest}")
    print(f"запрос {rid} закрыт → {DONE / req.name}")


def cmd_list() -> None:
    open_reqs = sorted(REQUESTS.glob("*.md")) if REQUESTS.exists() else []
    done_reqs = sorted(DONE.glob("*.md")) if DONE.exists() else []
    print(f"открытые ({len(open_reqs)}):")
    for p in open_reqs:
        print(f"  {p.name}")
    print(f"выполненные ({len(done_reqs)}):")
    for p in done_reqs:
        rid = p.name.split("_", 1)[0]
        files = list((DATA / rid).glob("*")) if (DATA / rid).exists() else []
        print(f"  {p.name} → {', '.join(f.name for f in files) or '(пусто)'}")


def main() -> int:
    if len(sys.argv) < 2:
        raise SystemExit(__doc__)
    cmd = sys.argv[1]
    if cmd == "request":
        fmt = "text"
        args = sys.argv[2:]
        if "--format" in args:
            i = args.index("--format")
            fmt = args[i + 1]
            args = args[:i] + args[i + 2:]
        cmd_request(args[0], fmt)
    elif cmd == "ingest":
        cmd_ingest(sys.argv[2], sys.argv[3])
    elif cmd == "list":
        cmd_list()
    else:
        raise SystemExit(__doc__)
    return 0


if __name__ == "__main__":
    sys.exit(main())
