import Joi from 'joi';
import dotenv from 'dotenv';

const dotenvPath =
  process.env['NODE_ENV'] === 'development' ? '.env.dev' : '.env';

dotenv.config({
  path: dotenvPath,
});

const envVarsSchema = Joi.object()
  .keys({
    NODE_ENV: Joi.string()
      .valid('production', 'development', 'staging', 'test')
      .required(),
    PORT: Joi.number().default(3000),
    MONGODB_PROTOCOL: Joi.string().required().description('Mongo Protocol'),
    MONGODB_HOST: Joi.string().required().description('Mongo Host URL'),
    MONGODB_USERNAME: Joi.string().required().description('Mongo DB Name'),
    MONGODB_NAME: Joi.string().required().description('Mongo DB Password'),
    MONGODB_PASSWORD: Joi.string().required().description('Mongo DB Password'),
    JWT_SECRET: Joi.string().required().description('JWT secret key'),
    JWT_ACCESS_EXPIRATION_MINUTES: Joi.number()
      .default(30)
      .description('minutes after which access tokens expire'),
    JWT_REFRESH_EXPIRATION_DAYS: Joi.number()
      .default(30)
      .description('days after which refresh tokens expire'),
    JWT_RESET_PASSWORD_EXPIRATION_MINUTES: Joi.number()
      .default(10)
      .description('minutes after which reset password token expires'),
    JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: Joi.number()
      .default(10)
      .description('minutes after which verify email token expires'),
    SMTP_HOST: Joi.string().description('server that will send the emails'),
    SMTP_PORT: Joi.number().description('port to connect to the email server'),
    SMTP_USERNAME: Joi.string().description('username for email server'),
    SMTP_PASSWORD: Joi.string().description('password for email server'),
    EMAIL_FROM: Joi.string().description(
      'the from field in the emails sent by the app',
    ),
    FRONTEND_URL: Joi.string().required().description('Client url'),
    USER_SERVICE_URL: Joi.string().required().description('Server url'),
    RESET_PASSWORD_URL: Joi.string()
      .required()
      .description('Reset password url'),
    REDIS_HOST: Joi.string().required().description('Redis host'),
    REDIS_PORT: Joi.number().required().description('Redis port'),
    AWS_ACCESS_KEY_ID: Joi.string().description('AWS Access Key ID is missing'),
    AWS_SECRET_ACCESS_KEY: Joi.string().description(
      'AWS Secret Access Key is missing',
    ),
    AWS_REGION: Joi.string().description('AWS Region is missing'),
    AWS_BUCKET_NAME: Joi.string().description('AWS Bucket Name is missing'),
    FAST_2_SMS_API_KEY: Joi.string()
      .required()
      .description('Fast 2 SMS API Key'),
    FAST_2_SMS_API_URL: Joi.string()
      .required()
      .description('Fast 2 SMS API URL'),
    FAST_2_SMS_SENDER_ID: Joi.string()
      .required()
      .description('Fast 2 SMS Sender ID'),
    FAST_2_SMS_MSG_ID: Joi.string()
      .required()
      .description('Fast 2 SMS Message ID'),
    FAST_2_SMS_ROUTE: Joi.string().required().description('Fast 2 SMS Route'),
    R2_ACCOUNT_ID: Joi.string()
      .required()
      .description('R2 Account ID is missing'),
    R2_ACCESS_KEY_ID: Joi.string()
      .required()
      .description('R2 Access Key ID is missing'),
    R2_SECRET_ACCESS_KEY: Joi.string()
      .required()
      .description('R2 Secret Access Key is missing'),
    R2_BUCKET_NAME: Joi.string()
      .required()
      .description('R2 Bucket Name is missing'),
    R2_PUBLIC_BASE_URL: Joi.string()
      .required()
      .description('R2 Public Base URL'),
    LOGIN_ROUTE: Joi.string().required().description('Login Route'),
    WASABI_ACCESS_KEY_ID: Joi.string().description(
      'WASABI Access Key ID is missing',
    ),
    WASABI_SECRET_ACCESS_KEY: Joi.string().description(
      'WASABI Secret Access Key is missing',
    ),
    WASABI_REGION: Joi.string().description('WASABI Region is missing'),
    WASABI_BUCKET_NAME: Joi.string().description(
      'WASABI Bucket Name is missing',
    ),
    FB_API_PATH: Joi.string().description('Whatsapp Template Path is missing'),
    WHATSAPP_AUTH_API_KEY: Joi.string().description(
      'Whatsapp Auth API Key is missing',
    ),
    FB_APP_CLIENT_ID: Joi.string().description(
      'Whatsapp Auth API Secret is missing',
    ),
    FB_SECRET_CLIENT_ID: Joi.string().description(
      'Whatsapp Template API Path is missing',
    ),
    WHATSAPP_MSG_ID: Joi.string().description(
      'Whatsapp Template API Key is missing',
    ),
    EMAIL_PROVIDER: Joi.string()
      .valid('ses')
      .default('ses')
      .description('Email provider selection'),
    AWS_SES_REGION: Joi.string().description('AWS SES Region'),
    AWS_SES_ACCESS_KEY_ID: Joi.string().description('AWS SES Access Key ID'),
    AWS_SES_SECRET_ACCESS_KEY: Joi.string().description(
      'AWS SES Secret Access Key',
    ),
    AWS_SES_SENDER_EMAIL: Joi.string()
      .email()
      .description('AWS SES Sender Email'),
    AWS_SES_SENDER_NAME: Joi.string().description('AWS SES Sender Name'),
    BREVO_API_KEY: Joi.string().description(
      'Brevo API Key for contact management',
    ),
    TOKEN_ENCRYPTION_KEY: Joi.string().description(
      'Token Encryption Key is missing',
    ),
    META_WEBHOOK_TOKEN: Joi.string().description('Meta Webhook Key is missing'),
    FB_LEAD_APP_CLIENT_ID: Joi.string().description(
      'FB Lead App Client ID is missing',
    ),
    FB_LEAD_SECRET_CLIENT_ID: Joi.string().description(
      'FB Lead App Client ID is missing',
    ),
    MAINTENANCE_MODE: Joi.boolean()
      .default(false)
      .description('Enable maintenance mode for the application'),

    GOOGLE_ADS_WEBHOOK_KEY: Joi.string().description(
      'Google Ads Webhook Key is missing',
    ),
    CORS_ORIGIN: Joi.string().required().description('CORS origin'),
    GOOGLE_PLACES_API_KEY: Joi.string()
      .required()
      .description('Google Places API Key is missing'),
    WEBSITE_BUILDER_RESERVED_SUBDOMAIN: Joi.string()
      .required()
      .description('Website Builder Reserved Subdomain'),
    MYOPERATOR_API_URL: Joi.string()
      .default('https://developers.myoperator.co')
      .description('MyOperator API URL'),
    MYOPERATOR_OBD_API_URL: Joi.string()
      .default('https://obd-api.myoperator.co/obd-api-v1')
      .description('MyOperator OBD API URL'),
    ADMIN_EMAIL: Joi.string().description('Admin email'),
  })
  .unknown();

