import path from 'path';

import dotenv from 'dotenv';
import { z } from 'zod';

// EN: Load environment variables (optional for local development without Docker)
// VI: Tải biến môi trường (tùy chọn cho phát triển local không dùng Docker)
// EN: In production, environment variables are set via Docker Compose or Kubernetes
// VI: Trong production, biến môi trường được set qua Docker Compose hoặc Kubernetes
// EN: Priority: Docker Compose > .env.local > .env > System environment
// VI: Ưu tiên: Docker Compose > .env.local > .env > Môi trường hệ thống
dotenv.config({ path: path.resolve(process.cwd(), '.env') });
dotenv.config({ path: path.resolve(process.cwd(), '.env.local'), override: true });

/**
 * EN: Environment variable schema
 * VI: Schema biến môi trường
 */
const envSchema = z.object({
  PORT: z.string().default('5000').transform(Number), // Reorder: default before transform
  NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
  API_VERSION: z.string().default('v1'),
  CORS_ORIGIN: z.string().optional().default('http://localhost:3000'),
  SERVICE_NAME: z.string().default('microservice-template'),
  TRACING_ENABLED: z.enum(['true', 'false']).default('false'),
  JAEGER_ENDPOINT: z.string().optional(),
  JWT_SECRET: z.string().default('default-jwt-secret-change-in-production'),
  REDIS_URL: z.string().default('redis://localhost:6379'),
});

/**
 * EN: Parse and validate environment variables
 * VI: Phân tích và validate biến môi trường
 */
const env = envSchema.safeParse(process.env);

if (!env.success) {
  console.error('❌ Invalid environment variables:', JSON.stringify(env.error.format(), null, 2));
  process.exit(1);
}

const config = env.data;

/**
 * EN: Application configuration object
 * VI: Đối tượng cấu hình ứng dụng
 */
export const appConfig = {
  // EN: Server port
  // VI: Cổng server
  port: config.PORT,

  // EN: Node environment
  // VI: Môi trường Node
  nodeEnv: config.NODE_ENV,

  // EN: API version
  // VI: Phiên bản API
  apiVersion: config.API_VERSION,

  // EN: CORS origins
  // VI: Các origin cho CORS
  corsOrigin: config.CORS_ORIGIN.split(','),

  // EN: Service name
  // VI: Tên dịch vụ
  serviceName: config.SERVICE_NAME,

  // EN: Tracing configuration
  // VI: Cấu hình tracing
  tracing: {
    enabled: config.TRACING_ENABLED === 'true',
    jaegerEndpoint: config.JAEGER_ENDPOINT,
  },

  // EN: Redis URL
  // VI: URL Redis
  redisUrl: config.REDIS_URL,

  // EN: JWT Secret for authentication
  // VI: JWT Secret để xác thực
  jwtSecret: config.JWT_SECRET,
};
