/**
 * SplitPanelLayout2 컴포넌트 타입 정의
 * 마스터-디테일 패턴의 좌우 분할 레이아웃 (개선 버전)
 */

// =============================================================================
// 값 소스 및 연동 설정
// =============================================================================

/**
 * 값 소스 설정 (화면 내 필드/폼에서 값 가져오기)
 */
export interface ValueSourceConfig {
  type: "none" | "field" | "dataForm" | "component"; // 소스 유형
  fieldId?: string; // 필드 컴포넌트 ID
  formId?: string; // 데이터폼 ID
  formFieldName?: string; // 데이터폼 내 필드명
  componentId?: string; // 다른 컴포넌트 ID
  componentColumn?: string; // 컴포넌트에서 참조할 컬럼
}

/**
 * 엔티티 참조 설정 (엔티티에서 표시할 값 선택)
 */
export interface EntityReferenceConfig {
  entityId?: string; // 연결된 엔티티 ID
  displayColumns?: string[]; // 표시할 엔티티 컬럼들 (체크박스 선택)
  primaryDisplayColumn?: string; // 주 표시 컬럼
}

// =============================================================================
// 컬럼 표시 설정
// =============================================================================

/**
 * 컬럼별 표시 설정 (그룹핑 시 사용)
 */
export interface ColumnDisplayConfig {
  displayType: "text" | "badge"; // 표시 방식 (텍스트 또는 배지)
  aggregate?: {
    enabled: boolean; // 집계 사용 여부
    function: "DISTINCT" | "COUNT"; // 집계 방식 (중복제거 또는 개수)
  };
}

/**
 * 그룹핑 설정 (왼쪽 패널용)
 */
export interface GroupingConfig {
  enabled: boolean; // 그룹핑 사용 여부
  groupByColumn: string; // 그룹 기준 컬럼 (예: item_id)
}

/**
 * 탭 설정
 */
export interface TabConfig {
  enabled: boolean; // 탭 사용 여부
  mode?: "auto" | "manual"; // 하위 호환성용 (실제로는 manual만 사용)
  tabSourceColumn?: string; // 탭 생성 기준 컬럼
  showCount?: boolean; // 탭에 항목 개수 표시 여부
  defaultTab?: string; // 기본 선택 탭 (값 또는 ID)
}

/**
 * 컬럼 설정
 */
export interface ColumnConfig {
  name: string; // 컬럼명
  label: string; // 표시 라벨
  sourceTable?: string; // 소스 테이블명 (메인 테이블 또는 조인 테이블)
  displayRow?: "name" | "info"; // 표시 위치 (name: 이름 행, info: 정보 행)
  width?: number; // 너비 (px)
  bold?: boolean; // 굵게 표시
  displayConfig?: ColumnDisplayConfig; // 컬럼별 표시 설정 (그룹핑 시)
  entityReference?: EntityReferenceConfig; // 엔티티 참조 설정
  valueSource?: ValueSourceConfig; // 값 소스 설정 (화면 내 연동)
  format?: {
    type?: "text" | "number" | "currency" | "date";
    thousandSeparator?: boolean;
    decimalPlaces?: number;
    prefix?: string;
    suffix?: string;
    dateFormat?: string;
  };
}

/**
 * 모달 파라미터 매핑 설정
 */
export interface ModalParamMapping {
  sourceColumn: string; // 선택된 항목에서 가져올 컬럼
  targetParam: string; // 모달에 전달할 파라미터명
}

/**
 * 액션 버튼 설정
 */
export interface ActionButtonConfig {
  id: string; // 고유 ID
  label: string; // 버튼 라벨
  variant?: "default" | "secondary" | "outline" | "destructive" | "ghost"; // 버튼 스타일
  icon?: string; // lucide 아이콘명 (예: "Plus", "Edit", "Trash2")
  showCondition?: "always" | "selected" | "notSelected"; // 표시 조건
  action?: "add" | "edit" | "delete" | "bulk-delete" | "api" | "custom"; // 버튼 동작 유형

  // 모달 관련
  modalScreenId?: number; // 연결할 모달 화면 ID
  modalParams?: ModalParamMapping[]; // 모달에 전달할 파라미터 매핑

