import * as Joi from 'joi';

export const validationSchema = Joi.object({
  NODE_ENV: Joi.string().valid('development', 'test', 'production').default('development'),
  PORT: Joi.number().default(4000),
  HOST: Joi.string().default('0.0.0.0'),
  PUBLIC_BASE_URL: Joi.string().uri().optional(),
  RESPONSE_ENVELOPE_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  GLOBAL_PREFIX: Joi.string().default('api/v1'),
  CORS_ORIGINS: Joi.string().allow('').optional(),
  MONGODB_URI: Joi.string().required(),
  JWT_ACCESS_SECRET: Joi.string().min(16).required(),
  JWT_ACCESS_EXPIRES_IN: Joi.string().default('15m'),
  JWT_REFRESH_SECRET: Joi.string().min(16).required(),
  JWT_REFRESH_EXPIRES_IN: Joi.string().default('30d'),
  SUPERADMIN_EMAIL: Joi.string().email().required(),
  SUPERADMIN_PASSWORD: Joi.string().min(8).required(),
  SUPERADMIN_ACCESS_SECRET: Joi.string().min(16).required(),
  SUPERADMIN_ACCESS_EXPIRES_IN: Joi.string().default('15m'),
  SUPERADMIN_REFRESH_SECRET: Joi.string().min(16).required(),
  SUPERADMIN_REFRESH_EXPIRES_IN: Joi.string().default('30d'),
  GOOGLE_CLIENT_ID: Joi.string().allow('').optional(),
  GOOGLE_CLIENT_SECRET: Joi.string().allow('').optional(),
  GOOGLE_CALLBACK_URL: Joi.string().uri().optional(),
  EMAIL_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  EMAIL_SMTP_HOST: Joi.string().allow('').optional(),
  EMAIL_SMTP_PORT: Joi.number().default(587),
  EMAIL_SMTP_SECURE: Joi.boolean().truthy('true').falsy('false').default(false),
  EMAIL_SMTP_USER: Joi.string().allow('').optional(),
  EMAIL_SMTP_PASS: Joi.string().allow('').optional(),
  EMAIL_FROM_NAME: Joi.string().default('Oudelaa'),
  EMAIL_FROM_EMAIL: Joi.string().allow('').optional(),
  AI_MUSIC_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  AI_MUSIC_API_KEY: Joi.string().allow('').optional(),
  AI_MUSIC_PROJECT_ID: Joi.string().allow('').optional(),
  AI_MUSIC_LOCATION: Joi.string().default('us-central1'),
  AI_MUSIC_MODEL: Joi.string().default('lyria-002'),
  BCRYPT_SALT_ROUNDS: Joi.number().min(8).max(15).default(12),
  REFRESH_TOKEN_HASH_SECRET: Joi.string().allow('').optional(),
  REDIS_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  REDIS_URL: Joi.string().allow('').optional(),
  REDIS_HOST: Joi.string().default('127.0.0.1'),
  REDIS_PORT: Joi.number().default(6379),
  REDIS_USERNAME: Joi.string().allow('').optional(),
  REDIS_PASSWORD: Joi.string().allow('').optional(),
  REDIS_DB: Joi.number().min(0).default(0),
  REDIS_KEY_PREFIX: Joi.string().default('oudelaa'),
  REDIS_SOCKET_ADAPTER_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  QUEUE_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  QUEUE_NAME: Joi.string().default('app-jobs'),
  QUEUE_DEFAULT_ATTEMPTS: Joi.number().min(1).max(20).default(3),
  QUEUE_DEFAULT_BACKOFF_MS: Joi.number().min(100).max(600000).default(1000),
  QUEUE_REMOVE_ON_COMPLETE: Joi.boolean().truthy('true').falsy('false').default(true),
  QUEUE_WORKER_CONCURRENCY: Joi.number().min(1).max(100).default(5),
  STORAGE_PROVIDER: Joi.string().valid('local', 's3').default('local'),
  STORAGE_BASE_PATH: Joi.string().default('uploads'),
  STORAGE_PUBLIC_BASE_URL: Joi.string().allow('').optional(),
  S3_BUCKET: Joi.string().allow('').optional(),
  S3_REGION: Joi.string().allow('').default('auto'),
  S3_ENDPOINT: Joi.string().allow('').optional(),
  S3_ACCESS_KEY_ID: Joi.string().allow('').optional(),
  S3_SECRET_ACCESS_KEY: Joi.string().allow('').optional(),
  S3_FORCE_PATH_STYLE: Joi.boolean().truthy('true').falsy('false').default(false),
  S3_HEALTH_WRITE_TEST_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  IMAGE_PROCESSING_ENABLED: Joi.boolean().truthy('true').falsy('false').optional(),
  IMAGE_PROCESSING_FFMPEG_PATH: Joi.string().allow('').optional(),
  IMAGE_PROCESSING_LOW_WIDTH: Joi.number().min(160).max(1920).default(360),
  IMAGE_PROCESSING_MEDIUM_WIDTH: Joi.number().min(160).max(2560).default(720),
  IMAGE_PROCESSING_HIGH_WIDTH: Joi.number().min(320).max(3840).default(1280),
  IMAGE_PROCESSING_QUALITY: Joi.number().min(40).max(100).default(78),
  VIDEO_PROCESSING_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  VIDEO_PROCESSING_FFMPEG_PATH: Joi.string().default('ffmpeg'),
  VIDEO_PROCESSING_FFPROBE_PATH: Joi.string().allow('').optional(),
  VIDEO_PROCESSING_MAX_WIDTH: Joi.number().min(320).max(3840).default(1280),
  VIDEO_PROCESSING_MAX_FPS: Joi.number().min(12).max(60).default(30),
  VIDEO_PROCESSING_CRF: Joi.number().min(18).max(35).default(28),
  VIDEO_PROCESSING_PRESET: Joi.string()
    .valid('ultrafast', 'superfast', 'veryfast', 'faster', 'fast', 'medium', 'slow')
    .default('veryfast'),
  VIDEO_PROCESSING_AUDIO_BITRATE_KBPS: Joi.number().min(64).max(320).default(128),
  VIDEO_PROCESSING_GENERATE_THUMBNAILS: Joi.boolean().truthy('true').falsy('false').default(true),
  VIDEO_PROCESSING_GENERATE_HLS: Joi.boolean().truthy('true').falsy('false').default(true),
  VIDEO_PROCESSING_HLS_SEGMENT_DURATION_SECONDS: Joi.number().min(2).max(20).default(4),
  VIDEO_PROCESSING_THUMBNAIL_WIDTH: Joi.number().min(160).max(1920).default(720),
  AUDIO_PROCESSING_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  AUDIO_WAVEFORM_PEAKS: Joi.number().min(16).max(256).default(48),
  LOG_LEVEL: Joi.string().valid('error', 'warn', 'log', 'debug', 'verbose').default('log'),
  REQUEST_LOGGING_ENABLED: Joi.boolean().truthy('true').falsy('false').default(true),
  FEED_CACHE_ENABLED: Joi.boolean().truthy('true').falsy('false').default(true),
  FEED_CACHE_USER_TTL_SECONDS: Joi.number().min(1).max(3600).default(15),
  FEED_CACHE_TRENDING_TTL_SECONDS: Joi.number().min(1).max(3600).default(30),
  FEED_TIMING_LOGS_ENABLED: Joi.boolean().truthy('true').falsy('false').default(false),
  PASSWORD_RESET_CODE_EXPIRES_MINUTES: Joi.number().min(1).max(60).default(10),
  PASSWORD_RESET_MAX_ATTEMPTS: Joi.number().min(1).max(10).default(5),
  PASSWORD_RESET_TOKEN_SECRET: Joi.string().allow('').optional(),
  PASSWORD_RESET_TOKEN_EXPIRES_IN: Joi.string().default('15m'),
  EMAIL_VERIFICATION_CODE_EXPIRES_MINUTES: Joi.number().min(1).max(60).default(10),
  EMAIL_VERIFICATION_MAX_ATTEMPTS: Joi.number().min(1).max(10).default(5),
  SWAGGER_TITLE: Joi.string().default('Oudelaa API'),
  SWAGGER_DESCRIPTION: Joi.string().default('Social media backend API documentation'),
  SWAGGER_VERSION: Joi.string().default('1.0.0'),
  SWAGGER_PATH: Joi.string().default('docs'),
});
