/**
 * SplitPanelLayout 컴포넌트 타입 정의
 */

import { DataFilterConfig, TabInlineComponent } from "@/types/screen-management";

/**
 * 패널 내 인라인 컴포넌트 (커스텀 모드용)
 * TabInlineComponent와 동일한 구조 사용
 */
export type PanelInlineComponent = TabInlineComponent;

/** 페이징 처리 설정 (좌측/우측 패널 공통) */
export interface PaginationConfig {
  enabled: boolean;
  pageSize?: number;
}

/** 페이징 OFF 시 전체 데이터 로드에 사용하는 최대 건수 */
export const MAX_LOAD_ALL_SIZE = 10000;

/**
 * 추가 탭 설정 (우측 패널과 동일한 구조 + tabId, label)
 */
export interface AdditionalTabConfig {
  // 탭 고유 정보
  tabId: string;
  label: string;
  langKeyId?: number; // 탭 라벨 다국어 키 ID
  langKey?: string; // 탭 라벨 다국어 키

  // === 우측 패널과 동일한 설정 ===
  title: string;
  titleLangKeyId?: number; // 탭 제목 다국어 키 ID
  titleLangKey?: string; // 탭 제목 다국어 키
  panelHeaderHeight?: number;
  tableName?: string;
  dataSource?: string;
  displayMode?: "list" | "table";
  showSearch?: boolean;
  showAdd?: boolean;
  showEdit?: boolean;
  showDelete?: boolean;
  summaryColumnCount?: number;
  summaryShowLabel?: boolean;

  columns?: Array<{
    name: string;
    label: string;
    width?: number;
    sortable?: boolean;
    align?: "left" | "center" | "right";
    bold?: boolean;
    showInSummary?: boolean; // 메인 테이블에 표시 여부 (기본: true)
    showInDetail?: boolean; // 상세 정보에 표시 여부 (기본: true)
    format?: {
      type?: "number" | "currency" | "date" | "text";
      thousandSeparator?: boolean;
      decimalPlaces?: number;
      prefix?: string;
      suffix?: string;
      dateFormat?: string;
    };
    // Entity 조인 컬럼 정보
    isEntityJoin?: boolean;
    joinInfo?: {
      sourceTable: string;
      sourceColumn: string;
      referenceTable: string;
      joinAlias: string;
    };
  }>;

  addModalColumns?: Array<{
    name: string;
    label: string;
    required?: boolean;
  }>;

  relation?: {
    type?: "join" | "detail";
    leftColumn?: string;
    rightColumn?: string;
    foreignKey?: string;
    keys?: Array<{
      leftColumn: string;
      rightColumn: string;
    }>;
  };

  addConfig?: {
    targetTable?: string;
    autoFillColumns?: Record<string, any>;
    leftPanelColumn?: string;
    targetColumn?: string;
  };

  tableConfig?: {
    showCheckbox?: boolean;
    showRowNumber?: boolean;
    rowHeight?: number;
    headerHeight?: number;
    striped?: boolean;
    bordered?: boolean;
    hoverable?: boolean;
    stickyHeader?: boolean;
  };

  dataFilter?: DataFilterConfig;

  deduplication?: {
    enabled: boolean;
    groupByColumn: string;
    keepStrategy: "latest" | "earliest" | "base_price" | "current_date";
    sortColumn?: string;
  };

  editButton?: {
    enabled: boolean;
    mode: "auto" | "modal";
    modalScreenId?: number;
    buttonLabel?: string;
    buttonVariant?: "default" | "outline" | "ghost";
    groupByColumns?: string[];
  };

  // 추가 버튼 설정 (모달 화면 연결 지원)
  addButton?: {
    enabled: boolean;
    mode: "auto" | "modal";
    modalScreenId?: number;
    buttonLabel?: string;
  };

  deleteButton?: {
    enabled: boolean;
    buttonLabel?: string;
    buttonVariant?: "default" | "outline" | "ghost" | "destructive";
    confirmMessage?: string;
  };
}

