#!/usr/bin/env python3
"""Gemini researcher silo — public prompts only. Never Hub/case/family.

Loads ~/.config/eve/gemini.env
Usage:
  gemini_research.py 'What is TexanoAI positioning in one paragraph?'
  gemini_research.py --out notes.md 'Summarize X'
"""
from __future__ import annotations

import argparse
import json
import os
import sys
import urllib.error
import urllib.request
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

ENV = Path.home() / ".config/eve/gemini.env"
OUT_DIR = Path(__file__).resolve().parent / "research" / "gemini"
CT = ZoneInfo("America/Chicago")
# Prefer current Flash; override with GEMINI_MODEL=
DEFAULT_MODEL = os.environ.get("GEMINI_MODEL", "gemini-3.6-flash")


def load_key() -> str:
    if not ENV.exists():
        raise SystemExit(f"Missing {ENV} — put GEMINI_API_KEY=… there (chmod 600)")
    for line in ENV.read_text(encoding="utf-8").splitlines():
        line = line.strip()
        if line.startswith("GEMINI_API_KEY="):
            return line.split("=", 1)[1].strip().strip('"').strip("'")
    raise SystemExit(f"No GEMINI_API_KEY in {ENV}")


def ask(prompt: str, model: str = DEFAULT_MODEL) -> str:
    key = load_key()
    url = (
        "https://generativelanguage.googleapis.com/v1beta/models/"
        f"{model}:generateContent?key={key}"
    )
    system = (
        "You are a research assistant for TexanoAI. Public-web / general knowledge only. "
        "Do not invent private Hub, Roots, Branches, case, or family facts. "
        "Label Fact / Assumption / Projection when claims matter. Be concise."
    )
    body = {
        "systemInstruction": {"parts": [{"text": system}]},
        "contents": [{"parts": [{"text": prompt}]}],
    }
    req = urllib.request.Request(
        url,
        data=json.dumps(body).encode(),
        headers={"Content-Type": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=120) as resp:
            data = json.loads(resp.read().decode())
    except urllib.error.HTTPError as e:
        raise SystemExit(f"Gemini HTTP {e.code}: {e.read().decode('utf-8', 'replace')[:500]}")
    return data["candidates"][0]["content"]["parts"][0]["text"].strip()


def main() -> None:
    ap = argparse.ArgumentParser(description="Gemini researcher (siloed)")
    ap.add_argument("prompt", nargs="+", help="Research prompt")
    ap.add_argument("--out", help="Optional markdown file under research/gemini/")
    ap.add_argument("--model", default=DEFAULT_MODEL)
    args = ap.parse_args()
    prompt = " ".join(args.prompt)
    text = ask(prompt, model=args.model)
    print(text)
    OUT_DIR.mkdir(parents=True, exist_ok=True)
    stamp = datetime.now(CT).strftime("%Y-%m-%dT%H%M%S")
    path = OUT_DIR / (args.out or f"note_{stamp}.md")
    if not path.is_absolute():
        path = OUT_DIR / path.name if path.parent == Path(".") else OUT_DIR / path.name
    path.write_text(
        f"# Gemini research\n\n- time: {stamp}\n- model: {args.model}\n\n## Prompt\n\n{prompt}\n\n## Answer\n\n{text}\n",
        encoding="utf-8",
    )
    print(f"\n[wrote {path}]", file=sys.stderr)


if __name__ == "__main__":
    main()
