/**
 * Swagger/OpenAPI Configuration for OrbiQuant IA Trading Platform
 */

import swaggerJSDoc from 'swagger-jsdoc';
import { Express } from 'express';
import swaggerUi from 'swagger-ui-express';
import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// Swagger definition
const swaggerDefinition = {
  openapi: '3.0.0',
  info: {
    title: 'OrbiQuant IA - Trading Platform API',
    version: '1.0.0',
    description: `
      API para la plataforma OrbiQuant IA - Trading y análisis cuantitativo con ML e IA.

      ## Características principales
      - Autenticación OAuth2 y JWT con 2FA
      - Trading automatizado y análisis cuantitativo
      - Integración con agentes ML/LLM (Python microservices)
      - WebSocket para datos de mercado en tiempo real
      - Sistema de pagos y suscripciones (Stripe)
      - Gestión de portfolios y estrategias de inversión

      ## Autenticación
      La mayoría de los endpoints requieren autenticación mediante Bearer Token (JWT).
      Algunos endpoints administrativos requieren API Key.
    `,
    contact: {
      name: 'OrbiQuant Support',
      email: 'support@orbiquant.com',
      url: 'https://orbiquant.com',
    },
    license: {
      name: 'Proprietary',
    },
  },
  servers: [
    {
      url: 'http://localhost:3000/api/v1',
      description: 'Desarrollo local',
    },
    {
      url: 'https://api.orbiquant.com/api/v1',
      description: 'Producción',
    },
  ],
  tags: [
    { name: 'Auth', description: 'Autenticación y autorización (JWT, OAuth2, 2FA)' },
    { name: 'Users', description: 'Gestión de usuarios y perfiles' },
    { name: 'Education', description: 'Contenido educativo y cursos de trading' },
    { name: 'Trading', description: 'Operaciones de trading y gestión de órdenes' },
    { name: 'Investment', description: 'Gestión de inversiones y análisis de riesgo' },
    { name: 'Payments', description: 'Pagos, suscripciones y facturación (Stripe)' },
    { name: 'Portfolio', description: 'Gestión de portfolios y activos' },
    { name: 'ML', description: 'Machine Learning Engine - Predicciones y análisis' },
    { name: 'LLM', description: 'Large Language Model Agent - Asistente IA' },
    { name: 'Agents', description: 'Trading Agents automatizados' },
    { name: 'Admin', description: 'Administración del sistema' },
    { name: 'Health', description: 'Health checks y monitoreo' },
    { name: 'WebSocket', description: 'WebSocket endpoints y estadísticas' },
  ],
  components: {
    securitySchemes: {
      BearerAuth: {
        type: 'http',
        scheme: 'bearer',
        bearerFormat: 'JWT',
        description: 'Token JWT obtenido del endpoint de login',
      },
      ApiKeyAuth: {
        type: 'apiKey',
        in: 'header',
        name: 'X-API-Key',
        description: 'API Key para autenticación de servicios externos',
      },
    },
    schemas: {
      Error: {
        type: 'object',
        properties: {
          success: {
            type: 'boolean',
            example: false,
          },
          error: {
            type: 'string',
            example: 'Error message',
          },
          statusCode: {
            type: 'number',
            example: 400,
          },
        },
      },
      SuccessResponse: {
        type: 'object',
        properties: {
          success: {
            type: 'boolean',
            example: true,
          },
          data: {
            type: 'object',
          },
          message: {
            type: 'string',
          },
        },
      },
    },
  },
  security: [
    {
      BearerAuth: [],
    },
  ],
};

// Options for swagger-jsdoc
const options: swaggerJSDoc.Options = {
  definition: swaggerDefinition,
  // Path to the API routes for JSDoc comments
  apis: [
    path.join(__dirname, '../modules/**/*.routes.ts'),
    path.join(__dirname, '../modules/**/*.routes.js'),
    path.join(__dirname, '../docs/openapi.yaml'),
  ],
};

// Initialize swagger-jsdoc
const swaggerSpec = swaggerJSDoc(options);

/**
 * Setup Swagger documentation for Express app
 */
export function setupSwagger(app: Express, prefix: string = '/api/v1') {
  // Swagger UI options
  const swaggerUiOptions = {
    customCss: `
      .swagger-ui .topbar { display: none }
      .swagger-ui .info { margin: 50px 0; }
      .swagger-ui .info .title { font-size: 36px; }
    `,
    customSiteTitle: 'OrbiQuant IA - API Documentation',
    swaggerOptions: {
      persistAuthorization: true,
      displayRequestDuration: true,
      filter: true,
      tagsSorter: 'alpha',
      operationsSorter: 'alpha',
    },
  };

  // Serve Swagger UI
  app.use(`${prefix}/docs`, swaggerUi.serve);
  app.get(`${prefix}/docs`, swaggerUi.setup(swaggerSpec, swaggerUiOptions));

  // Serve OpenAPI spec as JSON
  app.get(`${prefix}/docs.json`, (req, res) => {
    res.setHeader('Content-Type', 'application/json');
    res.send(swaggerSpec);
  });

  console.log(`📚 Swagger docs available at: http://localhost:${process.env.PORT || 3000}${prefix}/docs`);
  console.log(`📄 OpenAPI spec JSON at: http://localhost:${process.env.PORT || 3000}${prefix}/docs.json`);
}

export { swaggerSpec };
