/**
 * API Constants - SSOT (Single Source of Truth)
 *
 * Todas las rutas de API, versiones y endpoints.
 * NO hardcodear rutas en controllers o frontend.
 *
 * @module @shared/constants/api
 */

/**
 * API Version
 */
export const API_VERSION = 'v1';
export const API_PREFIX = `/api/${API_VERSION}`;

/**
 * API Routes organized by Module
 */
export const API_ROUTES = {
  // Base
  ROOT: '/',
  HEALTH: '/health',
  DOCS: `${API_PREFIX}/docs`,

  // Auth Module
  AUTH: {
    BASE: `${API_PREFIX}/auth`,
    LOGIN: `${API_PREFIX}/auth/login`,
    LOGOUT: `${API_PREFIX}/auth/logout`,
    REFRESH: `${API_PREFIX}/auth/refresh`,
    REGISTER: `${API_PREFIX}/auth/register`,
    FORGOT_PASSWORD: `${API_PREFIX}/auth/forgot-password`,
    RESET_PASSWORD: `${API_PREFIX}/auth/reset-password`,
    ME: `${API_PREFIX}/auth/me`,
    CHANGE_PASSWORD: `${API_PREFIX}/auth/change-password`,
  },

  // Users Module
  USERS: {
    BASE: `${API_PREFIX}/users`,
    BY_ID: (id: string) => `${API_PREFIX}/users/${id}`,
    ROLES: (id: string) => `${API_PREFIX}/users/${id}/roles`,
  },

  // Tenants Module
  TENANTS: {
    BASE: `${API_PREFIX}/tenants`,
    BY_ID: (id: string) => `${API_PREFIX}/tenants/${id}`,
    CURRENT: `${API_PREFIX}/tenants/current`,
  },

  // Construction Module
  PROYECTOS: {
    BASE: `${API_PREFIX}/proyectos`,
    BY_ID: (id: string) => `${API_PREFIX}/proyectos/${id}`,
    FRACCIONAMIENTOS: (id: string) => `${API_PREFIX}/proyectos/${id}/fraccionamientos`,
    DASHBOARD: (id: string) => `${API_PREFIX}/proyectos/${id}/dashboard`,
    PROGRESS: (id: string) => `${API_PREFIX}/proyectos/${id}/progress`,
  },

  FRACCIONAMIENTOS: {
    BASE: `${API_PREFIX}/fraccionamientos`,
    BY_ID: (id: string) => `${API_PREFIX}/fraccionamientos/${id}`,
    ETAPAS: (id: string) => `${API_PREFIX}/fraccionamientos/${id}/etapas`,
    MANZANAS: (id: string) => `${API_PREFIX}/fraccionamientos/${id}/manzanas`,
    LOTES: (id: string) => `${API_PREFIX}/fraccionamientos/${id}/lotes`,
  },

  PRESUPUESTOS: {
    BASE: `${API_PREFIX}/presupuestos`,
    BY_ID: (id: string) => `${API_PREFIX}/presupuestos/${id}`,
    PARTIDAS: (id: string) => `${API_PREFIX}/presupuestos/${id}/partidas`,
    COMPARE: (id: string) => `${API_PREFIX}/presupuestos/${id}/compare`,
    VERSIONS: (id: string) => `${API_PREFIX}/presupuestos/${id}/versions`,
  },

  AVANCES: {
    BASE: `${API_PREFIX}/avances`,
    BY_ID: (id: string) => `${API_PREFIX}/avances/${id}`,
    BY_PROYECTO: (proyectoId: string) => `${API_PREFIX}/proyectos/${proyectoId}/avances`,
    CURVA_S: (proyectoId: string) => `${API_PREFIX}/proyectos/${proyectoId}/curva-s`,
    FOTOS: (id: string) => `${API_PREFIX}/avances/${id}/fotos`,
  },

  // HR Module
  EMPLOYEES: {
    BASE: `${API_PREFIX}/employees`,
    BY_ID: (id: string) => `${API_PREFIX}/employees/${id}`,
    ASISTENCIAS: (id: string) => `${API_PREFIX}/employees/${id}/asistencias`,
    CAPACITACIONES: (id: string) => `${API_PREFIX}/employees/${id}/capacitaciones`,
  },

  ASISTENCIAS: {
    BASE: `${API_PREFIX}/asistencias`,
    BY_ID: (id: string) => `${API_PREFIX}/asistencias/${id}`,
    CHECK_IN: `${API_PREFIX}/asistencias/check-in`,
    CHECK_OUT: `${API_PREFIX}/asistencias/check-out`,
    BY_PROYECTO: (proyectoId: string) => `${API_PREFIX}/proyectos/${proyectoId}/asistencias`,
  },

  CUADRILLAS: {
    BASE: `${API_PREFIX}/cuadrillas`,
    BY_ID: (id: string) => `${API_PREFIX}/cuadrillas/${id}`,
    MIEMBROS: (id: string) => `${API_PREFIX}/cuadrillas/${id}/miembros`,
  },

  // HSE Module
  INCIDENTES: {
    BASE: `${API_PREFIX}/incidentes`,
    BY_ID: (id: string) => `${API_PREFIX}/incidentes/${id}`,
    INVOLUCRADOS: (id: string) => `${API_PREFIX}/incidentes/${id}/involucrados`,
    ACCIONES: (id: string) => `${API_PREFIX}/incidentes/${id}/acciones`,
    BY_PROYECTO: (proyectoId: string) => `${API_PREFIX}/proyectos/${proyectoId}/incidentes`,
  },

  CAPACITACIONES: {
    BASE: `${API_PREFIX}/capacitaciones`,
    BY_ID: (id: string) => `${API_PREFIX}/capacitaciones/${id}`,
    PARTICIPANTES: (id: string) => `${API_PREFIX}/capacitaciones/${id}/participantes`,
    CERTIFICADOS: (id: string) => `${API_PREFIX}/capacitaciones/${id}/certificados`,
  },

  INSPECCIONES: {
    BASE: `${API_PREFIX}/inspecciones`,
    BY_ID: (id: string) => `${API_PREFIX}/inspecciones/${id}`,
    HALLAZGOS: (id: string) => `${API_PREFIX}/inspecciones/${id}/hallazgos`,
  },

  EPP: {
    BASE: `${API_PREFIX}/epp`,
    BY_ID: (id: string) => `${API_PREFIX}/epp/${id}`,
    ASIGNACIONES: `${API_PREFIX}/epp/asignaciones`,
    ENTREGAS: `${API_PREFIX}/epp/entregas`,
    STOCK: `${API_PREFIX}/epp/stock`,
  },

  // Estimates Module
  ESTIMACIONES: {
    BASE: `${API_PREFIX}/estimaciones`,
    BY_ID: (id: string) => `${API_PREFIX}/estimaciones/${id}`,
    CONCEPTOS: (id: string) => `${API_PREFIX}/estimaciones/${id}/conceptos`,
    GENERADORES: (id: string) => `${API_PREFIX}/estimaciones/${id}/generadores`,
    WORKFLOW: (id: string) => `${API_PREFIX}/estimaciones/${id}/workflow`,
    SUBMIT: (id: string) => `${API_PREFIX}/estimaciones/${id}/submit`,
    APPROVE: (id: string) => `${API_PREFIX}/estimaciones/${id}/approve`,
    REJECT: (id: string) => `${API_PREFIX}/estimaciones/${id}/reject`,
  },

  // INFONAVIT Module
  INFONAVIT: {
    BASE: `${API_PREFIX}/infonavit`,
    REGISTRO: `${API_PREFIX}/infonavit/registro`,
    OFERTA: `${API_PREFIX}/infonavit/oferta`,
    DERECHOHABIENTES: `${API_PREFIX}/infonavit/derechohabientes`,
    ASIGNACIONES: `${API_PREFIX}/infonavit/asignaciones`,
    ACTAS: `${API_PREFIX}/infonavit/actas`,
    REPORTES: `${API_PREFIX}/infonavit/reportes`,
  },

  // Inventory Module
  ALMACENES: {
    BASE: `${API_PREFIX}/almacenes`,
    BY_ID: (id: string) => `${API_PREFIX}/almacenes/${id}`,
    BY_PROYECTO: (proyectoId: string) => `${API_PREFIX}/proyectos/${proyectoId}/almacenes`,
    STOCK: (id: string) => `${API_PREFIX}/almacenes/${id}/stock`,
  },

  REQUISICIONES: {
    BASE: `${API_PREFIX}/requisiciones`,
    BY_ID: (id: string) => `${API_PREFIX}/requisiciones/${id}`,
    LINEAS: (id: string) => `${API_PREFIX}/requisiciones/${id}/lineas`,
    SUBMIT: (id: string) => `${API_PREFIX}/requisiciones/${id}/submit`,
    APPROVE: (id: string) => `${API_PREFIX}/requisiciones/${id}/approve`,
  },

  // Purchase Module
  COMPRAS: {
    BASE: `${API_PREFIX}/compras`,
    BY_ID: (id: string) => `${API_PREFIX}/compras/${id}`,
    LINEAS: (id: string) => `${API_PREFIX}/compras/${id}/lineas`,
    COMPARATIVO: `${API_PREFIX}/compras/comparativo`,
    RECEPCIONES: (id: string) => `${API_PREFIX}/compras/${id}/recepciones`,
  },

  PROVEEDORES: {
    BASE: `${API_PREFIX}/proveedores`,
    BY_ID: (id: string) => `${API_PREFIX}/proveedores/${id}`,
    COTIZACIONES: (id: string) => `${API_PREFIX}/proveedores/${id}/cotizaciones`,
  },

  // Contracts Module
  CONTRATOS: {
    BASE: `${API_PREFIX}/contratos`,
    BY_ID: (id: string) => `${API_PREFIX}/contratos/${id}`,
    PARTIDAS: (id: string) => `${API_PREFIX}/contratos/${id}/partidas`,
    ESTIMACIONES: (id: string) => `${API_PREFIX}/contratos/${id}/estimaciones`,
  },

  // Reports Module
  REPORTS: {
    BASE: `${API_PREFIX}/reports`,
    DASHBOARD: `${API_PREFIX}/reports/dashboard`,
    AVANCE_FISICO: `${API_PREFIX}/reports/avance-fisico`,
    AVANCE_FINANCIERO: `${API_PREFIX}/reports/avance-financiero`,
    CURVA_S: `${API_PREFIX}/reports/curva-s`,
    PRESUPUESTO_VS_REAL: `${API_PREFIX}/reports/presupuesto-vs-real`,
    KPI_HSE: `${API_PREFIX}/reports/kpi-hse`,
    EXPORT: `${API_PREFIX}/reports/export`,
  },
} as const;

/**
 * HTTP Methods
 */
export const HTTP_METHODS = {
  GET: 'GET',
  POST: 'POST',
  PUT: 'PUT',
  PATCH: 'PATCH',
  DELETE: 'DELETE',
} as const;

/**
 * HTTP Status Codes
 */
export const HTTP_STATUS = {
  OK: 200,
  CREATED: 201,
  NO_CONTENT: 204,
  BAD_REQUEST: 400,
  UNAUTHORIZED: 401,
  FORBIDDEN: 403,
  NOT_FOUND: 404,
  CONFLICT: 409,
  UNPROCESSABLE_ENTITY: 422,
  INTERNAL_SERVER_ERROR: 500,
  SERVICE_UNAVAILABLE: 503,
} as const;

/**
 * Content Types
 */
export const CONTENT_TYPES = {
  JSON: 'application/json',
  FORM_URLENCODED: 'application/x-www-form-urlencoded',
  MULTIPART: 'multipart/form-data',
  PDF: 'application/pdf',
  EXCEL: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
} as const;
