/**
 * Base Interfaces
 * Interfaces compartidas para todo el proyecto
 */

import { Request } from 'express';

/**
 * Entidad base con campos de auditoria
 */
export interface BaseEntity {
  id: string;
  createdAt: Date;
  updatedAt: Date;
  createdBy?: string;
}

/**
 * Entidad con tenant
 */
export interface TenantEntity extends BaseEntity {
  tenantId: string;
}

/**
 * Request con contexto de tenant y usuario
 */
export interface AuthenticatedRequest extends Request {
  user?: {
    sub: string;
    id: string;
    email: string;
    tenantId: string;
    roles: string[];
    type: 'access' | 'refresh';
  };
  tenantId?: string;
}

/**
 * Respuesta paginada
 */
export interface PaginatedResponse<T> {
  data: T[];
  meta: {
    total: number;
    page: number;
    limit: number;
    totalPages: number;
    hasNext: boolean;
    hasPrev: boolean;
  };
}

/**
 * Query params para paginacion
 */
export interface PaginationQuery {
  page?: number;
  limit?: number;
  sortBy?: string;
  sortOrder?: 'ASC' | 'DESC';
  search?: string;
}

/**
 * Respuesta API estandar
 */
export interface ApiResponse<T = unknown> {
  success: boolean;
  data?: T;
  message?: string;
  errors?: Array<{
    field?: string;
    message: string;
    code?: string;
  }>;
  meta?: Record<string, unknown>;
}
