/**
 * 环境变量管理系统
 *
 * 这个模块提供统一的环境配置管理，支持多环境切换
 * 根据构建时的 NODE_ENV 自动加载对应的环境配置文件
 */

// 环境类型定义
export type Environment = 'dev' | 'test' | 'uat' | 'prod';

// 环境配置接口
export interface EnvironmentConfig {
  // 基础配置
  NODE_ENV: string;
  FRONTEND_BASE_URL: string;
  BACKEND_BASE_URL: string;
  API_VERSION: string;

  // 功能配置
  DEBUG: boolean;
  USE_MOCK: boolean;

  // 应用信息
  APP_NAME: string;
  ENV_DESCRIPTION: string;

  // 高级配置
  API_TIMEOUT?: number;
  ENABLE_ERROR_LOGGING?: boolean;
  ENABLE_PERFORMANCE_MONITORING?: boolean;
  ENABLE_USER_BEHAVIOR_TRACKING?: boolean;
  SENTRY_DSN?: string;
  CDN_BASE_URL?: string;

  // 生产环境特有
  ENABLE_MAINTENANCE_MODE?: boolean;
  ENABLE_NEW_FEATURES?: boolean;
  ENABLE_BETA_FEATURES?: boolean;
  ENABLE_ANALYTICS?: boolean;
  CACHE_TTL?: number;
  ENABLE_SERVICE_WORKER?: boolean;
}

// 环境配置映射
const ENV_CONFIGS: Record<Environment, EnvironmentConfig> = {
  dev: {
    NODE_ENV: 'development',
    FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.dev.maimaiag.com',
    BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.dev.maimaiag.com',
    API_VERSION: 'v1',
    DEBUG: true,
    USE_MOCK: false,
    APP_NAME: '智慧农业生产管理系统',
    ENV_DESCRIPTION: '开发环境',
    API_TIMEOUT: 10000,
    ENABLE_ERROR_LOGGING: true,
    ENABLE_PERFORMANCE_MONITORING: true,
  },

  test: {
    NODE_ENV: 'test',
    FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.test.maimaiag.com',
    BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.dev.maimaiag.com', // 临时使用开发环境后端
    API_VERSION: 'v1',
    DEBUG: true,
    USE_MOCK: false,
    APP_NAME: '智慧农业生产管理系统',
    ENV_DESCRIPTION: '测试环境',
    API_TIMEOUT: 15000,
    ENABLE_ERROR_LOGGING: true,
    ENABLE_PERFORMANCE_MONITORING: true,
    ENABLE_USER_BEHAVIOR_TRACKING: true,
  },

  uat: {
    NODE_ENV: 'production',
    FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.uat.maimaiag.com',
    BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.uat.maimaiag.com',
    API_VERSION: 'v1',
    DEBUG: false,
    USE_MOCK: false,
    APP_NAME: '智慧农业生产管理系统',
    ENV_DESCRIPTION: 'UAT 环境',
    API_TIMEOUT: 20000,
    ENABLE_ERROR_LOGGING: true,
    ENABLE_PERFORMANCE_MONITORING: true,
    ENABLE_USER_BEHAVIOR_TRACKING: true,
    SENTRY_DSN: 'https://your-sentry-dsn.uat@sentry.io/project-id',
  },

  prod: {
    NODE_ENV: 'production',
    FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.prod.maimaiag.com',
    BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.prod.maimaiag.com',
    API_VERSION: 'v1',
    DEBUG: false,
    USE_MOCK: false,
    APP_NAME: '智慧农业生产管理系统',
    ENV_DESCRIPTION: '生产环境',
    API_TIMEOUT: 30000,
    ENABLE_ERROR_LOGGING: true,
    ENABLE_PERFORMANCE_MONITORING: true,
    ENABLE_USER_BEHAVIOR_TRACKING: true,
    ENABLE_ANALYTICS: true,
    SENTRY_DSN: 'https://your-sentry-dsn.prod@sentry.io/project-id',
    CDN_BASE_URL: 'https://cdn.cavin-smart-crop.com',
    ENABLE_MAINTENANCE_MODE: false,
    ENABLE_NEW_FEATURES: true,
    ENABLE_BETA_FEATURES: false,
    CACHE_TTL: 3600,
    ENABLE_SERVICE_WORKER: true,
  },
};

