import express from "express";
import {
  getModules,
  getRoles,
  createRole,
  getRole,
  editRole,
  deleteRole,
} from "../controllers/roleController";
import { verifyToken, authorizeModules } from "../middlewares/authJwt";

const routes = express.Router();

/**
 * @swagger
 * tags:
 *   name: Roles
 *   description: Roles y permisos del sistema
 */

/**
 * @swagger
 * components:
 *   schemas:
 *     Module:
 *       type: object
 *       properties:
 *         _id:
 *           type: string
 *         name:
 *           type: string
 *         code:
 *           type: string
 *     Role:
 *       type: object
 *       properties:
 *         _id:
 *           type: string
 *         name:
 *           type: string
 *         code:
 *           type: string
 *         description:
 *           type: string
 *         modules:
 *           type: array
 *           items:
 *             $ref: '#/components/schemas/Module'
 *         createdAt:
 *           type: string
 *           format: date-time
 *         updatedAt:
 *           type: string
 *           format: date-time
 *     CreateRoleRequest:
 *       type: object
 *       required: [name, description, modules]
 *       properties:
 *         name:
 *           type: string
 *           description: Nombre del rol
 *         description:
 *           type: string
 *           description: Descripción del rol
 *         modules:
 *           type: array
 *           items:
 *             type: string
 *           description: IDs de módulos asignados al rol
 */

routes.use(verifyToken, authorizeModules("roles"));

/**
 * @swagger
 * /roles/modules:
 *   get:
 *     operationId: getModules
 *     tags: [Roles]
 *     summary: Listar módulos disponibles
 *     description: Obtiene todos los módulos del sistema para asignar a roles
 *     security:
 *       - bearerAuth: []
 *     responses:
 *       200:
 *         description: Lista de módulos obtenida correctamente
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, data]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: true
 *                 data:
 *                   type: array
 *                   items:
 *                     type: object
 *                     properties:
 *                       _id:
 *                         type: string
 *                       name:
 *                         type: string
 *                       code:
 *                         type: string
 *             example:
 *               success: true
 *               data:
 *                 - _id: "65a1b2c3d4e5f6789012345"
 *                   name: "Operaciones"
 *                   code: "operations"
 *                 - _id: "65a1b2c3d4e5f6789012346"
 *                   name: "Roles"
 *                   code: "roles"
 *       500:
 *         description: Error al obtener módulos
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                   example: "Error getting modules"
 *       401:
 *         $ref: "#/components/responses/Unauthorized"
 *       403:
 *         $ref: "#/components/responses/Forbidden"
 */
routes.route("/modules").get(getModules);

/**
 * @swagger
 * /roles:
 *   get:
 *     operationId: getRoles
 *     tags: [Roles]
 *     summary: Listar roles
 *     security:
 *       - bearerAuth: []
 *     responses:
 *       200:
 *         description: Lista de roles obtenida correctamente
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, data]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: true
 *                 data:
 *                   type: array
 *                   items:
 *                     $ref: '#/components/schemas/Role'
 *             example:
 *               success: true
 *               data:
 *                 - _id: "65a1b2c3d4e5f6789012347"
 *                   name: "Administrador"
 *                   code: "administrador"
 *                   description: "Acceso total al sistema"
 *                   modules:
 *                     - _id: "65a1b2c3d4e5f6789012345"
 *                       name: "Operaciones"
 *                       code: "operations"
 *       500:
 *         description: Error al obtener roles
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                   example: "Error getting roles"
 *       401:
 *         $ref: "#/components/responses/Unauthorized"
 *       403:
 *         $ref: "#/components/responses/Forbidden"
 *   post:
 *     operationId: createRole
 *     tags: [Roles]
 *     summary: Crear rol
 *     security:
 *       - bearerAuth: []
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/CreateRoleRequest'
 *           example:
 *             name: "Supervisor"
 *             description: "Supervisor de operaciones"
 *             modules: ["65a1b2c3d4e5f6789012345", "65a1b2c3d4e5f6789012346"]
 *     responses:
 *       201:
 *         description: Rol creado correctamente
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, message]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: true
 *                 message:
 *                   type: string
 *                   example: "Role created successfully"
 *             example:
 *               success: true
 *               message: "Role created successfully"
 *       400:
 *         description: Campos requeridos faltantes
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, message, code]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                 code:
 *                   type: string
 *                   example: "field_missing"
 *             example:
 *               success: false
 *               message: "Name, description and modules are required"
 *               code: "field_missing"
 *       401:
 *         $ref: "#/components/responses/Unauthorized"
 *       403:
 *         $ref: "#/components/responses/Forbidden"
 */
