const express = require('express');
const router = express.Router();
// Importar middlewares
const { verifyToken } = require('../middlewares/auth');
// Importar rutas de autenticación
const authRoutes = require('./auth.routes');
// Importar rutas de exportar e importar datos
const dataRoutes = require('./data.routes');
// las rutas base para CRUD
const { createCrudRoutes } = require('./base.routes');

// Importar controladores
const tipoController = require('../controllers/tipo.controller');
const tipodosController = require('../controllers/tipodos.controller');
const duracionController = require('../controllers/duracion.controller');
const diagnosticoController = require('../controllers/diagnostico.controller');
const empresaController = require('../controllers/empresa.controller');
const especialidadController = require('../controllers/especialidad.controller');
const adminController = require('../controllers/admin.controller');
const doctorController = require('../controllers/doctor.controller');
const clienteController = require('../controllers/cliente.controller');
const citaController = require('../controllers/cita.controller');
const especialistaController = require('../controllers/especialista.controller');
const detallecitaController = require('../controllers/detallecita.controller');
const laboratorioController = require('../controllers/laboratorio.controller');
const laboratoriodosController = require('../controllers/laboratoriodos.controller');
const itemlaboratorioController = require('../controllers/itemlaboratorio.controller');
const analisisController = require('../controllers/analisis.controller');
const resultadoController = require('../controllers/resultado.controller');
const cartillaController = require('../controllers/cartilla.controller');
const itemcartillaController = require('../controllers/itemcartilla.controller');
const agendamientoController = require('../controllers/agendamiento.controller');
const auditoriaController = require('../controllers/auditoria.controller');
const examepacienteController = require('../controllers/examenpaciente.controller');
const duracioncitaController = require('../controllers/duracioncita.controller');
const laboratoriodoscitaController = require('../controllers/laboratoriodoscita.controller');

const {
  antecedenteheredofamiliarController,
  antecedentenopatologicoController,
  antecedentepatologicoController,
  antecedenteheredofamiliarhistoriaController,
  antecedentenopatologicohistoriaController,
  antecedentepatologicohistoriaController
} = require('../controllers/antecedentes.controller');

const {
  dermatomafrontalController,
  dermatomaposteriorController
} = require('../controllers/dermatoma.controller');

// ============================================
// RUTAS DE EXPORTAR E INSERTAR DATOS (sin token)
// ============================================
router.use('/data', dataRoutes);

// ============================================
// RUTAS DE AUTENTICACIÓN (sin token)
// ============================================
router.use('/auth', authRoutes);

// ============================================
// TABLAS INDEPENDIENTES (sin token requerido)
// ============================================

// Tipo
router.use('/tipo', createCrudRoutes(tipoController, 'Tipo', { requireAuth: false }));

// Tipodos
router.use('/tipodos', createCrudRoutes(tipodosController, 'Tipodos', { requireAuth: false }));

// Duracion
router.use('/duracion', createCrudRoutes(duracionController, 'Duracion', { requireAuth: false }));

// Diagnostico
const diagnosticoRouter = createCrudRoutes(diagnosticoController, 'Diagnostico', { requireAuth: false });
diagnosticoRouter.get('/codigo/:codigo', diagnosticoController.findByCodigoCIE);
router.use('/diagnostico', diagnosticoRouter);

// Empresa
router.use('/empresa', createCrudRoutes(empresaController, 'Empresa', { requireAuth: false }));

// Especialidad
router.use('/especialidad', createCrudRoutes(especialidadController, 'Especialidad', { requireAuth: false }));

// Laboratorio
const laboratorioRouter = createCrudRoutes(laboratorioController, 'Laboratorio', { requireAuth: false });
laboratorioRouter.get('/tipo/:tipoId', laboratorioController.getByTipo);
router.use('/laboratorio', laboratorioRouter);

// Laboratoriodos
const laboratoriodosRouter = createCrudRoutes(laboratoriodosController, 'Laboratoriodos', { requireAuth: false });
laboratoriodosRouter.get('/tipodos/:tipodosId', laboratoriodosController.getByTipodos);
router.use('/laboratoriodos', laboratoriodosRouter);

// ItemLaboratorio
const itemlaboratorioRouter = createCrudRoutes(itemlaboratorioController, 'ItemLaboratorio', { requireAuth: false });
itemlaboratorioRouter.get('/laboratorio/:laboratorioId', itemlaboratorioController.getByLaboratorio);
router.use('/itemlaboratorio', itemlaboratorioRouter);

