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

const router = Router();

/**
 * POST /ddma-claim
 *
 * Enqueues a Delta Dental MA 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("/ddma-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 DDMA credentials
    const credentials = await storage.getInsuranceCredentialByUserAndSiteKey(
      req.user.id,
      "DDMA"
    );
    if (!credentials) {
      return res.status(404).json({
        error: "No Delta Dental MA credentials found. Please add them on the Settings page.",
      });
    }

    // Use provider from the claim form if set; fall back to Provider #1 (default)
    const npiProviders = await storage.getNpiProvidersByUser(req.user.id);
    const primaryProvider = npiProviders[0];
    const providerName =
      (claimData.npiProvider?.providerName as string | undefined)?.trim() ||
      primaryProvider?.providerName ||
      "";

    const enrichedPayload = {
      claim: {
        ...claimData,
        massddmaUsername: credentials.username,
        massddmaPassword: credentials.password,
        providerName,
      },
    };

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

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

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

/**
 * POST /claims/ddma-claim/selenium/submit-otp
 * Body: { session_id, otp, socketId? }
 */
router.post("/ddma-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 forwardOtpToSeleniumDDMAClaimAgent(sessionId, otp);
    if (socketId && io) {
      io.to(socketId).emit("selenium:otp_submitted", { session_id: sessionId });
    }
    return res.json(r);
  } catch (err: any) {
    console.error("[ddma-claim] submit-otp failed:", err?.message);
    return res.status(500).json({ error: err?.message || "Failed to forward OTP" });
  }
});

export default router;
