import { Router } from 'express';
import {
  createPayment,
  verifyPayment,
  refundPayment,
  retryPayment,
  cancelPayment,
  getPaymentHistory,
  getPayments,
  getPaymentById,
  getPaymentStatus,
  handleGatewayCallback,
  handleGatewayWebhook,
  downloadInvoice,
} from '../controllers/payment.controller';
import { authenticateJWT } from '../../../middleware/auth.middleware';
import { authorizeRoles } from '../../../middleware/rbac.middleware';
import { validateRequest } from '../../../middleware/validate.middleware';
import {
  initiatePaymentSchema,
  verifyPaymentSchema,
  refundPaymentSchema,
} from '../validators/payment.validator';

const router = Router();

// ==========================================
// 1. PUBLIC / USER ENDPOINTS (AUTHENTICATED)
// ==========================================
router.post('/create', authenticateJWT, validateRequest(initiatePaymentSchema), createPayment);
router.post('/verify', authenticateJWT, validateRequest(verifyPaymentSchema), verifyPayment);
router.post('/retry', authenticateJWT, retryPayment);
router.post('/cancel', authenticateJWT, cancelPayment);
router.get('/history', authenticateJWT, getPaymentHistory);
router.get('/status/:id', authenticateJWT, getPaymentStatus);
router.get('/:id', authenticateJWT, getPaymentById);

// ==========================================
// 2. ADMIN ONLY MANAGEMENT
// ==========================================
router.get('/', authenticateJWT, authorizeRoles('ADMIN'), getPayments);
router.post('/refund', authenticateJWT, authorizeRoles('ADMIN'), validateRequest(refundPaymentSchema), refundPayment);

// ==========================================
// 3. TAX INVOICE DOWNLOAD
// ==========================================
router.get('/invoice/download/:invoiceNumber', downloadInvoice);

// ==========================================
// 4. UNIFIED GATEWAY CALLBACKS & WEBHOOKS
// ==========================================
router.all('/callback/:gateway', handleGatewayCallback);
router.post('/webhook/:gateway', handleGatewayWebhook);

export default router;
