import 'dotenv/config';
import * as joi from 'joi';

interface EnvVars {
  DATABASE_URL: string;
  PORT: number;
  APP_PUBLIC_TOKEN: string;
  REDIS_HOST: string;
  REDIS_PORT: number;
  REDIS_PASSWORD?: string;
  MAIL_USER: string;
  MAIL_HOST: string;
  MAIL_PORT: number;
  MAIL_USER_FROM: string;
  MAIL_PASS: string;
  MAIL_SECURE: boolean;
  APP_NAME: string;
  JWT_SECRET: string;
  JWT_EXPIRES_IN: string;
  TWILIO_ACCOUNT_SID: string;
  TWILIO_AUTH_TOKEN: string;
  TWILIO_PHONE_NUMBER: string;
  DO_SPACES_BUCKET: string;
  DO_SPACES_ENDPOINT: string;
  DO_SPACES_KEY: string;
  DO_SPACES_SECRET: string;
  DO_SPACES_REGION: string;
  DO_SPACES_PUBLIC_URL: string;
  MIDDLEWARE_SIFEN_URL: string;
  API_URL_PANEL: string;
  APP_KEY_PASS: string;
  PATH_CERT?: string;
  HOLDING_EMPRESA_ID?: string;
  API_GENERADOR_PDF: string;
  URL_PANEL_FRONTEND: string;
  QZ_PRIVATE_KEY_PATH: string;
  QZ_CERTIFICATE_PATH: string;
  AI_ENCRYPTION_KEY: string;
  AI_READONLY_DATABASE_URL?: string;
  SERPER_API_KEY?: string;
  BANCARD_ENCRYPTION_KEY?: string;
  MARANGATU_ENCRYPTION_KEY?: string;
  NOVASIS_PAY_ENCRYPTION_KEY?: string;
  BANCARD_VPOS_BASE_URL_STAGING?: string;
  BANCARD_VPOS_BASE_URL_PROD?: string;
  BANCARD_PUBLIC_RETURN_URL_BASE?: string;
  BANCARD_PUBLIC_CANCEL_URL_BASE?: string;
  PAGO_LINK_BASE_URL?: string;
  BOT_MARANGATU_BASE_URL?: string;
  LEGAJO_PRESIGNED_URL_EXPIRY_SEC?: number;
  POS_VENTAS_FRONTEND_PATH?: string;
  BACKEND_DOCS_PATH?: string;
  BULL_BOARD_USER?: string;
  BULL_BOARD_PASSWORD?: string;
  BANCARD_MOCK_ENABLED?: boolean;
  STOREFRONT_REVALIDATE_URL?: string;
  REVALIDATE_SECRET?: string;
  // URL pública COMPLETA del receptor de webhooks de este backend del ERP, tal cual
  // el gateway debe postear (ej. https://app-api.novasispy.com/api/v1/novasis-pay/webhooks).
  NOVASIS_PAY_WEBHOOK_URL?: string;
  // Servicio interno de consulta de RUC/cédula (base local → SIFEN → PLRA).
  CONSULTA_RUC_URL?: string;
}

