import { Router, type IRouter } from 'express';
import { authenticate, authorize } from '../middlewares/auth.middleware.js';
import { tenantMiddleware } from '../middlewares/tenant.middleware.js';
import { strictLimit } from '../middlewares/rate-limit.middleware.js';
import * as facturacionController from '../controllers/facturacion.controller.js';

const router: IRouter = Router();

router.use(authenticate);
router.use(tenantMiddleware);

// Organización Facturapi
router.get('/org/status', facturacionController.getOrgStatus);
router.post('/org', authorize('owner', 'cfo'), facturacionController.createOrg);

// CSD
router.post('/csd', authorize('owner', 'cfo'), facturacionController.uploadCsd);

// Estado LCO — banner "CSD en proceso de validación" si hubo rechazo del SAT en últimas 24h
router.get('/lco-status', facturacionController.getLcoStatus);

// Emisión y cancelación (admin + contador). 10/hora — cada emisión quema timbre + side-effect en Facturapi/SAT
router.post('/emitir', strictLimit, facturacionController.emitir);
router.post('/cancelar/:uuid', strictLimit, facturacionController.cancelar);

// Descargas
router.get('/pdf/:id', facturacionController.downloadPdf);
router.get('/xml/:id', facturacionController.downloadXml);

// Timbres
router.get('/timbres', facturacionController.getTimbres);
router.get('/timbres/paquetes-catalogo', facturacionController.getPaquetesCatalogo);
// 10/h — cada compra crea MP Preference (side-effect en tercero)
router.post('/timbres/paquetes/comprar', strictLimit, facturacionController.comprarPaquete);
// Admin global: catálogo completo + editar precios
router.get('/timbres/paquetes-catalogo/admin', facturacionController.getPaquetesCatalogoAdmin);
router.put('/timbres/paquetes-catalogo/:id', facturacionController.updatePaqueteCatalogo);

// Personalización (logo, color)
router.get('/customization', facturacionController.getCustomization);
router.post('/logo', facturacionController.uploadLogo);
router.put('/color', facturacionController.updateColor);

// Datos fiscales del tenant
router.get('/datos-fiscales', facturacionController.getDatosFiscales);
router.put('/datos-fiscales', facturacionController.updateDatosFiscales);

// Búsqueda de RFCs para autocompletar
router.get('/rfcs/search', facturacionController.searchRfcs);

// Búsqueda de conceptos previos
router.get('/conceptos/search', facturacionController.searchConceptos);

// CFDIs PPD pendientes de pago por RFC
router.get('/cfdis-ppd', facturacionController.getCfdisPpdPendientes);

export { router as facturacionRoutes };
