const { isAPIKeyUser } = require("../../middlewares/accessValidator");
const routes = require("express").Router();

const SchemaValidator = require("../../middlewares/schemaValidator");

const FieldMiddleware = require("../../middlewares/fields");

const authController = require("../auth/auth.controller");
const eventController = require("./event.controller");
const eventInscriptionController = require("./events_inscriptions.controller");
const eventReservationController = require("./events_reservations.controller");
const eventValidation = require("./event.validations");

const { cacheSuccesses } = require("../../middlewares/cache");

const SortMiddleware = require("../../middlewares/sort");

const entityController = require("../entities/entity.controller");

const generalInvalidFields = [
  "userId",
  "createdAt",
  "updatedAt",
  "assistants",
  "confirmed",
  "allow_multiple",
  "overflow_eventId",
  "state",
  "confirmed",
  "multiple_limit",
  "marketing_list",
  "state",
  "contact_person",
  "contact_email",
  "createdAt",
  "updatedAt",
];

/**
 * @api {get} /web/events Obtener Eventos Disponibles
 * @apiName GetAvailableEvents
 * @apiGroup Eventos
 * @apiVersion 4.0.0
 * @apiDescription Este endpoint devuelve una lista de eventos disponibles, incluyendo su estado de aforo.
 *
 * @apiSuccess {Object[]} events Lista de eventos disponibles.
 * @apiSuccess {String} events.id Identificador único del evento.
 * @apiSuccess {String} events.name Nombre del evento.
 * @apiSuccess {Object} events.type Tipo del evento.
 * @apiSuccess {String} events.type.name Nombre del tipo de evento.
 * @apiSuccess {String} events.type.title Título del tipo de evento.
 * @apiSuccess {Object} events.location Ubicación del evento.
 * @apiSuccess {String} events.location.country País donde se realiza el evento.
 * @apiSuccess {String} events.location.city Ciudad donde se realiza el evento.
 * @apiSuccess {String} events.location.country_code Código del país del evento.
 * @apiSuccess {Object[]} events.multimedias Lista de recursos multimedia asociados con el evento.
 * @apiSuccess {Object[]} events.details Lista de detalles adicionales del evento.
 * @apiSuccess {Object[]} events.speakers Lista de oradores del evento.
 * @apiSuccess {Object[]} events.partners Lista de socios del evento.
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta:
 * [
 *   {
 *     "id": "03f70b2d-53c5-11ed-9b36-000c29a89113",
 *     "name": "Madrid 2022 - 16ª Edición",
 *     "type": {
 *       "name": "conference",
 *       "title": "Congreso LQDVI"
 *     },
 *     "location": {
 *       "country": "España",
 *       "city": "Madrid",
 *       "country_code": "ES"
 *     },
 *     "multimedias": [],
 *     "details": [],
 *     "speakers": [],
 *     "partners": []
 *   },
 *   {
 *     "id": "b518e0f7-b2d1-11ed-9477-000c29e7c50f",
 *     "name": "Sevilla 2023 - 22ª Edición",
 *     "type": {
 *       "name": "conference",
 *       "title": "Congreso LQDVI"
 *     },
 *     "location": {
 *       "country": "España",
 *       "city": "Sevilla",
 *       "country_code": "ES"
 *     },
 *     "multimedias": [],
 *     "details": [],
 *     "speakers": [],
 *     "partners": []
 *   }
 * ]
 */
routes.get(
  "/web/events/",
  isAPIKeyUser,
  FieldMiddleware.middleware({
    validFields: ["id", "name"],
  }),
  eventController.find({
    scopes: ["defaultScope", "withOpenInscriptions"],
  })
);