export interface SplitPanelLayoutConfig {
  // 좌측 패널 설정
  leftPanel: {
    title: string;
    langKeyId?: number; // 다국어 키 ID
    langKey?: string; // 다국어 키
    panelHeaderHeight?: number; // 패널 상단 헤더 높이 (px)
    tableName?: string; // 데이터베이스 테이블명
    useCustomTable?: boolean; // 화면 기본 테이블이 아닌 다른 테이블 사용 여부
    customTableName?: string; // 사용자 지정 테이블명 (useCustomTable이 true일 때)
    dataSource?: string; // API 엔드포인트
    displayMode?: "list" | "table" | "custom"; // 표시 모드: 목록, 테이블, 또는 커스텀
    // 🆕 커스텀 모드: 패널 안에 자유롭게 컴포넌트 배치 (탭 컴포넌트와 동일 구조)
    components?: PanelInlineComponent[];
    showSearch?: boolean;
    showAdd?: boolean;
    showEdit?: boolean; // 수정 버튼
    showDelete?: boolean; // 삭제 버튼

    // 수정 버튼 설정 (모달 화면 연결 지원)
    editButton?: {
      enabled: boolean;
      mode: "auto" | "modal"; // auto: 내장 편집, modal: 커스텀 모달 화면
      modalScreenId?: number; // 모달로 열 화면 ID (mode: "modal"일 때)
      buttonLabel?: string; // 버튼 라벨 (기본: "수정")
    };

    // 추가 버튼 설정 (모달 화면 연결 지원)
    addButton?: {
      enabled: boolean;
      mode: "auto" | "modal";
      modalScreenId?: number;
      buttonLabel?: string;
    };

    columns?: Array<{
      name: string;
      label: string;
      width?: number;
      sortable?: boolean; // 정렬 가능 여부 (테이블 모드)
      align?: "left" | "center" | "right"; // 정렬 (테이블 모드)
      format?: {
        type?: "number" | "currency" | "date" | "text"; // 포맷 타입
        thousandSeparator?: boolean; // 천 단위 구분자 (type: "number" | "currency")
        decimalPlaces?: number; // 소수점 자릿수
        prefix?: string; // 접두사 (예: "₩", "$")
        suffix?: string; // 접미사 (예: "원", "개")
        dateFormat?: string; // 날짜 포맷 (type: "date")
      };
      // Entity 조인 컬럼 정보
      isEntityJoin?: boolean;
      joinInfo?: {
        sourceTable: string;
        sourceColumn: string;
        referenceTable: string;
        joinAlias: string;
      };
    }>;
    // 추가 모달에서 입력받을 컬럼 설정
    addModalColumns?: Array<{
      name: string;
      label: string;
      required?: boolean;
    }>;
    // 각 항목에 + 버튼 표시 (하위 항목 추가)
    showItemAddButton?: boolean;
    // + 버튼 클릭 시 하위 항목 추가를 위한 설정
    itemAddConfig?: {
      // 하위 항목 추가 모달에서 입력받을 컬럼
      addModalColumns?: Array<{
        name: string;
        label: string;
        required?: boolean;
      }>;
      // 상위 항목의 ID를 저장할 컬럼 (예: parent_dept_code)
      parentColumn: string;
      // 현재 항목의 어떤 컬럼 값을 parentColumn에 넣을지 (예: dept_code)
      sourceColumn: string;
    };
    // 테이블 모드 설정
    tableConfig?: {
      showCheckbox?: boolean; // 체크박스 표시 여부
      showRowNumber?: boolean; // 행 번호 표시 여부
      rowHeight?: number; // 행 높이
      headerHeight?: number; // 헤더 높이
      striped?: boolean; // 줄무늬 배경
      bordered?: boolean; // 테두리 표시
      hoverable?: boolean; // 호버 효과
      stickyHeader?: boolean; // 헤더 고정
    };

    // 🆕 컬럼 값 기반 데이터 필터링
    dataFilter?: DataFilterConfig;

    pagination?: PaginationConfig;
  };

