/home/bdqbpbxa/dev-subdomains/admin.pixory.goodface.com.ua/src/config/env.ts
import { z } from 'zod';

const envVarsSchema = z.object({
  // Server
  JWT_SECRET: z.string().min(1, 'JWT_SECRET is required'),
  APP_URL: z.string().min(1, "APP URL must be filled up"),

  // Auth0
  AUTH0_ISSUER_BASE_URL: z.string().url('AUTH0_ISSUER_BASE_URL must be a valid URL'),
  AUTH0_AUDIENCE: z.string().min(1, 'AUTH0_AUDIENCE is required'),
  AUTH0_CLIENT_ID: z.string().min(1, 'AUTH0_CLIENT_ID is required'),
  AUTH0_CLIENT_SECRET: z.string().min(1, 'AUTH0_CLIENT_SECRET is required'),
  
  // Editor
  EDITOR_HOST: z.string().url('EDITOR_HOST must be a valid URL'),
  EDITOR_AUDIENCE: z.string().min(1, 'EDITOR_AUDIENCE is required'),

  // Exchange rates
  EXCHANGE_RATE_CACHE_DURATION_HOURS: z.string()
  .min(1, 'EXCHANGE_RATE_CACHE_DURATION_HOURS must be at least 1 hour')
  .regex(/^\d+$/, 'EXCHANGE_RATE_CACHE_DURATION_HOURS must be a number')
  .default('24'),

  // Stripe
  STRIPE_API_KEY: z.string().min(1, 'STRIPE_API_KEY is required'),
  STRIPE_WEBHOOK_SECRET: z.string().min(1, 'STRIPE_WEBHOOK_SECRET is required'),

  // Peecho
  PEECHO_API_KEY: z.string().min(1, 'PEECHO_API_KEY is required'),
  PEECHO_SECRET_KEY: z.string().min(1, 'PEECHO_SECRET_KEY is required'),
  PEECHO_API_HOST: z.string().url('PEECHO_API_HOST must be a valid URL').min(1, 'PEECHO_API_HOST is required'),
  
  // Klaviyo 
  KLAVIYO_PUBLIC_KEY: z.string().min(1, 'KLAVIYO_PUBLIC_KEY is required'),
  KLAVIYO_SECRET_KEY: z.string().min(1, 'KLAVIYO_SECRET_KEY is required'),

  // Printbox
  PRINTBOX_API_HOST: z.string().url('PRINTBOX_API_HOST must be a valid URL').min(1, 'PRINTBOX_API_HOST is required'),
  PRINTBOX_CLIENT_ID: z.string().min(1, 'PRINTBOX_CLIENT_ID is required'),
  PRINTBOX_CLIENT_SECRET: z.string().min(1, 'PRINTBOX_CLIENT_SECRET is required'),
});

function validateEnv() {
  try {
    return envVarsSchema.parse(process.env);
  } catch (error) {
    if (error instanceof z.ZodError) {
      console.error('❌ Environment validation failed:');
      error.errors.forEach((err) => {
        console.error(` - ${err.path.join('.')}: ${err.message}`);
      });
    } else {
      console.error('❌ Environment validation error:', error);
    }
    process.exit(1);
  }
}

const envVars = validateEnv();

export const env = {
  server: {
    jwtSecret: envVars.JWT_SECRET,
    appURL: envVars.APP_URL
  },
  
  auth0: {
    issuerBaseUrl: envVars.AUTH0_ISSUER_BASE_URL,
    audience: envVars.AUTH0_AUDIENCE,
    clientId: envVars.AUTH0_CLIENT_ID,
    clientSecret: envVars.AUTH0_CLIENT_SECRET,
  },
  
  editor: {
    host: envVars.EDITOR_HOST,
    audience: envVars.EDITOR_AUDIENCE,
  },

  exchangeRate: {
    cacheDurationHours: Number(envVars.EXCHANGE_RATE_CACHE_DURATION_HOURS),
  },

  stripe: {
    apiKey: envVars.STRIPE_API_KEY,
    webhookSecret: envVars.STRIPE_WEBHOOK_SECRET
  },

  peecho: {
    apiKey: envVars.PEECHO_API_KEY,
    secretKey: envVars.PEECHO_SECRET_KEY,
    apiHost: envVars.PEECHO_API_HOST,
  },

  klaviyo: {
    publicKey: envVars.KLAVIYO_PUBLIC_KEY,
    secretKey: envVars.KLAVIYO_SECRET_KEY
  },
  
  printbox: {
    apiHost: envVars.PRINTBOX_API_HOST,
    clientId: envVars.PRINTBOX_CLIENT_ID,
    clientSecret: envVars.PRINTBOX_CLIENT_SECRET,
  }
} as const;