// Antecedentes (catálogos)
router.use('/antecedenteheredofamiliar', createCrudRoutes(antecedenteheredofamiliarController, 'Antecedenteheredofamiliar', { requireAuth: false }));
router.use('/antecedentenopatologico', createCrudRoutes(antecedentenopatologicoController, 'Antecedentenopatologico', { requireAuth: false }));
router.use('/antecedentepatologico', createCrudRoutes(antecedentepatologicoController, 'Antecedentepatologico', { requireAuth: false }));

// ============================================
// ADMIN Y DOCTOR (requieren token)
// ============================================

// Admin
const adminRouter = express.Router();
adminRouter.get('/', verifyToken, adminController.getAll);
adminRouter.get('/search', adminController.search);
adminRouter.get('/email/:email', adminController.findByEmail);
adminRouter.put('/code/:id', adminController.updateAdminCode);
adminRouter.get('/:id', verifyToken, adminController.getById);
adminRouter.post('/', verifyToken, adminController.create);
adminRouter.put('/:id', verifyToken, adminController.update);
adminRouter.delete('/:id', verifyToken, adminController.delete);
router.use('/admin', adminRouter);

// Doctor
const doctorRouter = express.Router();
doctorRouter.get('/', doctorController.getAll);
doctorRouter.get('/search', doctorController.search);
doctorRouter.get('/email/:email', doctorController.findByEmail);
doctorRouter.put('/code/:id', doctorController.updateDoctorCode);
doctorRouter.get('/:id', verifyToken, doctorController.getById);
doctorRouter.post('/', verifyToken, doctorController.create);
doctorRouter.put('/:id', verifyToken, doctorController.update);
doctorRouter.delete('/:id', verifyToken, doctorController.delete);
router.use('/doctor', doctorRouter);

// ============================================
// TABLAS DEPENDIENTES (requieren token)
// ============================================

// Cliente
const clienteRouter = createCrudRoutes(clienteController, 'Cliente', { requireAuth: true });
clienteRouter.get('/document/:document', verifyToken, clienteController.findByDocument);
clienteRouter.get('/buscar/:query', verifyToken, clienteController.findByName);
clienteRouter.get('/:id/historial', verifyToken, clienteController.getHistorialMedico);
router.use('/cliente', clienteRouter);

// Cita
const citaRouter = createCrudRoutes(citaController, 'Cita', { requireAuth: true });
citaRouter.get('/cliente/:clienteId', verifyToken, citaController.getByCliente);
citaRouter.get('/admin/:adminId', verifyToken, citaController.getByAdmin);
citaRouter.get('/fecha/:fecha', verifyToken, citaController.getByFecha);
citaRouter.get('/condition/:condition', verifyToken, citaController.getByCondition);
router.use('/cita', citaRouter);

// Especialista
const especialistaRouter = createCrudRoutes(especialistaController, 'Especialista', { requireAuth: true });
especialistaRouter.get('/doctor/:doctorId', verifyToken, especialistaController.getByDoctor);
especialistaRouter.get('/especialidad/:especialidadId', verifyToken, especialistaController.getByEspecialidad);
router.use('/especialista', especialistaRouter);

// Detallecita
const detallecitaRouter = createCrudRoutes(detallecitaController, 'Detallecita', { requireAuth: true });
detallecitaRouter.get('/cita/:citaId', verifyToken, detallecitaController.getByCita);
router.use('/detallecita', detallecitaRouter);

// Analisis
const analisisRouter = createCrudRoutes(analisisController, 'Analisis', { requireAuth: true });
analisisRouter.get('/cita/:citaId', verifyToken, analisisController.getByCita);
analisisRouter.get('/laboratorio/:laboratorioId', verifyToken, analisisController.getByLaboratorio);
router.use('/analisis', analisisRouter);

// Resultado
const resultadoRouter = createCrudRoutes(resultadoController, 'Resultado', { requireAuth: true });
resultadoRouter.get('/cita/:citaId', verifyToken, resultadoController.getByCita);
resultadoRouter.get('/itemlaboratorio/:itemLaboratorioId', verifyToken, resultadoController.getByItemLaboratorio);
router.use('/resultado', resultadoRouter);

// Cartilla
const cartillaRouter = createCrudRoutes(cartillaController, 'Cartilla', { requireAuth: true });
cartillaRouter.get('/paciente/:pacienteId', verifyToken, cartillaController.getByPacienteId);
router.use('/cartilla', cartillaRouter);