  // API 호출 관련
  apiEndpoint?: string; // API 엔드포인트
  apiMethod?: "GET" | "POST" | "PUT" | "DELETE"; // HTTP 메서드
  confirmMessage?: string; // 확인 메시지 (삭제 등)

  // 커스텀 액션
  customActionId?: string; // 커스텀 액션 식별자
}

/**
 * 데이터 전달 필드 설정
 */
export interface DataTransferField {
  sourceColumn: string; // 소스 패널의 컬럼명
  targetColumn: string; // 모달로 전달할 컬럼명
  label?: string; // 표시용 라벨
}

/**
 * 버튼별 데이터 전달 설정
 * 특정 패널의 특정 버튼에 어떤 데이터를 전달할지 설정
 */
export interface ButtonDataTransferConfig {
  id: string; // 고유 ID
  targetPanel: "left" | "right"; // 대상 패널
  targetButtonId: string; // 대상 버튼 ID
  fields: DataTransferField[]; // 전달할 필드 목록
}

/**
 * 검색 컬럼 설정
 */
export interface SearchColumnConfig {
  columnName: string; // 검색 대상 컬럼명
  label?: string; // 표시 라벨 (없으면 컬럼명 사용)
}

/**
 * 좌측 패널 설정
 */
export interface LeftPanelConfig {
  title?: string; // 패널 제목
  tableName: string; // 테이블명
  displayColumns: ColumnConfig[]; // 표시할 컬럼들
  searchColumn?: string; // 검색 대상 컬럼 (단일, 하위 호환성)
  searchColumns?: SearchColumnConfig[]; // 검색 대상 컬럼들 (복수)
  showSearch?: boolean; // 검색 표시 여부
  showAddButton?: boolean; // 추가 버튼 표시 (하위 호환성)
  addButtonLabel?: string; // 추가 버튼 라벨 (하위 호환성)
  addModalScreenId?: number; // 추가 모달 화면 ID (하위 호환성)
  showEditButton?: boolean; // 수정 버튼 표시
  showDeleteButton?: boolean; // 삭제 버튼 표시
  editModalScreenId?: number; // 수정 모달 화면 ID
  actionButtons?: ActionButtonConfig[]; // 복수 액션 버튼 배열
  displayMode?: "card" | "table"; // 표시 모드 (card: 카드형, table: 테이블형)
  primaryKeyColumn?: string; // 기본키 컬럼명 (선택용, 기본: id)
  // 계층 구조 설정
  hierarchyConfig?: {
    enabled: boolean;
    parentColumn: string; // 부모 참조 컬럼 (예: parent_dept_code)
    idColumn: string; // ID 컬럼 (예: dept_code)
  };
  // 그룹핑 설정
  grouping?: GroupingConfig;
  // 탭 설정
  tabConfig?: TabConfig;
  // 추가 조인 테이블 설정 (다른 테이블 참조하여 컬럼 추가 표시)
  joinTables?: JoinTableConfig[];
}

/**
 * 우측 패널 설정
 */
export interface RightPanelConfig {
  title?: string; // 패널 제목
  tableName: string; // 테이블명
  displayColumns: ColumnConfig[]; // 표시할 컬럼들
  searchColumn?: string; // 검색 대상 컬럼 (단일, 하위 호환성)
  searchColumns?: SearchColumnConfig[]; // 검색 대상 컬럼들 (복수)
  showSearch?: boolean; // 검색 표시 여부
  showAddButton?: boolean; // 추가 버튼 표시 (하위 호환성)
  addButtonLabel?: string; // 추가 버튼 라벨 (하위 호환성)
  addModalScreenId?: number; // 추가 모달 화면 ID (하위 호환성)
  showEditButton?: boolean; // 수정 버튼 표시 (하위 호환성)
  showDeleteButton?: boolean; // 삭제 버튼 표시 (하위 호환성)
  editModalScreenId?: number; // 수정 모달 화면 ID
  displayMode?: "card" | "table"; // 표시 모드 (card: 카드형, table: 테이블형)
  showLabels?: boolean; // 카드 모드에서 라벨 표시 여부 (라벨: 값 형식)
  showCheckbox?: boolean; // 체크박스 표시 여부 (테이블 모드에서 일괄 선택용)
  actionButtons?: ActionButtonConfig[]; // 복수 액션 버튼 배열
  primaryKeyColumn?: string; // 기본키 컬럼명 (수정/삭제용, 기본: id)
  emptyMessage?: string; // 데이터 없을 때 메시지

