import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import * as Joi from 'joi';
import appConfig from './app.config';
import databaseConfig from './database.config';
import redisConfig from './redis.config';
import storageConfig from './storage.config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [appConfig, databaseConfig, redisConfig, storageConfig],
      validationSchema: Joi.object({
        APP_PORT: Joi.number().default(3000),
        APP_ENV: Joi.string().valid('development', 'staging', 'production').default('development'),
        BASE_URL: Joi.string().uri().default('http://localhost:3000'),
        DB_HOST: Joi.string().required(),
        DB_PORT: Joi.number().default(5432),
        DB_USERNAME: Joi.string().required(),
        DB_PASSWORD: Joi.string().allow('').default(''),
        DB_NAME: Joi.string().required(),
        REDIS_HOST: Joi.string().default('localhost'),
        REDIS_PORT: Joi.number().default(6379),
        REDIS_PASSWORD: Joi.string().allow('').optional(),
        JWT_SECRET: Joi.string().required().min(16).messages({
          'any.required': 'JWT_SECRET is required — set it in .env',
          'string.min': 'JWT_SECRET must be at least 16 characters',
        }),
        CORS_ORIGIN: Joi.string().default('http://localhost:5173'),
        FRONTEND_ALLOWED_HOSTS: Joi.string().default('localhost'),
        BREVO_API_KEY: Joi.string().allow('').optional(),
        BREVO_FROM_EMAIL: Joi.string().allow('').optional(),
        // Comma-separated inboxes that receive 500-error alerts.
        // Unset = alerting off.
        DEVELOPER_EMAILS: Joi.string().allow('').optional(),
        STORAGE_LOCAL_DIR: Joi.string()
          .pattern(/^[a-zA-Z0-9._-]+(?:\/[a-zA-Z0-9._-]+)*$/)
          .default('uploads'),
      }),
    }),
  ],
})
export class AppConfigModule {}