/**
 * @api {get} /api/v4/web/events/:eventId Obtener Datos del Evento
 * @apiName GetEventDetails
 * @apiGroup Eventos
 * @apiVersion 4.0.0
 * @apiDescription Este endpoint devuelve los detalles de un evento específico.
 *
 * @apiParam {String} eventId Identificador único del evento.
 *
 * @apiSuccess {String} stateCode Código del estado del evento.
 * @apiSuccess {String} stateText Descripción del estado del evento.
 * @apiSuccess {String} assistanceType Tipos de asistencia disponibles (ej. "onsite, online").
 * @apiSuccess {String} assistanceTypeText Descripción de los tipos de asistencia.
 * @apiSuccess {String} id Identificador único del evento.
 * @apiSuccess {String} name Nombre del evento.
 * @apiSuccess {String} description Descripción del evento.
 * @apiSuccess {String} campaign_text Texto de campaña (si aplica).
 * @apiSuccess {String} init_date Fecha y hora de inicio del evento (ISO 8601).
 * @apiSuccess {String} end_date Fecha y hora de finalización del evento (ISO 8601).
 * @apiSuccess {String} init_available_date Fecha de inicio de disponibilidad (ISO 8601).
 * @apiSuccess {String} end_available_date Fecha de fin de disponibilidad (ISO 8601).
 * @apiSuccess {Number} gmt Diferencia horaria en GMT.
 * @apiSuccess {Boolean} sold_out Indica si el evento está agotado.
 * @apiSuccess {Boolean} allow_overflow Indica si se permite el desbordamiento de asistentes.
 * @apiSuccess {String} typeId Identificador del tipo de evento.
 * @apiSuccess {String} venueId Identificador del lugar del evento.
 * @apiSuccess {String} locationId Identificador de la ubicación.
 * @apiSuccess {String} url_streaming URL para el streaming en vivo del evento.
 * @apiSuccess {String} url_poll URL para encuestas (si aplica).
 * @apiSuccess {String} url_registration URL para el registro (si aplica).
 * @apiSuccess {Boolean} featured Indica si el evento es destacado.
 * @apiSuccess {Boolean} virtual Indica si el evento es virtual.
 * @apiSuccess {Boolean} allow_questions Indica si se permiten preguntas durante el evento.
 * @apiSuccess {Number} assistants Número de asistentes.
 * @apiSuccess {Object} type Tipo del evento.
 * @apiSuccess {String} type.name Nombre del tipo de evento.
 * @apiSuccess {String} type.title Título del tipo de evento.
 * @apiSuccess {Object} location Ubicación del evento.
 * @apiSuccess {String} location.country País donde se realiza el evento.
 * @apiSuccess {String} location.city Ciudad donde se realiza el evento.
 * @apiSuccess {String} location.country_code Código del país del evento.
 * @apiSuccess {Object[]} multimedias Lista de recursos multimedia asociados con el evento.
 * @apiSuccess {Object[]} details Lista de detalles adicionales del evento.
 * @apiSuccess {Object[]} speakers Lista de oradores del evento.
 * @apiSuccess {Object[]} partners Lista de socios del evento.
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta:
 * {
 *   "stateCode": "registrations_open",
 *   "stateText": "Inscripciones abiertas",
 *   "assistanceType": "onsite, online",
 *   "assistanceTypeText": "evento presencial y online",
 *   "id": "03f70b2d-53c5-11ed-9b36-000c29a89113",
 *   "name": "Madrid 2022 - 16ª Edición",
 *   "description": "Palacio Municipal de Congresos de Madrid, Campo de las Naciones, Avenida de la Capital de España s/n\n\nENTREGA PREMIO ALGO+Q1 CANCIÓN",
 *   "campaign_text": "",
 *   "init_date": "2024-08-29T00:00:00.000Z",
 *   "end_date": "2024-12-01T14:30:00.000Z",
 *   "init_available_date": "2023-06-14T17:05:00.000Z",
 *   "end_available_date": "2025-10-30T23:30:00.000Z",
 *   "gmt": 1,
 *   "sold_out": false,
 *   "allow_overflow": false,
 *   "typeId": "0",
 *   "venueId": "43bae260-c0a4-4d1f-8060-e6f54b839d26",
 *   "locationId": "9f1cc156-c8ad-11e9-b18d-000c295f0f58",
 *   "url_streaming": "https://www.loquedeverdadimporta.org/directo/madrid/",
 *   "url_poll": null,
 *   "url_registration": null,
 *   "featured": true,
 *   "virtual": true,
 *   "allow_questions": true,
 *   "assistants": 2000,
 *   "type": {
 *     "name": "conference",
 *     "title": "Congreso LQDVI"
 *   },
 *   "location": {
 *     "country": "España",
 *     "city": "Madrid",
 *     "country_code": "ES"
 *   },
 *   "multimedias": [],
 *   "details": [],
 *   "speakers": [],
 *   "partners": []
 * }
 */

