import { Router, Response } from 'express';
import { getPortalData } from '../services/portal.service';
import { validate } from '../middleware/validate';
import { publicLimiter } from '../middleware/rateLimits';
import { PortalDeclineSchema } from '@nobel/shared';
import prisma from '../lib/prisma';

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

router.get('/:token', async (req, res: Response) => {
  const data = await getPortalData(req.params.token);
  res.json(data);
});

// Customer responds to a staff-initiated approval request on the active order.
// Only valid while the order's approvalStatus is 'pending'.
router.post('/:token/approve', async (req, res: Response) => {
  const portalData = await getPortalData(req.params.token);
  const order = portalData.currentOrder;
  if (!order) { res.status(400).json({ error: 'No active order' }); return; }

  const updated = await prisma.workOrder.updateMany({
    where: { id: order.id, approvalStatus: 'pending' },
    data: { approvalStatus: 'approved', approvalAt: new Date(), declineReason: null },
  });
  if (updated.count === 0) {
    res.status(409).json({ error: 'No approval is currently requested for this order' });
    return;
  }

  await prisma.auditLog.create({
    data: { action: 'portal_approve', entityType: 'WorkOrder', entityId: order.id },
  });

  res.json({ ok: true, approvalStatus: 'approved' });
});

router.post('/:token/decline', validate(PortalDeclineSchema), async (req, res: Response) => {
  const portalData = await getPortalData(req.params.token);
  const order = portalData.currentOrder;
  if (!order) { res.status(400).json({ error: 'No active order' }); return; }

  const reason = (req.body as { reason?: string }).reason || null;
  const updated = await prisma.workOrder.updateMany({
    where: { id: order.id, approvalStatus: 'pending' },
    data: { approvalStatus: 'declined', approvalAt: new Date(), declineReason: reason },
  });
  if (updated.count === 0) {
    res.status(409).json({ error: 'No approval is currently requested for this order' });
    return;
  }

  await prisma.auditLog.create({
    data: { action: 'portal_decline', entityType: 'WorkOrder', entityId: order.id, details: { reason } },
  });

  res.json({ ok: true, approvalStatus: 'declined' });
});

export default router;
