import { Injectable } from '@nestjs/common';
import { SUPPORTED_REGIONS, Region } from '../guards/region.guard';

/**
 * 区域配置
 */
export interface RegionConfig {
  code: Region;
  name: string;
  nameEn: string;
  timezone: string;
  currency: string;
  locale: string;
  flag: string;
}

/**
 * 区域服务
 * 
 * 提供区域相关的工具方法和配置
 */
@Injectable()
export class RegionService {
  /**
   * 区域配置
   */
  private readonly regionConfigs: Record<Region, RegionConfig> = {
    CN: {
      code: 'CN',
      name: '中国',
      nameEn: 'China',
      timezone: 'Asia/Shanghai',
      currency: 'CNY',
      locale: 'zh-CN',
      flag: '🇨🇳',
    },
    US: {
      code: 'US',
      name: '美国',
      nameEn: 'United States',
      timezone: 'America/New_York',
      currency: 'USD',
      locale: 'en-US',
      flag: '🇺🇸',
    },
    UAE: {
      code: 'UAE',
      name: '阿联酋',
      nameEn: 'United Arab Emirates',
      timezone: 'Asia/Dubai',
      currency: 'AED',
      locale: 'ar-AE',
      flag: '🇦🇪',
    },
  };

  /**
   * 获取所有支持的区域
   */
  getAllRegions(): RegionConfig[] {
    return Object.values(this.regionConfigs);
  }

  /**
   * 获取区域配置
   */
  getRegionConfig(region: Region): RegionConfig | null {
    return this.regionConfigs[region] || null;
  }

  /**
   * 验证区域是否有效
   */
  isValidRegion(region: string): region is Region {
    return SUPPORTED_REGIONS.includes(region as Region);
  }

  /**
   * 获取默认区域
   */
  getDefaultRegion(): Region {
    return 'CN';
  }

  /**
   * 根据用户权限获取可访问的区域列表
   */
  getAccessibleRegions(permissions: string[]): RegionConfig[] {
    // 如果有全区域访问权限
    if (permissions.includes('region:*:access')) {
      return this.getAllRegions();
    }

    // 过滤出有权限访问的区域
    const accessibleRegions: RegionConfig[] = [];

    for (const region of SUPPORTED_REGIONS) {
      const permission = `region:${region.toLowerCase()}:access`;
      if (permissions.includes(permission)) {
        accessibleRegions.push(this.regionConfigs[region]);
      }
    }

    return accessibleRegions;
  }

  /**
   * 检查用户是否可以访问指定区域
   */
  canAccessRegion(permissions: string[], region: Region, defaultRegion?: Region): boolean {
    // 默认区域总是可以访问
    if (defaultRegion === region) {
      return true;
    }

    // 全区域访问权限
    if (permissions.includes('region:*:access')) {
      return true;
    }

    // 特定区域访问权限
    const permission = `region:${region.toLowerCase()}:access`;
    return permissions.includes(permission);
  }

  /**
   * 获取区域的时区
   */
  getTimezone(region: Region): string {
    return this.regionConfigs[region]?.timezone || 'UTC';
  }

  /**
   * 获取区域的货币
   */
  getCurrency(region: Region): string {
    return this.regionConfigs[region]?.currency || 'USD';
  }

  /**
   * 获取区域的语言环境
   */
  getLocale(region: Region): string {
    return this.regionConfigs[region]?.locale || 'en-US';
  }
}