routes.get(
  "/web/events/:id",
  isAPIKeyUser,
  FieldMiddleware.middleware({
    invalidFields: generalInvalidFields,
  }),
  (req, res, next) => {
    const scopes = ["defaultScope"];
    return eventController.findOne({ scopes })(req, res, next);
  }
);

/**
 * @api {get} /api/v4/web/events/:id/check_capacity Verificar Capacidad del Evento
 * @apiName CheckEventCapacity
 * @apiGroup Eventos
 * @apiVersion 1.0.0
 * @apiDescription Determina si hay aforo suficiente para el tamaño de grupo que se ha indicado.
 *
 * @apiParam {String} id ID único del evento.
 *
 * @apiSuccess {String} eventId ID único del evento.
 * @apiSuccess {Number} group_size Tamaño del grupo para el cual se verifica el aforo.
 * @apiSuccess {Boolean} allow Indica si el aforo es suficiente para el grupo.
 * @apiSuccess {Number} assistants Número total de asistentes permitidos.
 * @apiSuccess {Number} confirmed Número de asistentes confirmados.
 * @apiSuccess {Boolean} sold_out Indica si el evento está completamente lleno.
 * @apiSuccess {Number} assistants_overflow Número de asistentes que sobrepasan el aforo.
 * @apiSuccess {Number} confirmed_overflow Número de confirmados que sobrepasan el aforo.
 * @apiSuccess {Boolean} sold_out_overflow Indica si se permite la asistencia en exceso.
 * @apiSuccess {Boolean} allow_overflow Indica si el exceso de asistentes está permitido.
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta:
 *     HTTP/1.1 200 OK
 *     {
 *       "eventId": "03f70b2d-53c5-11ed-9b36-000c29a89113",
 *       "group_size": 1,
 *       "allow": true,
 *       "assistants": 2000,
 *       "confirmed": 325,
 *       "sold_out": false,
 *       "assistants_overflow": 0,
 *       "confirmed_overflow": 0,
 *       "sold_out_overflow": 1,
 *       "allow_overflow": false
 *     }
 */

routes.get("/web/events/:id/check_capacity", isAPIKeyUser, eventController.checkCapacity);

/**
 * @api {get} /api/v4/web/events/:eventId/reservations/:encodedCode Verificar Código de Invitación
 * @apiName CheckInvitationCode
 * @apiGroup Eventos
 * @apiVersion 4.0.0
 * @apiDescription Este endpoint verifica si un código de invitación es aplicable a un evento concreto. El código de invitación está codificado en Base64.
 *
 * @apiParam {String} eventId Identificador único del evento.
 * @apiParam {String} encodedCode Código de invitación codificado en Base64. Ejemplo, el código "MD22-4939" se codifica como "TUQyMi00OTM5"
 *
 * @apiSuccess {Boolean} applicable Indica si el código de invitación es aplicable (true) o no (false).
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta Exitosa:
 *     HTTP/1.1 200 OK
 *     true
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta Fallida:
 *     HTTP/1.1 200 OK
 *     false
 */

routes.get(
  "/web/events/:id/reservations/:encodedInvitationCode",
  isAPIKeyUser,
  eventReservationController.checkReservationCode
);

