import { Router } from 'express';
import { requireVisitorCheckpointAuth, requireScanAccess } from '../middleware/auth';
import {
  visitorScannerLogin,
  visitorCheckin,
  visitorLookup,
  visitorScannerStats,
  createVisitorRequest,
  listCheckpointRequests,
  completeVisitorRequest,
  visitorStatusByShortId,
  walkInArrived,
  listApproversForScanner,
  scanHistory,
  visitorScannerMe,
} from '../controllers/visitor-scanner.controller';
import { checkpointNotifications } from '../controllers/notifications.controller';
import { listVisitorReasonsForScanner } from '../controllers/visitorReasons.controller';

const router = Router();

// Endpoints usable by either a logged-in reception checkpoint OR a
// workspace owner / admin with canScanCheckpoint. The mobile app's Scan
// tab calls these with the existing owner/admin OTP token.
router.get('/reasons', requireScanAccess, listVisitorReasonsForScanner);

router.post('/login', visitorScannerLogin);
router.post('/checkin', requireScanAccess, visitorCheckin);
router.get('/stats', requireScanAccess, visitorScannerStats);
router.get('/lookup/:query', requireScanAccess, visitorLookup);
router.get('/status/:shortId', requireScanAccess, visitorStatusByShortId);
router.post('/walk-in-arrived', requireScanAccess, walkInArrived);
router.get('/approvers', requireScanAccess, listApproversForScanner);
router.get('/scan-history', requireScanAccess, scanHistory);

// Checkpoint-only endpoints. VisitorRequest rows hard-require a checkpointId
// (DB constraint), and the notifications below address the checkpoint's own
// notification stream — admins have their own bell elsewhere.
router.get('/me', requireVisitorCheckpointAuth, visitorScannerMe);

router.post('/requests', requireVisitorCheckpointAuth, createVisitorRequest);
router.get('/requests', requireVisitorCheckpointAuth, listCheckpointRequests);
router.post('/requests/:id/complete', requireVisitorCheckpointAuth, completeVisitorRequest);

router.get('/notifications', requireVisitorCheckpointAuth, checkpointNotifications.list);
router.post('/notifications/read-all', requireVisitorCheckpointAuth, checkpointNotifications.markAllRead);
router.post('/notifications/:id/read', requireVisitorCheckpointAuth, checkpointNotifications.markRead);

export default router;
