import express from 'express';
import path from 'path';
import * as aiKurzyController from '../controllers/ai-kurzy.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { requireTeamLeaderOrAdmin } from '../middlewares/auth/roleMiddleware.js';
import { validateBody, validateParams, validateQuery } from '../middlewares/security/validateInput.js';
import { createUpload, ALLOWED_FILE_TYPES } from '../config/upload.js';
import {
  kurzIdSchema,
  ucastnikIdSchema,
  registraciaIdSchema,
  createKurzSchema,
  updateKurzSchema,
  createUcastnikSchema,
  updateUcastnikSchema,
  createRegistraciaSchema,
  updateRegistraciaSchema,
  registracieQuerySchema,
  updateFieldSchema,
  prilohaIdSchema,
} from '../validators/ai-kurzy.validators.js';

const router = express.Router();

const upload = createUpload({
  maxSizeMB: 10,
  allowedTypes: ALLOWED_FILE_TYPES,
  errorMessage: 'Nepovolený typ súboru. Povolené: PDF, Word, Excel, obrázky, CSV, TXT.',
  diskPath: path.join(process.cwd(), 'uploads', 'ai-kurzy'),
});

// All routes require authentication and admin or team_leader role
router.use(authenticate);
router.use(requireTeamLeaderOrAdmin);

// ==================== STATISTICS ====================

router.get('/stats', aiKurzyController.getStats);

// ==================== KURZY ====================

router.get('/kurzy', aiKurzyController.getAllKurzy);

router.post(
  '/kurzy',
  validateBody(createKurzSchema),
  aiKurzyController.createKurz
);

router.get(
  '/kurzy/:kurzId',
  validateParams(kurzIdSchema),
  aiKurzyController.getKurzById
);

router.put(
  '/kurzy/:kurzId',
  validateParams(kurzIdSchema),
  validateBody(updateKurzSchema),
  aiKurzyController.updateKurz
);

router.delete(
  '/kurzy/:kurzId',
  validateParams(kurzIdSchema),
  aiKurzyController.deleteKurz
);

// ==================== UCASTNICI ====================

router.get('/ucastnici', aiKurzyController.getAllUcastnici);

router.post(
  '/ucastnici',
  validateBody(createUcastnikSchema),
  aiKurzyController.createUcastnik
);

router.get(
  '/ucastnici/:ucastnikId',
  validateParams(ucastnikIdSchema),
  aiKurzyController.getUcastnikById
);

router.put(
  '/ucastnici/:ucastnikId',
  validateParams(ucastnikIdSchema),
  validateBody(updateUcastnikSchema),
  aiKurzyController.updateUcastnik
);

router.delete(
  '/ucastnici/:ucastnikId',
  validateParams(ucastnikIdSchema),
  aiKurzyController.deleteUcastnik
);

// ==================== REGISTRACIE ====================

router.get(
  '/registracie',
  validateQuery(registracieQuerySchema),
  aiKurzyController.getAllRegistracie
);

router.post(
  '/registracie',
  validateBody(createRegistraciaSchema),
  aiKurzyController.createRegistracia
);

router.get(
  '/registracie/:registraciaId',
  validateParams(registraciaIdSchema),
  aiKurzyController.getRegistraciaById
);

router.put(
  '/registracie/:registraciaId',
  validateParams(registraciaIdSchema),
  validateBody(updateRegistraciaSchema),
  aiKurzyController.updateRegistracia
);

router.delete(
  '/registracie/:registraciaId',
  validateParams(registraciaIdSchema),
  aiKurzyController.deleteRegistracia
);

// ==================== COMBINED TABLE (Excel-style) ====================

router.get('/table', aiKurzyController.getCombinedTable);

router.patch(
  '/table/:registraciaId/field',
  validateParams(registraciaIdSchema),
  validateBody(updateFieldSchema),
  aiKurzyController.updateField
);

// ==================== PRILOHY (Documents) ====================

router.get(
  '/registracie/:registraciaId/prilohy',
  validateParams(registraciaIdSchema),
  aiKurzyController.getPrilohy
);

router.post(
  '/registracie/:registraciaId/prilohy',
  validateParams(registraciaIdSchema),
  upload.single('file'),
  aiKurzyController.uploadPriloha
);

router.delete(
  '/prilohy/:prilohaId',
  validateParams(prilohaIdSchema),
  aiKurzyController.deletePriloha
);

router.get(
  '/prilohy/:prilohaId/download',
  validateParams(prilohaIdSchema),
  aiKurzyController.downloadPriloha
);

// ==================== CERTIFICATE ====================

router.post(
  '/registracie/:registraciaId/certificate',
  validateParams(registraciaIdSchema),
  aiKurzyController.generateCertificate
);

export default router;