/**
 * @api {post} /api/v4/web/events/:eventId/inscriptions/ Dar de Alta una Inscripción
 * @apiName CreateEventInscription
 * @apiGroup Inscriptions
 * @apiVersion 1.0.0
 * @apiDescription Este endpoint permite registrar una inscripción a un evento específico.
 *
 * @apiParam {String} eventId Identificador único del evento.
 *
 * @apiBody {String} code Código opcional para la inscripción.
 * @apiBody {String} email Email del participante, debe ser válido.
 * @apiBody {String} name Nombre del participante.
 * @apiBody {String} [surname] Apellido del participante (opcional).
 *
 *
 * @apiSuccess {String} stateText Estado de la inscripción.
 * @apiSuccess {String} id Identificador único de la inscripción.
 * @apiSuccess {String} eventId Identificador único del evento.
 * @apiSuccess {Date} date Fecha de la inscripción.
 * @apiSuccess {String} userId Identificador único del usuario.
 * @apiSuccess {String} type Tipo de asistencia.
 * @apiSuccess {String} code_ticket Código del ticket generado.
 * @apiSuccess {String} source Fuente de la inscripción (ej. "app").
 * @apiSuccess {Boolean} validated Estado de validación de la inscripción.
 * @apiSuccess {String} [reservationId] Identificador de la reserva si existe.
 * @apiSuccess {String} [overflowEventId] Identificador del evento de desborde si existe.
 * @apiSuccess {Date} updatedAt Fecha de la última actualización.
 * @apiSuccess {Date} createdAt Fecha de creación.
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta 1:
 *     {
 *       "stateText": "Inscripción confirmada",
 *       "id": "156e4aa1-cada-4e42-bdca-b458b798991c",
 *       "eventId": "3028d48b-1f38-11ef-9b46-000c29a89113",
 *       "date": "2024-07-02T09:30:07.973Z",
 *       "userId": "6747d9eb-c64f-43a3-a4ac-6803b89966cb",
 *       "type": "onsite",
 *       "code_ticket": "ENT-77760177",
 *       "source": "app",
 *       "validated": true,
 *       "reservationId": null,
 *       "overflowEventId": null,
 *       "updatedAt": "2024-07-02T09:30:07.974Z",
 *       "createdAt": "2024-07-02T09:30:07.974Z"
 *     }
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta 2:
 *     {
 *       "reservation": {
 *         "assistanceType": "onsite",
 *         "assistanceTypeText": "asistencia presencial",
 *         "stateText": "Inscripciones abiertas a la reserva",
 *         "id": "b996c360-616d-46d4-856f-4dc0449b74f8",
 *         "init_available_date": "2024-06-03T15:00:00.000Z",
 *         "end_available_date": "2024-10-08T20:00:00.000Z",
 *         "gmt": -5,
 *         "state": "publish",
 *         "assistants": 10,
 *         "confirmed": 1,
 *         "sold_out": false,
 *         "allow_multiple": false,
 *         "multiple_limit": 0,
 *         "description": "Reserva",
 *         "reservation_code": "TOL24-CIE339",
 *         "color": "orange",
 *         "allow_overflow": false,
 *         "overflow_reservationId": null,
 *         "marketing_list": null,
 *         "virtual": false,
 *         "createdAt": "2024-07-02T09:39:38.000Z",
 *         "updatedAt": "2024-07-02T09:40:07.000Z",
 *         "userId": "d3eba5de-76cd-44a0-9ebd-92cad7160e71",
 *         "entityId": "9c910423-596b-11ea-bdd2-000c29a89113",
 *         "eventId": "3028d48b-1f38-11ef-9b46-000c29a89113",
 *         "Event": {
 *           "stateCode": "registrations_open",
 *           "stateText": "Inscripciones abiertas",
 *           "assistanceType": "onsite",
 *           "assistanceTypeText": "evento presencial",
 *           "id": "3028d48b-1f38-11ef-9b46-000c29a89113",
 *           "name": "Toluca 2024 - Teen - 6ª Edición",
 *           "description": null,
 *           "campaign_text": null,
 *           "init_date": "2024-10-09T15:00:00.000Z",
 *           "end_date": "2024-10-09T19:00:00.000Z",
 *           "init_available_date": "2024-06-03T15:00:00.000Z",
 *           "end_available_date": "2024-10-08T20:00:00.000Z",
 *           "gmt": -5,
 *           "assistants": 620,
 *           "confirmed": 1,
 *           "sold_out": false,
 *           "allow_multiple": false,
 *           "multiple_limit": null,
 *           "allow_overflow": true,
 *           "overflow_eventId": "36a1aed0-1f39-11ef-9b46-000c29a89113",
 *           "state": "publish",
 *           "typeId": "0",
 *           "venueId": "2481e357-1dfb-4ab7-ba2b-5094620e0281",
 *           "locationId": "df971e1c-c8de-11e9-b18d-000c295f0f58",
 *           "url_streaming": null,
 *           "url_poll": null,
 *           "url_registration": null,
 *           "marketing_list": null,
 *           "userId": "0939bb2a-d33d-4290-ac81-fc9faa1c015e",
 *           "featured": false,
 *           "virtual": false,
 *           "allow_questions": true,
 *           "createdAt": "2024-05-31T12:26:05.000Z",
 *           "updatedAt": "2024-07-02T09:40:07.000Z",
 *           "type": {
 *             "name": "conference",
 *             "title": "Congreso LQDVI"
 *           },
 *           "location": {
 *             "country": "México",
 *             "city": "Toluca",
 *             "country_code": "MX"
 *           }
 *         },
 *         "Entity": {
 *           "id": "9c910423-596b-11ea-bdd2-000c29a89113",
 *           "name": "CIEMA A Coruña",
 *           "state": "publish",
 *           "contact_person": null,
 *           "contact_email": null,
 *           "level": null,
 *           "country": "ES",
 *           "createdAt": "2020-02-27T15:15:31.000Z",
 *           "updatedAt": "2020-02-27T15:15:31.000Z"
 *         }
 *       },
 *       "stateText": "Inscripción confirmada",
 *       "id": "2168615f-69b3-4045-a173-5b70f5ebfd1d",
 *       "eventId": "3028d48b-1f38-11ef-9b46-000c29a89113",
 *       "date": "2024-07-02T09:42:34.846Z",
 *       "userId": "6747d9eb-c64f-43a3-a4ac-6803b89966cb",
 *       "type": "onsite group",
 *       "code_ticket": "ENT-31846388",
 *       "source": "app",
 *       "validated": true,
 *       "reservationId": "b996c360-616d-46d4-856f-4dc0449b74f8",
 *       "overflowEventId": null,
 *       "updatedAt": "2024-07-02T09:42:34.847Z",
 *       "createdAt": "2024-07-02T09:42:34.847Z"
 *     }
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta 3:
 *     {
 *       "stateText": "Inscripción confirmada a lista de espera",
 *       "id": "9c6548df-37d8-46c1-8505-3de9e620fab1",
 *       "eventId": "3028d48b-1f38-11ef-9b46-000c29a89113",
 *       "date": "2024-07-02T09:32:45.727Z",
 *       "userId": "6747d9eb-c64f-43a3-a4ac-6803b89966cb",
 *       "type": "onsite",
 *       "code_ticket": "ENT-26677167",
 *       "source": "app",
 *       "validated": false,
 *       "reservationId": null,
 *       "overflowEventId": "36a1aed0-1f39-11ef-9b46-000c29a89113",
 *       "updatedAt": "2024-07-02T09:32:45.728Z",
 *       "createdAt": "2024-07-02T09:32:45.728Z"
 *     }
 */

