import { apiClient } from "./client";
import {
  TableCategoryValue,
  CategoryColumn,
} from "@/types/tableCategoryValue";

/**
 * 테이블의 카테고리 컬럼 목록 조회
 */
export async function getCategoryColumns(tableName: string) {
  try {
    const response = await apiClient.get<{
      success: boolean;
      data: CategoryColumn[];
    }>(`/table-categories/${tableName}/columns`);
    return response.data;
  } catch (error: any) {
    console.error("카테고리 컬럼 조회 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 메뉴별 카테고리 컬럼 목록 조회
 * 
 * @param menuObjid 메뉴 OBJID
 * @returns 해당 메뉴와 상위 메뉴들이 설정한 모든 카테고리 컬럼
 */
export async function getCategoryColumnsByMenu(menuObjid: number) {
  try {
    const response = await apiClient.get<{
      success: boolean;
      data: CategoryColumn[];
    }>(`/table-management/menu/${menuObjid}/category-columns`);
    return response.data;
  } catch (error: any) {
    console.error("메뉴별 카테고리 컬럼 조회 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 카테고리 값 목록 조회 (메뉴 스코프)
 * 
 * @param tableName 테이블명
 * @param columnName 컬럼명
 * @param includeInactive 비활성 값 포함 여부
 * @param menuObjid 메뉴 OBJID (선택사항, 제공 시 형제 메뉴의 카테고리 값 포함)
 */
export async function getCategoryValues(
  tableName: string,
  columnName: string,
  includeInactive: boolean = false,
  menuObjid?: number
) {
  try {
    const params: any = { includeInactive };
    if (menuObjid) {
      params.menuObjid = menuObjid;
    }

    const response = await apiClient.get<{
      success: boolean;
      data: TableCategoryValue[];
    }>(`/table-categories/${tableName}/${columnName}/values`, {
      params,
    });
    return response.data;
  } catch (error: any) {
    console.error("카테고리 값 조회 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 카테고리 값 추가 (메뉴 스코프)
 * 
 * @param value 카테고리 값 정보
 * @param menuObjid 메뉴 OBJID (필수)
 */
export async function addCategoryValue(
  value: TableCategoryValue,
  menuObjid: number
) {
  try {
    const response = await apiClient.post<{
      success: boolean;
      data: TableCategoryValue;
    }>("/table-categories/values", {
      ...value,
      menuObjid, // ← menuObjid 포함
    });
    return response.data;
  } catch (error: any) {
    console.error("카테고리 값 추가 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 카테고리 값 수정
 */
export async function updateCategoryValue(
  valueId: number,
  updates: Partial<TableCategoryValue>
) {
  try {
    const response = await apiClient.put<{
      success: boolean;
      data: TableCategoryValue;
    }>(`/table-categories/values/${valueId}`, updates);
    return response.data;
  } catch (error: any) {
    console.error("카테고리 값 수정 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 카테고리 값 삭제
 */
export async function deleteCategoryValue(valueId: number) {
  try {
    const response = await apiClient.delete<{
      success: boolean;
      message: string;
    }>(`/table-categories/values/${valueId}`);
    return response.data;
  } catch (error: any) {
    console.error("카테고리 값 삭제 실패:", error);
    
    // 백엔드에서 반환한 에러 메시지 전달
    const errorMessage = error.response?.data?.message || error.message;
    return { success: false, error: errorMessage, message: errorMessage };
  }
}

/**
 * 카테고리 값 일괄 삭제
 */
export async function bulkDeleteCategoryValues(valueIds: number[]) {
  try {
    const response = await apiClient.post<{
      success: boolean;
      message: string;
    }>("/table-categories/values/bulk-delete", { valueIds });
    return response.data;
  } catch (error: any) {
    console.error("카테고리 값 일괄 삭제 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 카테고리 값 순서 변경
 */
export async function reorderCategoryValues(orderedValueIds: number[]) {
  try {
    const response = await apiClient.post<{
      success: boolean;
      message: string;
    }>("/table-categories/values/reorder", { orderedValueIds });
    return response.data;
  } catch (error: any) {
    console.error("카테고리 값 순서 변경 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 카테고리 코드로 라벨 조회
 * 
 * @param valueCodes - 카테고리 코드 배열 (예: ["CATEGORY_767659DCUF", "CATEGORY_8292565608"])
 * @returns { [code]: label } 형태의 매핑 객체
 */
export async function getCategoryLabelsByCodes(valueCodes: string[]) {
  try {
    if (!valueCodes || valueCodes.length === 0) {
      return { success: true, data: {} };
    }

    const response = await apiClient.post<{
      success: boolean;
      data: Record<string, string>;
    }>("/table-categories/labels-by-codes", { valueCodes });
    return response.data;
  } catch (error: any) {
    console.error("카테고리 라벨 조회 실패:", error);
    return { success: false, error: error.message, data: {} };
  }
}

// ================================================
// 컬럼 매핑 관련 API (논리명 ↔ 물리명)
// ================================================

/**
 * 컬럼 매핑 조회
 * 
 * @param tableName - 테이블명
 * @param menuObjid - 메뉴 OBJID
 * @returns { logical_column: physical_column } 형태의 매핑 객체
 */
export async function getColumnMapping(tableName: string, menuObjid: number) {
  try {
    const response = await apiClient.get<{
      success: boolean;
      data: Record<string, string>;
    }>(`/table-categories/column-mapping/${tableName}/${menuObjid}`);
    return response.data;
  } catch (error: any) {
    console.error("컬럼 매핑 조회 실패:", error);
    return { success: false, error: error.message, data: {} };
  }
}

/**
 * 논리적 컬럼 목록 조회
 * 
 * @param tableName - 테이블명
 * @param menuObjid - 메뉴 OBJID
 * @returns 논리적 컬럼 목록
 */
export async function getLogicalColumns(tableName: string, menuObjid: number) {
  try {
    const response = await apiClient.get<{
      success: boolean;
      data: Array<{
        mappingId: number;
        logicalColumnName: string;
        physicalColumnName: string;
        description?: string;
      }>;
    }>(`/table-categories/logical-columns/${tableName}/${menuObjid}`);
    return response.data;
  } catch (error: any) {
    console.error("논리적 컬럼 목록 조회 실패:", error);
    return { success: false, error: error.message, data: [] };
  }
}

/**
 * 컬럼 매핑 생성/수정
 * 
 * @param data - 컬럼 매핑 정보
 */
export async function createColumnMapping(data: {
  tableName: string;
  logicalColumnName: string;
  physicalColumnName: string;
  menuObjid: number;
  description?: string;
}) {
  try {
    const response = await apiClient.post<{
      success: boolean;
      data: any;
      message: string;
    }>("/table-categories/column-mapping", data);
    return response.data;
  } catch (error: any) {
    console.error("컬럼 매핑 생성 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 컬럼 매핑 삭제
 * 
 * @param mappingId - 매핑 ID
 */
export async function deleteColumnMapping(mappingId: number) {
  try {
    const response = await apiClient.delete<{
      success: boolean;
      message: string;
    }>(`/table-categories/column-mapping/${mappingId}`);
    return response.data;
  } catch (error: any) {
    console.error("컬럼 매핑 삭제 실패:", error);
    return { success: false, error: error.message };
  }
}

/**
 * 테이블+컬럼 기준으로 모든 매핑 삭제
 * 
 * 메뉴 선택 변경 시 기존 매핑을 모두 삭제하고 새로운 매핑만 추가하기 위해 사용
 * 
 * @param tableName - 테이블명
 * @param columnName - 컬럼명
 */
export async function deleteColumnMappingsByColumn(tableName: string, columnName: string) {
  try {
    const response = await apiClient.delete<{
      success: boolean;
      message: string;
      deletedCount: number;
    }>(`/table-categories/column-mapping/${tableName}/${columnName}/all`);
    return response.data;
  } catch (error: any) {
    console.error("테이블+컬럼 기준 매핑 삭제 실패:", error);
    return { success: false, error: error.message, deletedCount: 0 };
  }
}

/**
 * 2레벨 메뉴 목록 조회
 * 
 * 카테고리 컬럼 매핑 생성 시 메뉴 선택용
 * 
 * @returns 2레벨 메뉴 목록
 */
export async function getSecondLevelMenus() {
  try {
    const response = await apiClient.get<{
      success: boolean;
      data: Array<{
        menuObjid: number;
        menuName: string;
        parentMenuName: string;
        screenCode?: string;
      }>;
    }>("/table-categories/second-level-menus");
    return response.data;
  } catch (error: any) {
    console.error("2레벨 메뉴 목록 조회 실패:", error);
    return { success: false, error: error.message, data: [] };
  }
}

