import { Router, Request, Response } from "express";
import { storage } from "../storage";
import { enqueueSeleniumJob } from "../queue/jobRunner";
import { forwardOtpToSeleniumTuftsSCOClaimAgent } from "../services/seleniumTuftsSCOClaimClient";
import { io } from "../socket";

const router = Router();

/**
 * POST /tuftssco-claim
 *
 * Enqueues a Tufts SCO (DentaQuest) claim submission job.
 *
 * Body fields (JSON):
 *   data     — claim payload (memberId, dateOfBirth, serviceDate, serviceLines, patientName, etc.)
 *   socketId — socket.io client id
 *   claimId  — existing claim DB id (optional)
 *
 * Response: { status: "queued", jobId: "…" }
 */
router.post("/tuftssco-claim", async (req: Request, res: Response): Promise<any> => {
  if (!req.user?.id) {
    return res.status(401).json({ error: "Unauthorized: user info missing" });
  }

  try {
    const claimData =
      typeof req.body.data === "string"
        ? JSON.parse(req.body.data)
        : req.body.data ?? req.body ?? {};

    // Fetch Tufts SCO (DentaQuest) credentials
    const credentials = await storage.getInsuranceCredentialByUserAndSiteKey(
      req.user.id,
      "TUFTS_SCO"
    );
    if (!credentials) {
      return res.status(404).json({
        error: "No Tufts SCO credentials found. Please add them on the Settings page.",
      });
    }

    const enrichedPayload = {
      claim: {
        ...claimData,
        dentaquestUsername: credentials.username,
        dentaquestPassword: credentials.password,
      },
    };

    const socketId: string | undefined = req.body.socketId;
    const claimId: number | undefined = claimData.claimId
      ? Number(claimData.claimId)
      : undefined;

    const jobId = enqueueSeleniumJob({
      jobType: "tuftssco-claim-submit",
      userId: req.user.id,
      socketId,
      enrichedPayload,
      claimId,
    });

    return res.json({ status: "queued", jobId });
  } catch (err: any) {
    console.error("[tuftssco-claim route] error:", err);
    return res.status(500).json({
      error: err.message || "Failed to enqueue Tufts SCO claim job",
    });
  }
});

/**
 * POST /claims/tuftssco-claim/selenium/submit-otp
 * Body: { session_id, otp, socketId? }
 */
router.post("/tuftssco-claim/selenium/submit-otp", async (req: Request, res: Response): Promise<any> => {
  const { session_id: sessionId, otp, socketId } = req.body;
  if (!sessionId || !otp) {
    return res.status(400).json({ error: "session_id and otp are required" });
  }
  try {
    const r = await forwardOtpToSeleniumTuftsSCOClaimAgent(sessionId, otp);
    if (socketId && io) {
      io.to(socketId).emit("selenium:otp_submitted", { session_id: sessionId });
    }
    return res.json(r);
  } catch (err: any) {
    console.error("[tuftssco-claim] submit-otp failed:", err?.message);
    return res.status(500).json({ error: err?.message || "Failed to forward OTP" });
  }
});

export default router;