routes.post(
  "/web/events/:id/inscriptions",
  isAPIKeyUser,

  SchemaValidator(eventValidation.InscriptionInputType, true),
  //Prepara los datos de la inscripción tipo ....
  eventInscriptionController.prepareDataInscription,
  //Recupera la reservation si viene
  eventReservationController.recuperateReservationByCode,
  //Recupera a registra el usuario que se va a inscribir
  authController.getOrCreateUser,
  //Comprobamos si tiene ya una incripción, en tal caso, comprobamos el código de reserva sea el de la inscripcion hecha,
  //si no es así es el caso de un usuario que se reinscribe con otro código de reserva
  eventInscriptionController.checkInscriptionByUser,
  //Si es un usuario tutor y solicita un group_size se crea la reserva
  eventReservationController.createReservationToEntity,
  eventReservationController.activeReservationToEntity,

  (req, res, next) => {
    if (res.locals.dataInscription.reservation) {
      console.log(">>>>>>>Incripcion con reserva");
      eventReservationController.createInscriptionReservation(req, res, next);
    } else {
      console.log(">>>>>>>Incripcion sin reserva");
      eventInscriptionController.createInscription(req, res, next);
    }
    //next();
  }
  //  eventInscriptionController.createInscriptionMarketingList
);

/**
 * @api {get} /api/v4/web/entities/colleges Lista de Entidades Educativas
 * @apiName GetColleges
 * @apiGroup Entidades
 * @apiVersion 1.0.0
 * @apiDescription Este endpoint devuelve una lista de entidades educativas, incluyendo su nombre, nivel y país.
 *
 * @apiSuccess {Object[]} colleges Lista de entidades educativas.
 * @apiSuccess {String} colleges.id Identificador único de la entidad educativa.
 * @apiSuccess {String} colleges.name Nombre de la entidad educativa.
 * @apiSuccess {String} [colleges.level] Nivel educativo (si aplica).
 * @apiSuccess {String} colleges.country Código de país de la entidad educativa.
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta:
 * [
 *   {
 *     "id": "757de756-af85-11e9-aa90-000c295f0f58",
 *     "name": "Academia  Santa Teresa Málaga",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "7583028a-af85-11e9-aa90-000c295f0f58",
 *     "name": "Academia Díaz Balaguer",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "54a4fa2d-48b4-11ee-9b36-000c29a89113",
 *     "name": "AECC reservas",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "758137a3-af85-11e9-aa90-000c295f0f58",
 *     "name": "Aeroclub de Colombia",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "75835f07-af85-11e9-aa90-000c295f0f58",
 *     "name": "AFA Formación Oviedo",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "758196a7-af85-11e9-aa90-000c295f0f58",
 *     "name": "Agora Portals International School - Islas Baleares",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "75843763-af85-11e9-aa90-000c295f0f58",
 *     "name": "AIS Mallorca",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "758314a0-af85-11e9-aa90-000c295f0f58",
 *     "name": "Alcalá de Henares",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "75810f5a-af85-11e9-aa90-000c295f0f58",
 *     "name": "Alcaste - Las Fuentes",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "6a574ca3-9ece-11ec-9700-000c29a89113",
 *     "name": "Alfaem Salud Mental - León",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "75810989-af85-11e9-aa90-000c295f0f58",
 *     "name": "Alfonso Escamez",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "a015dcef-8213-11ee-9b36-000c29a89113",
 *     "name": "Alianza para la FP Dual - Barcelona",
 *     "level": null,
 *     "country": "ES"
 *   },
 *   {
 *     "id": "7583dd6d-af85-11e9-aa90-000c295f0f58",
 *     "name": "AMA-CLUB DE AMIGOS ALCORCÓN",
 *     "level": null,
 *     "country": "ES"
 *   }
 * ]
 */

