// 레이어 데이터베이스 - API에서 가져옴
import { fetchAllLayers } from '@common/services/api';

export interface Layer {
  id: string;
  parentId: string | null;
  name: string;
  fullName: string;
  level: number;
  wmsLayer: string | null;
  dataTblNm?: string | null;
  icon?: string;
  count?: number;
  children?: Layer[];
}

// 캐시된 레이어 데이터
let cachedLayers: Layer[] | null = null;

// API에서 레이어 가져오기 (캐싱 포함)
export async function getLayersFromAPI(): Promise<Layer[]> {
  if (cachedLayers) {
    return cachedLayers;
  }

  try {
    const layers = await fetchAllLayers();
    cachedLayers = layers;
    return layers;
  } catch (error) {
    console.error('레이어 데이터를 불러오는 중 오류 발생:', error);
    // fallback to empty array if API fails
    return [];
  }
}

// 하드코딩된 레이어 데이터 (fallback용, API 개발 중에만 사용)
export const layerDatabase: Layer[] = [];

// 계층 구조로 변환하는 함수
export function buildLayerTree(layers: Layer[]): Layer[] {
  const layerMap = new Map<string, Layer & { children: Layer[] }>();

  // 모든 레이어를 맵에 추가
  layers.forEach((layer) => {
    layerMap.set(layer.id, { ...layer, children: [] });
  });

  const rootLayers: Layer[] = [];

  // 부모-자식 관계 설정
  layers.forEach((layer) => {
    const layerNode = layerMap.get(layer.id)!;
    if (layer.parentId === null) {
      rootLayers.push(layerNode);
    } else {
      const parent = layerMap.get(layer.parentId);
      if (parent) {
        parent.children.push(layerNode);
      }
    }
  });

  return rootLayers;
}

// WMS 레이어만 필터링하는 함수
export function getWMSLayers(layers: Layer[]): Layer[] {
  return layers.filter((layer) => layer.wmsLayer !== null);
}
