import path from 'path';
import { loadEnvConfig } from '@next/env';

// Automatically load .env and .env.local across all runtime contexts (CLI, tests, worker scripts, Next.js)
if (typeof window === 'undefined') {
  try {
    loadEnvConfig(process.cwd());
  } catch {}
}

import { APP_CONFIG, getAppBaseUrl } from '@/config/app';
import { SHOPIFY_CONFIG } from '@/config/shopify';
import { META_CONFIG } from '@/config/meta';

export interface EnvValidationResult {
  valid: boolean;
  missing: string[];
  warnings: string[];
}

/**
 * Validates environment variables for production security and compliance.
 * Throws in production if critical variables are missing.
 */
export function validateEnvironment(strict: boolean = process.env.NODE_ENV === 'production'): EnvValidationResult {
  const missing: string[] = [];
  const warnings: string[] = [];

  // 1. Shopify OAuth & API Requirements
  if (!process.env.SHOPIFY_API_KEY && !process.env.NEXT_PUBLIC_SHOPIFY_API_KEY) {
    missing.push('SHOPIFY_API_KEY / NEXT_PUBLIC_SHOPIFY_API_KEY');
  }
  if (!process.env.SHOPIFY_API_SECRET) {
    missing.push('SHOPIFY_API_SECRET');
  }

  // 2. Cryptographic Security Requirements
  if (!process.env.ENCRYPTION_SECRET) {
    missing.push('ENCRYPTION_SECRET');
  } else {
    const encSecret = process.env.ENCRYPTION_SECRET.trim();
    if (encSecret.length < 32) {
      warnings.push('ENCRYPTION_SECRET should be at least 32 characters or a 64-character hex string for AES-256-GCM');
    }
  }

  // 3. Database Connection
  if (!process.env.DB_NAME && !process.env.DATABASE_URL) {
    missing.push('DB_NAME or DATABASE_URL');
  }

  // 4. SaaS Admin Security Checks
  const adminEmail = process.env.ADMIN_EMAIL;
  const adminPass = process.env.ADMIN_PASSWORD;

  if (process.env.NODE_ENV === 'production') {
    if (!adminEmail || !adminPass) {
      warnings.push('ADMIN_EMAIL and ADMIN_PASSWORD should be explicitly configured in production .env');
    } else if (adminPass === 'admin1234' || adminPass === 'admin') {
      warnings.push('ADMIN_PASSWORD is using an insecure default password. Please update in production!');
    }
  }

  const result: EnvValidationResult = {
    valid: missing.length === 0,
    missing,
    warnings,
  };

  if (strict && !result.valid) {
    throw new Error(
      `[Environment Configuration Error] Missing required production environment variables:\n - ${missing.join(
        '\n - '
      )}\nPlease verify your .env or server environment configuration.`
    );
  }

  return result;
}

/**
 * Centralized, validated environment configuration for Meta Shopify Connector.
 * All environment variables, secrets, database settings, admin credentials,
 * and third-party API configs are declared and typed here.
 */
export const env = {
  // Application & Server
  app: {
    name: APP_CONFIG.name,
    env: APP_CONFIG.env,
    port: parseInt(process.env.PORT || '3000', 10),
    url: getAppBaseUrl(),
    logLevel: process.env.LOG_LEVEL || 'info',
    isDev: APP_CONFIG.isDev,
    isProd: APP_CONFIG.isProd,
    supportEmail: APP_CONFIG.supportEmail,
    supportPhone: APP_CONFIG.supportPhone,
    supportPhoneRaw: APP_CONFIG.supportPhoneRaw,
    companyName: APP_CONFIG.companyName,
    companyWebsite: APP_CONFIG.companyWebsite,
  },

  // SaaS Admin Credentials & Access
  admin: {
    email: (process.env.ADMIN_EMAIL || 'admin@meta-connector.app').trim().toLowerCase(),
    password: process.env.ADMIN_PASSWORD || 'admin1234',
    name: process.env.ADMIN_NAME || 'Sarah Jenkins (SaaS Owner)',
    role: process.env.ADMIN_ROLE || 'super_admin',
    sessionSecret:
      process.env.ADMIN_SESSION_SECRET ||
      process.env.COOKIE_SECRET ||
      process.env.SHOPIFY_API_SECRET ||
      'saas_admin_secure_secret_key_2026',
  },

  // Database & Storage
  database: {
    host: process.env.DB_HOST || '127.0.0.1',
    port: parseInt(process.env.DB_PORT || '3306', 10),
    user: process.env.DB_USER || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_NAME || 'meta_connector',
    dir: path.resolve(process.cwd(), process.env.DATABASE_DIR || 'data'),
    file: path.resolve(process.cwd(), process.env.DATABASE_FILE || 'data/db.json'),
    url: process.env.DATABASE_URL || 'mysql://root@127.0.0.1:3306/meta_connector',
  },

  // Security & Cryptography
  security: {
    encryptionSecret:
      process.env.ENCRYPTION_SECRET ||
      'e4d909c290d0fb1ca068ffaddf22cbd000000000000000000000000000000001',
    cookieSecret: process.env.COOKIE_SECRET || 'secure_session_secret_32bytes_change_in_production!',
  },

  // Shopify App & Billing
  shopify: {
    apiKey: SHOPIFY_CONFIG.apiKey,
    apiSecret: SHOPIFY_CONFIG.getServerSecret(),
    apiVersion: SHOPIFY_CONFIG.apiVersion,
    scopes: SHOPIFY_CONFIG.scopes,
    appUrl: getAppBaseUrl(),
    webhookSecret: SHOPIFY_CONFIG.getWebhookSecret(),
    defaultShopDomain: SHOPIFY_CONFIG.defaultShopDomain,
    appHandle: process.env.SHOPIFY_APP_HANDLE || 'meta-connector',
    billingTest: process.env.SHOPIFY_BILLING_TEST === 'true' || process.env.NODE_ENV !== 'production',
  },

  // Meta (Facebook & Instagram) Commerce & CAPI
  meta: {
    appId: process.env.META_APP_ID || '',
    appSecret: process.env.META_APP_SECRET || '',
    graphVersion: META_CONFIG.graphVersion,
    businessId: process.env.META_BUSINESS_ID || '',
    businessName: process.env.META_BUSINESS_NAME || '',
    catalogId: process.env.META_CATALOG_ID || '',
    catalogName: process.env.META_CATALOG_NAME || '',
    pixelId: process.env.META_PIXEL_ID || '',
    pixelName: process.env.META_PIXEL_NAME || '',
    accessToken: process.env.META_ACCESS_TOKEN || '',
    testEventCode: META_CONFIG.defaultTestEventCode,
    partnerAgent: META_CONFIG.partnerAgent,
  },
} as const;