const { value: envVars, error } = envVarsSchema
  .prefs({ errors: { label: 'key' } })
  .validate(process.env);

if (error) throw new Error(`Config validation error: ${error.message}`);

const config = {
  env: envVars.NODE_ENV,
  corsOrigin: envVars.CORS_ORIGIN,
  port: envVars.PORT,
  mongoose: {
    protocol: envVars.MONGODB_PROTOCOL,
    name: envVars.MONGODB_NAME,
    username: envVars.MONGODB_USERNAME,
    password: envVars.MONGODB_PASSWORD,
    host: envVars.MONGODB_HOST,
  },
  jwt: {
    secret: envVars.JWT_SECRET,
    accessExpirationMinutes: envVars.JWT_ACCESS_EXPIRATION_MINUTES,
    refreshExpirationDays: envVars.JWT_REFRESH_EXPIRATION_DAYS,
    resetPasswordExpirationMinutes:
      envVars.JWT_RESET_PASSWORD_EXPIRATION_MINUTES,
    verifyEmailExpirationMinutes: envVars.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES,
    cookieOptions: {
      httpOnly: true,
      secure: envVars.NODE_ENV === 'production',
      signed: true,
    },
  },
  redis: {
    host: envVars.REDIS_HOST,
    port: envVars.REDIS_PORT,
  },
  clientUrl: envVars.FRONTEND_URL,
  resetPasswordUrl: envVars.RESET_PASSWORD_URL,
  backendUrl: envVars.USER_SERVICE_URL,

  loginRoute: envVars.LOGIN_ROUTE,

  // AWS configuration
  aws: {
    accessKeyId: envVars.AWS_ACCESS_KEY_ID,
    secretAccessKey: envVars.AWS_SECRET_ACCESS_KEY,
    region: envVars.AWS_REGION,
    bucketName: envVars.AWS_BUCKET_NAME,
  },

  ses: {
    region: envVars.AWS_REGION,
    accessKeyId: envVars.AWS_SES_ACCESS_KEY_ID,
    secretAccessKey: envVars.AWS_SES_SECRET_ACCESS_KEY,
    senderEmail: envVars.AWS_SES_SENDER_EMAIL,
    senderName: envVars.AWS_SES_SENDER_NAME,
  },

  // Fast2SMS
  fast2sms: {
    apiKey: envVars.FAST_2_SMS_API_KEY,
    apiUrl: envVars.FAST_2_SMS_API_URL,
    senderId: envVars.FAST_2_SMS_SENDER_ID,
    msgId: envVars.FAST_2_SMS_MSG_ID,
    route: envVars.FAST_2_SMS_ROUTE,
  },

  // R2 configuration
  r2: {
    accountId: envVars.R2_ACCOUNT_ID,
    accessKeyId: envVars.R2_ACCESS_KEY_ID,
    secretAccessKey: envVars.R2_SECRET_ACCESS_KEY,
    bucketName: envVars.R2_BUCKET_NAME,
    publicBaseUrl: envVars.R2_PUBLIC_BASE_URL,
  },

  // Whatsapp Template
  whatsappTemplate: {
    accessToken: envVars.WHATSAPP_AUTH_API_KEY,
    businessId: envVars.WHATSAPP_MSG_ID,
    phoneNumberId: envVars.WHATSAPP_PHONE_NUMBER_ID,
    fbAppId: envVars.FB_APP_CLIENT_ID,
    fbSecretId: envVars.FB_SECRET_CLIENT_ID,
  },

  // Brevo configuration (for contact management only)
  brevo: {
    apiKey: envVars.BREVO_API_KEY,
  },
  // Token Encryption Key
  tokenEncryptionKey: envVars.TOKEN_ENCRYPTION_KEY,

  // Meta Webhook Key
  metaWebhookToken: envVars.META_WEBHOOK_TOKEN,
  metaApiPath: envVars.FB_API_PATH,
  metaAppId: envVars.FB_APP_CLIENT_ID,
  metaSecretId: envVars.FB_SECRET_CLIENT_ID,
  metaLeadAppId: envVars.FB_LEAD_APP_CLIENT_ID,
  metaLeadSecretId: envVars.FB_LEAD_SECRET_CLIENT_ID,
  maintenanceMode: envVars.MAINTENANCE_MODE,

  // Google Ads Webhook Key
  googleAdsWebhookKey: envVars.GOOGLE_ADS_WEBHOOK_KEY,

  // Google Places API
  google: {
    apiKey: envVars.GOOGLE_PLACES_API_KEY,
  },
  // Website Builder Reserved Subdomain
  websiteBuilderReservedSubdomain: envVars.WEBSITE_BUILDER_RESERVED_SUBDOMAIN,
  propertyAiApiUrl: envVars.PROPERTY_AI_API_URL,
  aiApiAccessKey: envVars.AI_API_A_KEY,
  aiApiSecretKey: envVars.AI_API_S_KEY,
  aiApiRegion: envVars.AI_API_REGION,
  // MyOperator configuration
  myoperator: {
    apiUrl: envVars.MYOPERATOR_API_URL,
    obdApiUrl: envVars.MYOPERATOR_OBD_API_URL,
  },
  adminEmail: envVars.ADMIN_EMAIL,
};

export default config;