  // 우측 패널 설정
  rightPanel: {
    title: string;
    langKeyId?: number; // 다국어 키 ID
    langKey?: string; // 다국어 키
    panelHeaderHeight?: number; // 패널 상단 헤더 높이 (px)
    tableName?: string;
    useCustomTable?: boolean; // 화면 기본 테이블이 아닌 다른 테이블 사용 여부
    customTableName?: string; // 사용자 지정 테이블명 (useCustomTable이 true일 때)
    dataSource?: string;
    displayMode?: "list" | "table" | "custom"; // 표시 모드: 목록, 테이블, 또는 커스텀
    alwaysShow?: boolean; // true면 좌측 선택 없이도 우측 패널 항상 표시
    // 🆕 커스텀 모드: 패널 안에 자유롭게 컴포넌트 배치 (탭 컴포넌트와 동일 구조)
    components?: PanelInlineComponent[];
    showSearch?: boolean;
    showAdd?: boolean;
    showEdit?: boolean; // 수정 버튼
    showDelete?: boolean; // 삭제 버튼
    summaryColumnCount?: number; // 요약에서 표시할 컬럼 개수 (기본: 3)
    summaryShowLabel?: boolean; // 요약에서 라벨 표시 여부 (기본: true)
    columns?: Array<{
      name: string;
      label: string;
      width?: number;
      sortable?: boolean; // 정렬 가능 여부 (테이블 모드)
      align?: "left" | "center" | "right"; // 정렬 (테이블 모드)
      bold?: boolean; // 요약에서 값 굵게 표시 여부 (LIST 모드)
      showInSummary?: boolean; // 메인 테이블에 표시 여부 (기본: true)
      showInDetail?: boolean; // 상세 정보에 표시 여부 (기본: true)
      format?: {
        type?: "number" | "currency" | "date" | "text"; // 포맷 타입
        thousandSeparator?: boolean; // 천 단위 구분자 (type: "number" | "currency")
        decimalPlaces?: number; // 소수점 자릿수
        prefix?: string; // 접두사 (예: "₩", "$")
        suffix?: string; // 접미사 (예: "원", "개")
        dateFormat?: string; // 날짜 포맷 (type: "date")
      };
      // Entity 조인 컬럼 정보
      isEntityJoin?: boolean;
      joinInfo?: {
        sourceTable: string;
        sourceColumn: string;
        referenceTable: string;
        joinAlias: string;
      };
    }>;
    // 추가 모달에서 입력받을 컬럼 설정
    addModalColumns?: Array<{
      name: string;
      label: string;
      required?: boolean;
    }>;

    // 좌측 선택 항목과의 관계 설정
    relation?: {
      type?: "join" | "detail"; // 관계 타입 (optional - 하위 호환성)
      leftColumn?: string; // 좌측 테이블의 연결 컬럼 (단일키 - 하위 호환성)
      rightColumn?: string; // 우측 테이블의 연결 컬럼 (단일키 - 하위 호환성)
      foreignKey?: string; // 우측 테이블의 외래키 컬럼명
      // 🆕 복합키 지원 (여러 컬럼으로 조인)
      keys?: Array<{
        leftColumn: string; // 좌측 테이블의 조인 컬럼
        rightColumn: string; // 우측 테이블의 조인 컬럼
      }>;
    };

    // 우측 패널 추가 시 중계 테이블 설정 (N:M 관계)
    addConfig?: {
      targetTable?: string; // 실제로 INSERT할 테이블 (중계 테이블)
      autoFillColumns?: Record<string, any>; // 자동으로 채워질 컬럼과 기본값
      leftPanelColumn?: string; // 좌측 패널의 어떤 컬럼값을 가져올지
      targetColumn?: string; // targetTable의 어떤 컬럼에 넣을지
    };

    // 테이블 모드 설정
    tableConfig?: {
      showCheckbox?: boolean; // 체크박스 표시 여부
      showRowNumber?: boolean; // 행 번호 표시 여부
      rowHeight?: number; // 행 높이
      headerHeight?: number; // 헤더 높이
      striped?: boolean; // 줄무늬 배경
      bordered?: boolean; // 테두리 표시
      hoverable?: boolean; // 호버 효과
      stickyHeader?: boolean; // 헤더 고정
    };

    // 🆕 컬럼 값 기반 데이터 필터링
    dataFilter?: DataFilterConfig;

    // 🆕 중복 제거 설정
    deduplication?: {
      enabled: boolean; // 중복 제거 활성화
      groupByColumn: string; // 중복 제거 기준 컬럼 (예: "item_id")
      keepStrategy: "latest" | "earliest" | "base_price" | "current_date"; // 어떤 행을 유지할지
      sortColumn?: string; // keepStrategy가 latest/earliest일 때 정렬 기준 컬럼
    };

    // 🆕 수정 버튼 설정
    editButton?: {
      enabled: boolean; // 수정 버튼 표시 여부 (기본: true)
      mode: "auto" | "modal"; // auto: 자동 편집 (인라인), modal: 커스텀 모달
      modalScreenId?: number; // 모달로 열 화면 ID (mode: "modal"일 때)
      buttonLabel?: string; // 버튼 라벨 (기본: "수정")
      buttonVariant?: "default" | "outline" | "ghost"; // 버튼 스타일 (기본: "outline")
      groupByColumns?: string[]; // 🆕 그룹핑 기준 컬럼들 (예: ["customer_id", "item_id"])
    };

    // 🆕 추가 버튼 설정 (모달 화면 연결 지원)
    addButton?: {
      enabled: boolean;
      mode: "auto" | "modal";
      modalScreenId?: number;
      buttonLabel?: string;
    };

    // 🆕 삭제 버튼 설정
    deleteButton?: {
      enabled: boolean; // 삭제 버튼 표시 여부 (기본: true)
      buttonLabel?: string; // 버튼 라벨 (기본: "삭제")
      buttonVariant?: "default" | "outline" | "ghost" | "destructive"; // 버튼 스타일 (기본: "ghost")
      confirmMessage?: string; // 삭제 확인 메시지
    };

    // 🆕 추가 탭 설정 (멀티 테이블 탭)
    additionalTabs?: AdditionalTabConfig[];

    pagination?: PaginationConfig;
  };

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

  // 동작 설정
  autoLoad?: boolean; // 자동 데이터 로드
  syncSelection?: boolean; // 선택 항목 동기화
}