const envSchema = joi
  .object<EnvVars>({
    DATABASE_URL: joi.string().required(),
    PORT: joi.number().default(3000),
    APP_PUBLIC_TOKEN: joi.string().required(),
    REDIS_HOST: joi.string().default('localhost'),
    REDIS_PORT: joi.number().default(6379),
    REDIS_PASSWORD: joi.string().optional().allow(''),
    MAIL_USER: joi.string().required(),
    MAIL_HOST: joi.string().required(),
    MAIL_PORT: joi.number().required(),
    MAIL_USER_FROM: joi.string().required(),
    MAIL_PASS: joi.string().required(),
    MAIL_SECURE: joi.boolean().required(),
    APP_NAME: joi.string().required(),
    JWT_SECRET: joi.string().required(),
    JWT_EXPIRES_IN: joi.string().required(),
    TWILIO_ACCOUNT_SID: joi.string().required(),
    TWILIO_AUTH_TOKEN: joi.string().required(),
    TWILIO_PHONE_NUMBER: joi.string().required(),
    DO_SPACES_BUCKET: joi.string().required(),
    DO_SPACES_ENDPOINT: joi.string().required(),
    DO_SPACES_KEY: joi.string().required(),
    DO_SPACES_SECRET: joi.string().required(),
    DO_SPACES_REGION: joi.string().required(),
    DO_SPACES_PUBLIC_URL: joi.string().optional(),
    MIDDLEWARE_SIFEN_URL: joi.string().required(),
    API_URL_PANEL: joi.string().required(),
    APP_KEY_PASS: joi.string().required(),
    PATH_CERT: joi.string().optional().allow(''),
    HOLDING_EMPRESA_ID: joi.string().uuid().optional().allow(''),
    API_GENERADOR_PDF: joi.string().required(),
    URL_PANEL_FRONTEND: joi.string().required(),
    QZ_PRIVATE_KEY_PATH: joi.string().optional(),
    QZ_CERTIFICATE_PATH: joi.string().optional(),
    AI_ENCRYPTION_KEY: joi.string().required(),
    AI_READONLY_DATABASE_URL: joi.string().optional(),
    SERPER_API_KEY: joi.string().optional().allow(''),
    BANCARD_ENCRYPTION_KEY: joi.string().optional().allow(''),
    MARANGATU_ENCRYPTION_KEY: joi.string().optional().allow(''),
    NOVASIS_PAY_ENCRYPTION_KEY: joi.string().optional().allow(''),
    BANCARD_VPOS_BASE_URL_STAGING: joi
      .string()
      .optional()
      .allow('')
      .default('https://vpos.infonet.com.py:8888/vpos/api/0.3'),
    BANCARD_VPOS_BASE_URL_PROD: joi.string().optional().allow('').default('https://vpos.infonet.com.py/vpos/api/0.3'),
    BANCARD_PUBLIC_RETURN_URL_BASE: joi.string().optional().allow(''),
    BANCARD_PUBLIC_CANCEL_URL_BASE: joi.string().optional().allow(''),
    PAGO_LINK_BASE_URL: joi.string().optional().allow('').default('https://app.novasis.com'),
    BOT_MARANGATU_BASE_URL: joi.string().required().allow('').default('http://143.198.100.72:8500'),
    LEGAJO_PRESIGNED_URL_EXPIRY_SEC: joi.number().integer().min(60).max(86400).default(900),
    POS_VENTAS_FRONTEND_PATH: joi.string().optional().allow(''),
    BACKEND_DOCS_PATH: joi.string().optional().allow(''),
    BULL_BOARD_USER: joi.string().optional().allow(''),
    BULL_BOARD_PASSWORD: joi.string().optional().allow(''),
    BANCARD_MOCK_ENABLED: joi.boolean().optional().default(false),
    STOREFRONT_REVALIDATE_URL: joi.string().optional().allow(''),
    REVALIDATE_SECRET: joi.string().optional().allow(''),
    NOVASIS_PAY_WEBHOOK_URL: joi.string().uri().optional().allow(''),
    CONSULTA_RUC_URL: joi.string().optional().allow('').default('http://localhost:3010'),
  })
  .unknown(true);

const result = envSchema.validate(process.env);
if (result.error) {
  throw new Error(`Config validation error: ${result.error.message}`);
}
const envVars: EnvVars = result.value;

