// 地区数据格式转换工具
// 支持双地区数据系统架构：
// 
// 1. 供应商基本信息地址选择：
//    - 使用前端组件库数据（element-china-area-data 或本地 regionData.ts）
//    - 优点：简单快速，无需网络请求，适合基本地址选择
//    - 用途：供应商注册地址、办公地址等基本信息
//
// 2. 供应区域管理：
//    - 使用后端数据库数据（通过 chinaAreaList API）
//    - 优点：支持复杂业务逻辑，数据可动态管理，与业务系统一致
//    - 用途：供货区域、授权区域等复杂业务场景
//
// 这种双系统设计是合理的，各自服务于不同的业务场景

export interface BackendRegionItem {
  id: number;
  areaCode: string;
  areaName: string;
  parentCode: number;
  simpleName?: string;
  level: number;
  pinYin?: string;
  dataSource: string;
  children?: BackendRegionItem[];
}

export interface FrontendRegionItem {
  value: string;
  label: string;
  children?: FrontendRegionItem[];
}

/**
 * 将后端地区数据转换为前端级联选择器需要的格式
 * 主要用于供应区域管理等复杂业务场景
 * @param backendData 后端返回的地区数据
 * @returns 转换后的前端格式数据
 */
export function convertRegionData(backendData: BackendRegionItem[]): FrontendRegionItem[] {
  if (!Array.isArray(backendData)) {
    console.warn('convertRegionData: 输入数据不是数组格式');
    return [];
  }

  return backendData.map(item => {
    const converted: FrontendRegionItem = {
      value: item.areaCode,
      label: item.areaName
    };

    // 递归转换子级数据
    if (item.children && item.children.length > 0) {
      converted.children = convertRegionData(item.children);
    }

    return converted;
  });
}

/**
 * 根据地区名称查找对应的地区代码
 * @param regionData 地区数据
 * @param provinceName 省份名称
 * @param cityName 城市名称（可选）
 * @param districtName 区县名称（可选）
 * @returns 地区代码数组 [省代码, 市代码, 区代码]
 */
export function findRegionCodes(
  regionData: FrontendRegionItem[],
  provinceName: string,
  cityName?: string,
  districtName?: string
): string[] {
  const result: string[] = [];

  // 查找省份
  const province = regionData.find(p => p.label === provinceName);
  if (!province) {
    console.warn(`未找到省份: ${provinceName}`);
    return result;
  }
  result.push(province.value);

  // 如果只需要省份代码
  if (!cityName) {
    return result;
  }

  // 查找城市
  const city = province.children?.find(c => c.label === cityName);
  if (!city) {
    console.warn(`未找到城市: ${cityName}`);
    return result;
  }
  result.push(city.value);

  // 如果只需要省市代码
  if (!districtName) {
    return result;
  }

  // 查找区县
  const district = city.children?.find(d => d.label === districtName);
  if (!district) {
    console.warn(`未找到区县: ${districtName}`);
    return result;
  }
  result.push(district.value);

  return result;
}

/**
 * 根据地区代码查找对应的地区名称
 * @param regionData 地区数据
 * @param codes 地区代码数组 [省代码, 市代码, 区代码]
 * @returns 地区名称对象 {province, city, district}
 */
export function findRegionNames(
  regionData: FrontendRegionItem[],
  codes: string[]
): { province: string; city: string; district: string } {
  const result = { province: '', city: '', district: '' };

  if (!codes || codes.length === 0) {
    return result;
  }

  // 查找省份
  const province = regionData.find(p => p.value === codes[0]);
  if (province) {
    result.province = province.label;

    // 查找城市
    if (codes.length > 1 && province.children) {
      const city = province.children.find(c => c.value === codes[1]);
      if (city) {
        result.city = city.label;

        // 查找区县
        if (codes.length > 2 && city.children) {
          const district = city.children.find(d => d.value === codes[2]);
          if (district) {
            result.district = district.label;
          }
        }
      }
    }
  }

  return result;
}

/**
 * 后端地区数据工具函数
 * 用于处理供应区域等复杂业务场景的地区数据
 */
export class BackendRegionUtils {
  /**
   * 根据地区ID查找地区信息
   * @param regionData 后端地区数据
   * @param id 地区ID
   * @returns 地区信息
   */
  static findById(regionData: BackendRegionItem[], id: number): BackendRegionItem | null {
    for (const item of regionData) {
      if (item.id === id) {
        return item;
      }
      if (item.children) {
        const found = this.findById(item.children, id);
        if (found) return found;
      }
    }
    return null;
  }

  /**
   * 根据地区代码查找地区信息
   * @param regionData 后端地区数据
   * @param areaCode 地区代码
   * @returns 地区信息
   */
  static findByAreaCode(regionData: BackendRegionItem[], areaCode: string): BackendRegionItem | null {
    for (const item of regionData) {
      if (item.areaCode === areaCode) {
        return item;
      }
      if (item.children) {
        const found = this.findByAreaCode(item.children, areaCode);
        if (found) return found;
      }
    }
    return null;
  }

  /**
   * 获取指定级别的地区列表
   * @param regionData 后端地区数据
   * @param level 地区级别（1=省，2=市，3=区）
   * @returns 指定级别的地区列表
   */
  static getByLevel(regionData: BackendRegionItem[], level: number): BackendRegionItem[] {
    const result: BackendRegionItem[] = [];
    
    for (const item of regionData) {
      if (item.level === level) {
        result.push(item);
      }
      if (item.children) {
        result.push(...this.getByLevel(item.children, level));
      }
    }
    
    return result;
  }
}