// ItemCartilla
const itemcartillaRouter = createCrudRoutes(itemcartillaController, 'ItemCartilla', { requireAuth: true });
itemcartillaRouter.get('/cartilla/:cartillaId', verifyToken, itemcartillaController.getByCartilla);
router.use('/itemcartilla', itemcartillaRouter);

// Agendamiento
const agendamientoRouter = createCrudRoutes(agendamientoController, 'Agendamiento', { requireAuth: true });
agendamientoRouter.get('/paciente/:pacienteId', verifyToken, agendamientoController.getByPaciente);
agendamientoRouter.get('/doctor/:doctorId', verifyToken, agendamientoController.getByDoctor);
agendamientoRouter.get('/fecha/:fecha', verifyToken, agendamientoController.getByFecha);
agendamientoRouter.get('/estado/:estado', verifyToken, agendamientoController.getByEstado);
router.use('/agendamiento', agendamientoRouter);

// Auditoria
const auditoriaRouter = createCrudRoutes(auditoriaController, 'Auditoria', { requireAuth: true });
auditoriaRouter.get('/usuario/:usuarioId', verifyToken, auditoriaController.getByUsuario);
auditoriaRouter.get('/tabla/:tabla', verifyToken, auditoriaController.getByTabla);
auditoriaRouter.get('/accion/:accion', verifyToken, auditoriaController.getByAccion);
router.use('/auditoria', auditoriaRouter);

// Historias de antecedentes
const antecedenteheredofamiliarhistoriaRouter = createCrudRoutes(antecedenteheredofamiliarhistoriaController, 'Antecedenteheredofamiliarhistoria', { requireAuth: true });
antecedenteheredofamiliarhistoriaRouter.get('/cliente/:clienteId', verifyToken, antecedenteheredofamiliarhistoriaController.getByCliente);
router.use('/antecedenteheredofamiliarhistoria', antecedenteheredofamiliarhistoriaRouter);

const antecedentenopatologicohistoriaRouter = createCrudRoutes(antecedentenopatologicohistoriaController, 'Antecedentenopatologicohistoria', { requireAuth: true });
antecedentenopatologicohistoriaRouter.get('/cliente/:clienteId', verifyToken, antecedentenopatologicohistoriaController.getByCliente);
router.use('/antecedentenopatologicohistoria', antecedentenopatologicohistoriaRouter);

const antecedentepatologicohistoriaRouter = createCrudRoutes(antecedentepatologicohistoriaController, 'Antecedentepatologicohistoria', { requireAuth: true });
antecedentepatologicohistoriaRouter.get('/cliente/:clienteId', verifyToken, antecedentepatologicohistoriaController.getByCliente);
router.use('/antecedentepatologicohistoria', antecedentepatologicohistoriaRouter);

// Dermatomas
const dermatomafrontalRouter = createCrudRoutes(dermatomafrontalController, 'Dermatomafrontal', { requireAuth: true });
dermatomafrontalRouter.get('/cita/:citaId', verifyToken, dermatomafrontalController.getByCita);
router.use('/dermatomafrontal', dermatomafrontalRouter);

const dermatomaposteriorRouter = createCrudRoutes(dermatomaposteriorController, 'Dermatomaposterior', { requireAuth: true });
dermatomaposteriorRouter.get('/cita/:citaId', verifyToken, dermatomaposteriorController.getByCita);
router.use('/dermatomaposterior', dermatomaposteriorRouter);

// Examepaciente
const examepacienteRouter = createCrudRoutes(examepacienteController, 'Examepaciente', { requireAuth: true });
examepacienteRouter.get('/detallecita/:detallecitaId', verifyToken, examepacienteController.getByDetallecita);
router.use('/examepaciente', examepacienteRouter);

// Duracioncita
const duracioncitaRouter = createCrudRoutes(duracioncitaController, 'Duracioncita', { requireAuth: true });
duracioncitaRouter.get('/detallecita/:detallecitaId', verifyToken, duracioncitaController.getByDetallecita);
router.use('/duracioncita', duracioncitaRouter);

// Laboratoriodoscita
const laboratoriodoscitaRouter = createCrudRoutes(laboratoriodoscitaController, 'Laboratoriodoscita', { requireAuth: true });
laboratoriodoscitaRouter.get('/cita/:citaId', verifyToken, laboratoriodoscitaController.getByCita);
laboratoriodoscitaRouter.get('/laboratoriodos/:laboratoriodosId', verifyToken, laboratoriodoscitaController.getByLaboratoriodos);
router.use('/laboratoriodoscita', laboratoriodoscitaRouter);

module.exports = router;