import axios from 'axios';

export const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:3001/api';

export const api = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
  },
  withCredentials: true, // JWT 쿠키 자동 포함
  timeout: 30000, // 30초 타임아웃
  maxContentLength: 10 * 1024 * 1024, // 응답 최대 10MB
  maxBodyLength: 1 * 1024 * 1024, // 요청 최대 1MB
});

// 응답 인터셉터: 민감한 에러 정보 노출 최소화 + 401 세션 만료 처리
api.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response) {
      const { status, data } = error.response;

      // 401: 인증 만료 → 로그아웃 처리 (로그인 요청 제외)
      if (status === 401 && !error.config?.url?.includes('/auth/login')) {
        import('../store/authStore').then(({ useAuthStore }) => {
          const { isAuthenticated } = useAuthStore.getState();
          if (isAuthenticated) {
            useAuthStore.getState().logout();
          }
        });
      }

      return Promise.reject({
        status,
        message: data?.error || data?.message || '요청 처리 중 오류가 발생했습니다.',
      });
    }
    return Promise.reject({ status: 0, message: '서버에 연결할 수 없습니다.' });
  },
);

export interface LayerDTO {
  cmn_cd: string;
  up_cmn_cd: string | null;
  cmn_cd_full_nm: string;
  cmn_cd_nm: string;
  cmn_cd_level: number;
  clnm: string | null;
  data_tbl_nm?: string | null;
  icon?: string;
  count?: number;
  children?: LayerDTO[];
}

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[];
}

// DTO를 Layer로 변환 (재귀적으로 children도 변환)
function convertToLayer(dto: LayerDTO): Layer {
  return {
    id: dto.cmn_cd,
    parentId: dto.up_cmn_cd,
    name: dto.cmn_cd_nm,
    fullName: dto.cmn_cd_full_nm,
    level: dto.cmn_cd_level,
    wmsLayer: dto.clnm,
    dataTblNm: dto.data_tbl_nm,
    icon: dto.icon,
    count: dto.count,
    children: dto.children ? dto.children.map(convertToLayer) : undefined,
  };
}

// 모든 레이어 조회
export async function fetchAllLayers(): Promise<Layer[]> {
  const response = await api.get<LayerDTO[]>('/layers');
  return response.data.map(convertToLayer);
}

// 계층 구조 레이어 트리 조회
export async function fetchLayerTree(): Promise<Layer[]> {
  const response = await api.get<LayerDTO[]>('/layers/tree/all');
  return response.data.map(convertToLayer);
}

// WMS 레이어만 조회
export async function fetchWMSLayers(): Promise<Layer[]> {
  const response = await api.get<LayerDTO[]>('/layers/wms/all');
  return response.data.map(convertToLayer);
}

// 특정 레이어 조회
export async function fetchLayer(id: string): Promise<Layer> {
  const response = await api.get<LayerDTO>(`/layers/${id}`);
  return convertToLayer(response.data);
}

// 특정 레벨의 레이어 조회
export async function fetchLayersByLevel(level: number): Promise<Layer[]> {
  const response = await api.get<LayerDTO[]>(`/layers/level/${level}`);
  return response.data.map(convertToLayer);
}

// 특정 부모의 자식 레이어 조회
export async function fetchChildrenLayers(parentId: string): Promise<Layer[]> {
  const response = await api.get<LayerDTO[]>(`/layers/children/${parentId}`);
  return response.data.map(convertToLayer);
}