  /**
   * 추가 조인 테이블 설정
   * 메인 테이블에 다른 테이블을 JOIN하여 추가 정보를 함께 표시합니다.
   *
   * 사용 예시:
   * - 메인 테이블: user_dept (부서-사용자 관계)
   * - 조인 테이블: user_info (사용자 개인정보)
   * - 결과: 부서별 사원 목록에 이메일, 전화번호 등 개인정보 함께 표시
   */
  joinTables?: JoinTableConfig[];
  
  /**
   * 수정 시 메인 테이블 데이터 조회 설정
   * 우측 패널이 서브 테이블(예: user_dept)이고, 수정 모달이 메인 테이블(예: user_info) 기준일 때
   * 수정 버튼 클릭 시 메인 테이블 데이터를 함께 조회하여 모달에 전달합니다.
   */
  mainTableForEdit?: {
    tableName: string; // 메인 테이블명 (예: user_info)
    linkColumn: {
      mainColumn: string; // 메인 테이블의 연결 컬럼 (예: user_id)
      subColumn: string; // 서브 테이블의 연결 컬럼 (예: user_id)
    };
  };
  
  // 탭 설정
  tabConfig?: TabConfig;
}

/**
 * 조인 키 설정 (복합키 지원)
 */
export interface JoinKey {
  leftColumn: string; // 좌측 테이블의 조인 컬럼
  rightColumn: string; // 우측 테이블의 조인 컬럼
}

/**
 * 조인 설정
 */
export interface JoinConfig {
  leftColumn?: string; // 좌측 테이블의 조인 컬럼 (단일키 - 하위 호환성)
  rightColumn?: string; // 우측 테이블의 조인 컬럼 (단일키 - 하위 호환성)
  keys?: JoinKey[]; // 복합키 지원 (여러 컬럼으로 조인)
}

/**
 * 추가 조인 테이블 설정
 * 우측 패널의 메인 테이블에 다른 테이블을 JOIN하여 추가 컬럼을 가져옵니다.
 *
 * 예시: user_dept (메인) + user_info (조인) → 부서관계 + 개인정보 함께 표시
 *
 * - joinTable: 조인할 테이블명 (예: user_info)
 * - joinType: 조인 방식 (LEFT JOIN 권장)
 * - mainColumn: 메인 테이블의 조인 컬럼 (예: user_id)
 * - joinColumn: 조인 테이블의 조인 컬럼 (예: user_id)
 * - selectColumns: 조인 테이블에서 가져올 컬럼들 (예: email, cell_phone)
 */
export interface JoinTableConfig {
  joinTable: string; // 조인할 테이블명
  joinType: "LEFT" | "INNER"; // 조인 타입 (LEFT: 없어도 표시, INNER: 있어야만 표시)
  mainColumn: string; // 메인 테이블의 조인 컬럼
  joinColumn: string; // 조인 테이블의 조인 컬럼
  selectColumns: string[]; // 조인 테이블에서 가져올 컬럼들
  alias?: string; // 테이블 별칭 (중복 컬럼명 구분용)
}

/**
 * 메인 설정
 */
export interface SplitPanelLayout2Config {
  // 패널 설정
  leftPanel: LeftPanelConfig;
  rightPanel: RightPanelConfig;

  // 조인 설정
  joinConfig: JoinConfig;

  // 데이터 전달 설정 (하위 호환성 - 기본 설정)
  dataTransferFields?: DataTransferField[];

  // 버튼별 데이터 전달 설정 (신규)
  buttonDataTransfers?: ButtonDataTransferConfig[];

  // 레이아웃 설정
  splitRatio?: number; // 좌우 비율 (0-100, 기본 30)
  resizable?: boolean; // 크기 조절 가능 여부
  minLeftWidth?: number; // 좌측 최소 너비 (px)
  minRightWidth?: number; // 우측 최소 너비 (px)

  // 동작 설정
  autoLoad?: boolean; // 자동 데이터 로드
}
