import express, { Request, Response } from 'express';
import { isFaceVerifyEnabled } from '../config/faceVerify';
import { requirePhpAuth } from '../middleware/phpJwtAuth';
import { resolveFaceVerifyConfig } from '../services/faceVerifyConfig.service';
import { faceModelsReady } from '../services/faceVerifyModels.service';
import { runFaceVerifyCompare } from '../services/faceVerify.service';

const router = express.Router();

/** GET /api/face-verify/status */
router.get('/status', (_req, res) => {
  res.json({
    success: true,
    data: {
      enabled: isFaceVerifyEnabled(),
      modelsReady: faceModelsReady(),
    },
  });
});

/** GET /api/face-verify/config?courseId=&recId=&itemId= */
router.get('/config', requirePhpAuth, async (req, res) => {
  try {
    const courseId = String(req.query.courseId || '');
    const recId = String(req.query.recId || '');
    const itemId = String(req.query.itemId || '');
    const config = await resolveFaceVerifyConfig(courseId, recId, itemId);
    return res.json({ success: true, data: config });
  } catch (e: unknown) {
    const message = e instanceof Error ? e.message : 'Unknown error';
    return res.status(500).json({ success: false, message });
  }
});

/**
 * POST /api/face-verify/compare
 * body: { snapshotUrl, userId, courseId, recId, itemId, name?, device? }
 */
router.post('/compare', requirePhpAuth, async (req: Request, res: Response) => {
  try {
    if (!isFaceVerifyEnabled()) {
      return res.json({
        success: true,
        data: {
          enabled: false,
          passed: true,
          message: 'Face verify disabled',
        },
      });
    }

    const authUser = req.authUser!;
    const {
      snapshotUrl,
      userId,
      courseId = '',
      recId = '',
      itemId = '',
      name,
      device,
    } = req.body || {};

    if (!snapshotUrl || !userId) {
      return res.status(400).json({
        success: false,
        message: 'snapshotUrl and userId are required',
      });
    }

    if (String(userId) !== authUser.user_id) {
      return res.status(403).json({
        success: false,
        message: 'ไม่สามารถตรวจใบหน้าของผู้ใช้อื่นได้',
      });
    }

    const io = req.app.locals.io;
    const result = await runFaceVerifyCompare(
      {
        userId: String(userId),
        userName: String(name || authUser.userid || userId),
        courseId: String(courseId),
        recId: String(recId),
        itemId: String(itemId),
        snapshotUrl: String(snapshotUrl),
        device: device ? String(device) : undefined,
      },
      io,
    );

    return res.json({ success: true, data: result });
  } catch (e: unknown) {
    const message = e instanceof Error ? e.message : 'Face verify failed';
    console.error('POST /api/face-verify/compare', e);
    return res.status(500).json({ success: false, message });
  }
});

export default router;