routes.get(
  "/web/entities/colleges",
  isAPIKeyUser,
  cacheSuccesses("24 hours"),
  FieldMiddleware.middleware({
    invalidFields: generalInvalidFields,
  }),
  SortMiddleware.middleware({ default: "name" }),
  entityController.find({
    scopes: ["defaultScope", "onlyColleges"],
  })
);

/**
 * @api {get} /api/v4/web/entities/partners Lista de Partners
 * @apiName GetPartners
 * @apiGroup Partners
 * @apiVersion 4.0.0
 * @apiDescription Este endpoint devuelve una lista de partners disponibles, incluyendo su nombre, nivel y país.
 *
 * @apiSuccess {Object[]} partners Lista de partners disponibles.
 * @apiSuccess {String} partners.id Identificador único del partner.
 * @apiSuccess {String} partners.name Nombre del partner.
 * @apiSuccess {String} [partners.level] Nivel del partner (puede ser nulo).
 * @apiSuccess {String} partners.country Código del país del partner.
 *
 * @apiSuccessExample {json} Ejemplo de Respuesta:
 * [
 *   {
        "id": "7dfc4513-ce5b-11e9-8055-000c29a89113",
        "name": "ABC",
        "level": null,
        "country": "ES"
    },
    {
        "id": "3c7950ac-48b4-11ee-9b36-000c29a89113",
        "name": "AECC",
        "level": null,
        "country": "ES"
    },
    {
        "id": "2b43d32b-d4d1-11e9-8055-000c29a89113",
        "name": "AGR FOOD MARKETING",
        "level": null,
        "country": "ES"
    },
    {
        "id": "aa0cf064-ce5b-11e9-8055-000c29a89113",
        "name": "ANTONIO PAMPLIEGA",
        "level": null,
        "country": "ES"
    },
    {
        "id": "6c2df6c3-af83-11e9-aa90-000c295f0f58",
        "name": "ANTONIO PINTOR",
        "level": null,
        "country": "ES"
    },
    {
        "id": "5e5472b3-6e60-11ee-9b36-000c29a89113",
        "name": "Atrápalo",
        "level": null,
        "country": "ES"
    },
    {
        "id": "df469bb0-fa63-11e9-8055-000c29a89113",
        "name": "AYTO. BILBAO",
        "level": null,
        "country": "ES"
    },
    {
        "id": "b37764ca-98bc-11ec-9700-000c29a89113",
        "name": "AYTO. LA CORUÑA",
        "level": null,
        "country": "ES"
    },
    {
        "id": "757f1b60-af85-11e9-aa90-000c295f0f58",
        "name": "AYTO. MADRID",
        "level": null,
        "country": "ES"
    },
    {
        "id": "9a2f1e6f-d954-11e9-8055-000c29a89113",
        "name": "AYTO. MÁLAGA",
        "level": null,
        "country": "ES"
    },
    {
        "id": "bddfa9e9-ef85-11e9-8055-000c29a89113",
        "name": "AYTO. OVIEDO",
        "level": null,
        "country": "ES"
    },
    {
        "id": "29762a98-ce5b-11e9-8055-000c29a89113",
        "name": "AYTO. SEVILLA",
        "level": null,
        "country": "ES"
    },
    {
        "id": "414c97c6-5274-11ea-bdd2-000c29a89113",
        "name": "BARCELÓ GRANADA",
        "level": null,
        "country": "ES"
    },
    {
        "id": "03caafb0-5270-11ea-bdd2-000c29a89113",
        "name": "BIDAFARMA",
        "level": null,
        "country": "ES"
    },
    {
        "id": "db2e5387-2111-11ec-9c03-000c29a89113",
        "name": "BYG",
        "level": null,
        "country": "ES"
    },
    {
        "id": "2f2c58ac-e11d-11e9-8055-000c29a89113",
        "name": "CABALLITO DE MAR",
        "level": null,
        "country": "ES"
    },
    {
        "id": "59e03089-a379-11ec-9b36-000c29a89113",
        "name": "Cabildo Insular de La Gomera - Area Educación",
        "level": null,
        "country": "ES"
    },
    {
        "id": "6c2df93f-af83-11e9-aa90-000c295f0f58",
        "name": "CAIXABANK",
        "level": null,
        "country": "ES"
    },
 *   ...
 * ]
 */

routes.get(
  "/web/entities/partners",
  isAPIKeyUser,
  cacheSuccesses("24 hours"),
  FieldMiddleware.middleware({
    invalidFields: generalInvalidFields,
  }),
  SortMiddleware.middleware({ default: "name" }),
  entityController.find({
    scopes: ["defaultScope", "onlyPartners"],
  })
);

module.exports = routes;