/**
 * 获取当前环境
 *
 * 优先级：
 * 1. 环境变量 NEXT_PUBLIC_ENV
 * 2. 环境变量 NODE_ENV
 * 3. 默认 'dev' 环境
 */
export const getEnv = (): Environment => {
  // 浏览器环境
  if (typeof window !== 'undefined') {
    const env = process.env.NEXT_PUBLIC_ENV as Environment;
    if (env && Object.keys(ENV_CONFIGS).includes(env)) {
      return env;
    }
  }

  // 服务端环境
  const nodeEnv = process.env.NODE_ENV;
  if (nodeEnv === 'development') return 'dev';
  if (nodeEnv === 'test') return 'test';
  if (nodeEnv === 'production') {
    // 生产环境下需要进一步区分 UAT 和 PROD
    const env = process.env.NEXT_PUBLIC_ENV as Environment;
    return (env === 'uat' || env === 'prod') ? env : 'prod';
  }

  return 'dev'; // 默认开发环境
};

/**
 * 获取当前环境配置
 */
export const getEnvConfig = (): EnvironmentConfig => {
  const currentEnv = getEnv();
  return ENV_CONFIGS[currentEnv];
};

/**
 * 获取当前环境名称
 */
export const getEnvironmentName = (): string => {
  const config = getEnvConfig();
  return config.ENV_DESCRIPTION;
};

/**
 * 获取当前服务器域名（前端地址）
 */
export const getLocalhost = (): string => {
  const config = getEnvConfig();
  return config.FRONTEND_BASE_URL;
};

/**
 * 获取后端 API 地址
 */
export const getBackendUrl = (): string => {
  const config = getEnvConfig();
  return config.BACKEND_BASE_URL;
};

/**
 * 获取完整的 API 地址
 */
export const getApiUrl = (path?: string): string => {
  const backendUrl = getBackendUrl();
  const apiVersion = getEnvConfig().API_VERSION;
  const apiPath = `/api/${apiVersion}${path || ''}`;
  return `${backendUrl}${apiPath}`;
};

/**
 * 是否为开发环境
 */
export const isDevelopment = (): boolean => {
  return getEnv() === 'dev';
};

/**
 * 是否为测试环境
 */
export const isTest = (): boolean => {
  return getEnv() === 'test';
};

/**
 * 是否为 UAT 环境
 */
export const isUAT = (): boolean => {
  return getEnv() === 'uat';
};

/**
 * 是否为生产环境
 */
export const isProduction = (): boolean => {
  return getEnv() === 'prod';
};

/**
 * 是否为非开发环境
 */
export const isNonDevelopment = (): boolean => {
  return !isDevelopment();
};

/**
 * 是否开启调试模式
 */
export const isDebugMode = (): boolean => {
  return getEnvConfig().DEBUG;
};

/**
 * 是否使用 Mock 数据
 */
export const shouldUseMock = (): boolean => {
  return getEnvConfig().USE_MOCK;
};

/**
 * 获取 API 超时时间（毫秒）
 */
export const getApiTimeout = (): number => {
  return getEnvConfig().API_TIMEOUT || 10000;
};

/**
 * 获取应用名称
 */
export const getAppName = (): string => {
  return getEnvConfig().APP_NAME;
};

/**
 * 环境信息调试输出
 */
export const debugEnvInfo = (): void => {
  if (isDebugMode()) {
    const config = getEnvConfig();
    const env = getEnv();

    console.group('🌍 环境信息');
    console.log('当前环境:', env);
    console.log('环境描述:', config.ENV_DESCRIPTION);
    console.log('前端地址:', config.FRONTEND_BASE_URL);
    console.log('后端地址:', config.BACKEND_BASE_URL);
    console.log('调试模式:', config.DEBUG);
    console.log('使用 Mock:', config.USE_MOCK);
    console.log('NODE_ENV:', process.env.NODE_ENV);
    console.log('NEXT_PUBLIC_ENV:', process.env.NEXT_PUBLIC_ENV);
    console.groupEnd();
  }
};

// 默认导出主要函数
export default {
  getEnv,
  getEnvConfig,
  getEnvironmentName,
  getLocalhost,
  getBackendUrl,
  getApiUrl,
  isDevelopment,
  isTest,
  isUAT,
  isProduction,
  isNonDevelopment,
  isDebugMode,
  shouldUseMock,
  getApiTimeout,
  getAppName,
  debugEnvInfo,
};