routes.route("/").get(getRoles).post(createRole);

/**
 * @swagger
 * /roles/{id}:
 *   get:
 *     operationId: getRole
 *     tags: [Roles]
 *     summary: Obtener rol por ID
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: string
 *         description: ID del rol
 *     responses:
 *       200:
 *         description: Rol obtenido correctamente
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, data]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: true
 *                 data:
 *                   $ref: '#/components/schemas/Role'
 *             example:
 *               success: true
 *               data:
 *                 _id: "65a1b2c3d4e5f6789012347"
 *                 name: "Administrador"
 *                 code: "administrador"
 *                 description: "Acceso total al sistema"
 *                 modules:
 *                   - _id: "65a1b2c3d4e5f6789012345"
 *                     name: "Operaciones"
 *                     code: "operations"
 *       404:
 *         description: Rol no encontrado
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                   example: "Role not found"
 *       401:
 *         $ref: "#/components/responses/Unauthorized"
 *       403:
 *         $ref: "#/components/responses/Forbidden"
 *   put:
 *     operationId: editRole
 *     tags: [Roles]
 *     summary: Actualizar rol
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: string
 *         description: ID del rol
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/CreateRoleRequest'
 *           example:
 *             name: "Supervisor Actualizado"
 *             description: "Supervisor con permisos ampliados"
 *             modules: ["65a1b2c3d4e5f6789012345", "65a1b2c3d4e5f6789012346"]
 *     responses:
 *       200:
 *         description: Rol actualizado correctamente
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, message]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: true
 *                 message:
 *                   type: string
 *                   example: "Rol editado con éxito"
 *             example:
 *               success: true
 *               message: "Rol editado con éxito"
 *       400:
 *         description: Campos requeridos faltantes
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                 code:
 *                   type: string
 *                   example: "field_missing"
 *             example:
 *               success: false
 *               message: "Name, description and modules are required"
 *               code: "field_missing"
 *       404:
 *         description: Rol no encontrado
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                   example: "Rol no encontrado"
 *       401:
 *         $ref: "#/components/responses/Unauthorized"
 *       403:
 *         $ref: "#/components/responses/Forbidden"
 *   delete:
 *     operationId: deleteRole
 *     tags: [Roles]
 *     summary: Eliminar rol
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: id
 *         required: true
 *         schema:
 *           type: string
 *         description: ID del rol
 *     responses:
 *       200:
 *         description: Rol eliminado correctamente
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               required: [success, message]
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: true
 *                 message:
 *                   type: string
 *                   example: "Rol eliminado con éxito"
 *             example:
 *               success: true
 *               message: "Rol eliminado con éxito"
 *       400:
 *         description: Rol tiene usuarios asociados
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                   example: "Rol no puede eliminarse porque tiene usuarios asociados"
 *             example:
 *               success: false
 *               message: "Rol no puede eliminarse porque tiene usuarios asociados"
 *       404:
 *         description: Rol no encontrado
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   example: false
 *                 message:
 *                   type: string
 *                   example: "Rol no encontrado"
 *       401:
 *         $ref: "#/components/responses/Unauthorized"
 *       403:
 *         $ref: "#/components/responses/Forbidden"
 */
routes.route("/:id").get(getRole).put(editRole).delete(deleteRole);

export default routes;
