import { Router, Request, Response } from "express";
import { requireAdmin } from "../middleware/requireAdmin";
import { bridgeStatus } from "../services/bridgeExecService";
import {
  acceptAndExecute,
  ensureSeedIfEmpty,
  generateFromLab,
  listProposals,
  reject,
} from "../services/proposalsService";

const router = Router();
router.use(requireAdmin);

router.get("/bridge/status", async (_req: Request, res: Response) => {
  res.json(await bridgeStatus());
});

router.get("/proposals", (_req: Request, res: Response) => {
  ensureSeedIfEmpty();
  const status = _req.query.status ? String(_req.query.status) : undefined;
  res.json({ items: listProposals(status) });
});

router.post("/proposals/generate", async (_req: Request, res: Response) => {
  const items = await generateFromLab(true, 5);
  res.json({ ok: true, count: items.length, items });
});

router.post("/proposals/:id/accept", async (req: Request, res: Response) => {
  const wait = Boolean(req.body?.wait);
  try {
    const item = await acceptAndExecute(String(req.params.id), wait);
    res.json({ ok: true, item });
  } catch (e) {
    const msg = (e as Error).message;
    if (msg === "Propuesta no encontrada") {
      res.status(404).json({ ok: false, error: msg });
      return;
    }
    res.status(400).json({ ok: false, error: msg });
  }
});

router.post("/proposals/:id/reject", (req: Request, res: Response) => {
  const reason = String(req.body?.reason || "");
  try {
    const item = reject(String(req.params.id), reason);
    res.json({ ok: true, item });
  } catch (e) {
    res.status(404).json({ ok: false, error: (e as Error).message || "Propuesta no encontrada" });
  }
});

export default router;