export const envs = {
  port: envVars.PORT,
  databaseUrl: envVars.DATABASE_URL,
  appPublicToken: envVars.APP_PUBLIC_TOKEN,
  redisHost: envVars.REDIS_HOST,
  redisPort: envVars.REDIS_PORT,
  redisPassword: envVars.REDIS_PASSWORD,
  mailUser: envVars.MAIL_USER,
  mailHost: envVars.MAIL_HOST,
  mailPort: envVars.MAIL_PORT,
  mailUserFrom: envVars.MAIL_USER_FROM,
  mailPass: envVars.MAIL_PASS,
  mailSecure: envVars.MAIL_SECURE,
  appName: envVars.APP_NAME,
  jwtSecret: envVars.JWT_SECRET,
  jwtExpiresIn: envVars.JWT_EXPIRES_IN,
  twilioAccountSid: envVars.TWILIO_ACCOUNT_SID,
  twilioAuthToken: envVars.TWILIO_AUTH_TOKEN,
  twilioPhoneNumber: envVars.TWILIO_PHONE_NUMBER,
  doSpacesBucket: envVars.DO_SPACES_BUCKET,
  doSpacesEndpoint: envVars.DO_SPACES_ENDPOINT,
  doSpacesKey: envVars.DO_SPACES_KEY,
  doSpacesSecret: envVars.DO_SPACES_SECRET,
  doSpacesRegion: envVars.DO_SPACES_REGION,
  doSpacesPublicUrl: envVars.DO_SPACES_PUBLIC_URL,
  middlewareSifenUrl: envVars.MIDDLEWARE_SIFEN_URL,
  apiUrlPanel: envVars.API_URL_PANEL,
  appKeyPass: envVars.APP_KEY_PASS,
  pathCert: envVars.PATH_CERT,
  holdingEmpresaId: envVars.HOLDING_EMPRESA_ID,
  apiGeneradorPDF: envVars.API_GENERADOR_PDF,
  urlPanelFrontend: envVars.URL_PANEL_FRONTEND,
  qzPrivateKeyPath: envVars.QZ_PRIVATE_KEY_PATH,
  qzCertificatePath: envVars.QZ_CERTIFICATE_PATH,
  aiEncryptionKey: envVars.AI_ENCRYPTION_KEY,
  aiReadonlyDatabaseUrl: envVars.AI_READONLY_DATABASE_URL,
  serperApiKey: envVars.SERPER_API_KEY || undefined,
  bancardEncryptionKey: envVars.BANCARD_ENCRYPTION_KEY,
  marangatuEncryptionKey: envVars.MARANGATU_ENCRYPTION_KEY,
  novasisPayEncryptionKey: envVars.NOVASIS_PAY_ENCRYPTION_KEY,
  bancardVposUrlStaging: envVars.BANCARD_VPOS_BASE_URL_STAGING,
  bancardVposUrlProd: envVars.BANCARD_VPOS_BASE_URL_PROD,
  bancardReturnUrlBase: envVars.BANCARD_PUBLIC_RETURN_URL_BASE,
  bancardCancelUrlBase: envVars.BANCARD_PUBLIC_CANCEL_URL_BASE,
  pagoLinkBaseUrl: envVars.PAGO_LINK_BASE_URL,
  botMarangatuBaseUrl: envVars.BOT_MARANGATU_BASE_URL,
  legajoPresignedUrlExpirySec: envVars.LEGAJO_PRESIGNED_URL_EXPIRY_SEC ?? 900,
  posVentasFrontendPath: envVars.POS_VENTAS_FRONTEND_PATH || '/var/www/html/proyectos/pos-ventas',
  backendDocsPath: envVars.BACKEND_DOCS_PATH || '/var/www/html/proyectos/smartfactvoice-backend/docs',
  bullBoardUser: envVars.BULL_BOARD_USER,
  bullBoardPassword: envVars.BULL_BOARD_PASSWORD,
  bancardMockEnabled: envVars.BANCARD_MOCK_ENABLED ?? false,
  storefrontRevalidateUrl: envVars.STOREFRONT_REVALIDATE_URL,
  revalidateSecret: envVars.REVALIDATE_SECRET,
  novasisPayWebhookUrl: envVars.NOVASIS_PAY_WEBHOOK_URL,
  consultaRucUrl: envVars.CONSULTA_RUC_URL || 'http://localhost:3010',
};
