import { Router, Request, Response } from "express";
import { requireAdmin } from "../middleware/requireAdmin";
import {
  supervisorConfig,
  getSupervisorHealth,
  getRagStatus,
  recommendTask,
  buildBridgeDeepLink,
  ingestRagTexts,
  ingestProjectDocs,
} from "../services/supervisorAiService";
import {
  collectOperationalSnapshot,
  learnAndRecommend,
  generateProposals,
  buildInsightsDocument,
  recordFeedback,
  evolveProposal,
} from "../services/aiLearningService";
import {
  listMissions,
  createAndLaunchMission,
  completeMission,
  cancelMission,
  ingestMissionSummaryToRag,
} from "../services/agentMissionService";

const router = Router();
router.use(requireAdmin);

router.get("/status", async (_req: Request, res: Response) => {
  const cfg = supervisorConfig();
  const [health, rag, snapshot] = await Promise.all([
    getSupervisorHealth(),
    getRagStatus(),
    collectOperationalSnapshot(),
  ]);
  res.json({
    success: true,
    config: cfg,
    supervisor: health,
    rag: rag.ok ? rag.data : null,
    snapshot_summary: snapshot.analytics_summary,
    portals_active: snapshot.portals_active,
  });
});

router.post("/learn", async (_req: Request, res: Response) => {
  const result = await learnAndRecommend();
  res.json({ success: true, ...result });
});

router.post("/evolve", async (req: Request, res: Response) => {
  const proposalId = String(req.body?.proposalId || "").trim();
  if (!proposalId) {
    return res.status(400).json({ success: false, error: "proposalId requerido" });
  }
  try {
    res.json({ success: true, ...(await evolveProposal(proposalId)) });
  } catch (e) {
    res.status(404).json({ success: false, error: (e as Error).message });
  }
});

router.post("/feedback", async (req: Request, res: Response) => {
  const proposalId = String(req.body?.proposalId || "").trim();
  const rating = Number(req.body?.rating);
  if (!proposalId || (rating !== 1 && rating !== -1)) {
    return res.status(400).json({ success: false, error: "proposalId y rating requeridos" });
  }
  await recordFeedback(proposalId, rating as 1 | -1, req.body?.note ? String(req.body.note) : undefined);
  res.json({ success: true });
});

router.post("/recommend", async (req: Request, res: Response) => {
  const task = String(req.body?.task || "").trim();
  if (!task) return res.status(400).json({ success: false, error: "task requerido" });
  const rec = await recommendTask(task, req.body?.agent ? String(req.body.agent) : undefined);
  if (!rec.ok) {
    return res.status(502).json({ success: false, bridgeUrl: supervisorConfig().bridgeUrl });
  }
  const data = rec.data as Record<string, unknown>;
  const primary = data.primary_match as Record<string, unknown> | undefined;
  const prompt = [
    "MODO REVISIÓN — Captajaus IA Admin",
    primary ? `Agente: ${primary.agent} · ${primary.title}` : "",
    "",
    task,
  ].filter(Boolean).join("\n");
  res.json({
    success: true,
    recommendation: data,
    primary,
    bridgeUrl: buildBridgeDeepLink(prompt),
  });
});

router.post("/ingest-insights", async (_req: Request, res: Response) => {
  const snapshot = await collectOperationalSnapshot();
  const proposals = await generateProposals(snapshot);
  const doc = await buildInsightsDocument(snapshot, proposals);
  const ingested = await ingestRagTexts([{ text: doc, type: "operational_insight" }]);
  res.json({ success: ingested.ok, chars: doc.length });
});

router.post("/ingest-project", async (_req: Request, res: Response) => {
  const result = await ingestProjectDocs();
  res.json({ success: result.ok, result: result.data });
});

router.get("/missions", (_req: Request, res: Response) => {
  res.json({ success: true, missions: listMissions(40) });
});

router.post("/missions", async (req: Request, res: Response) => {
  const task = String(req.body?.task || "").trim();
  if (!task) return res.status(400).json({ success: false, error: "task requerido" });
  const agent = req.body?.agent ? String(req.body.agent) : "code";
  const result = await createAndLaunchMission(task, agent, true);
  res.json({ success: true, ...result });
});

router.post("/missions/:id/complete", (req: Request, res: Response) => {
  const m = completeMission(String(req.params.id), req.body?.note ? String(req.body.note) : undefined);
  if (!m) return res.status(404).json({ success: false, error: "misión no encontrada" });
  res.json({ success: true, mission: m });
});

router.post("/missions/:id/cancel", (req: Request, res: Response) => {
  const m = cancelMission(String(req.params.id), req.body?.note ? String(req.body.note) : undefined);
  if (!m) return res.status(404).json({ success: false, error: "misión no encontrada" });
  res.json({ success: true, mission: m });
});

router.post("/missions/ingest-rag", async (_req: Request, res: Response) => {
  const r = await ingestMissionSummaryToRag();
  res.json({ success: r.ok, chars: r.chars });
});

export default router;
