/**
 * 🎯 통합 핵심 타입 정의
 *
 * 모든 시스템에서 공통으로 사용하는 핵심 타입들을 중앙집중식으로 관리합니다.
 * - 화면관리 시스템
 * - 제어관리 시스템
 * - 테이블 타입관리 시스템
 */

// ===== 핵심 공통 타입들 =====

/**
 * 통합 WebType 정의
 * 모든 시스템에서 사용하는 웹 입력 타입의 표준 정의
 */
export type WebType =
  // 기본 텍스트 입력
  | "text"
  | "textarea"
  | "email"
  | "tel"
  | "url"
  // 숫자 입력
  | "number"
  | "decimal"
  | "percentage"
  | "currency"
  // 날짜/시간 입력
  | "date"
  | "datetime"
  | "month"
  | "year"
  | "time"
  | "daterange"
  // 선택 입력
  | "select"
  | "dropdown"
  | "radio"
  | "radio-horizontal"
  | "radio-vertical"
  | "checkbox"
  | "checkbox-group"
  | "boolean"
  | "multiselect"
  | "autocomplete"
  // 특수 입력
  | "code" // 공통코드 참조
  | "code-radio" // 공통코드 라디오
  | "code-autocomplete" // 공통코드 자동완성
  | "entity" // 엔티티 참조
  | "file" // 파일 업로드
  | "image" // 이미지 표시
  | "password" // 비밀번호
  | "button" // 버튼 컴포넌트
  | "category" // 카테고리
  | "component" // 컴포넌트 참조
  | "form" // 폼
  | "table" // 테이블
  | "array" // 배열
  // 레이아웃/컨테이너 타입
  | "container" // 컨테이너
  | "group" // 그룹
  | "list" // 목록
  | "tree" // 트리
  | "custom"; // 커스텀 컴포넌트

/**
 * 동적 WebType 지원
 * DB에서 동적으로 로드되는 웹타입도 지원
 */
export type DynamicWebType = WebType | string;

/**
 * 통합 ButtonActionType 정의
 * 모든 버튼 액션 타입의 표준 정의
 */
export type ButtonActionType =
  // 데이터 조작
  | "save"
  | "cancel"
  | "delete"
  | "edit"
  | "copy" // 복사 (품목코드 초기화)
  | "add"
  // 검색 및 초기화
  | "search"
  | "reset"
  | "submit"
  // UI 제어
  | "close"
  | "popup"
  | "modal"
  // 네비게이션
  | "navigate"
  | "newWindow"
  // 제어관리 전용
  | "control"
  // 데이터 전달
  | "transferData" // 선택된 데이터를 다른 컴포넌트/화면으로 전달
  // 즉시 저장
  | "quickInsert" // 선택한 데이터를 특정 테이블에 즉시 INSERT
  // 결재 워크플로우
  | "approval"; // 결재 요청을 생성합니다

/**
 * 컴포넌트 타입 정의
 */
export type ComponentType =
  | "container"
  | "row"
  | "column"
  | "widget"
  | "group"
  | "datatable"
  | "file"
  | "area"
  | "layout"
  | "flow"
  | "component"
  | "tabs";

/**
 * 기본 위치 정보
 */
export interface Position {
  x: number;
  y: number;
  z?: number;
}

/**
 * 기본 크기 정보
 */
export interface Size {
  width: number;
  height: number;
}

/**
 * 공통 스타일 속성
 */
export interface CommonStyle {
  // 여백
  margin?: string;
  marginTop?: string;
  marginRight?: string;
  marginBottom?: string;
  marginLeft?: string;
  padding?: string;
  paddingTop?: string;
  paddingRight?: string;
  paddingBottom?: string;
  paddingLeft?: string;

  // 테두리
  border?: string;
  borderWidth?: string;
  borderStyle?: string;
  borderColor?: string;
  borderRadius?: string;

  // 배경
  backgroundColor?: string;
  backgroundImage?: string;

  // 텍스트
  color?: string;
  fontSize?: string;
  fontWeight?: string;
  fontFamily?: string;
  textAlign?: "left" | "center" | "right" | "justify";
  lineHeight?: string;

  // 라벨 스타일
  labelDisplay?: boolean; // 라벨 표시 여부
  labelText?: string; // 라벨 텍스트
  labelPosition?: "top" | "left" | "right" | "bottom"; // 라벨 위치 (기본: top)
  labelFontSize?: string;
  labelColor?: string;
  labelFontWeight?: string;
  labelMarginBottom?: string;
  labelGap?: string; // 라벨-위젯 간격 (좌/우 배치 시 사용)

  // 레이아웃
  display?: string;
  width?: string;
  height?: string;
  minWidth?: string;
  minHeight?: string;
  maxWidth?: string;
  maxHeight?: string;

  // 기타
  opacity?: string;
  zIndex?: string;
  overflow?: "visible" | "hidden" | "scroll" | "auto";
}

/**
 * 검증 규칙
 */
export interface ValidationRule {
  type: "required" | "minLength" | "maxLength" | "pattern" | "min" | "max" | "email" | "url";
  value?: unknown;
  message: string;
}

/**
 * 조건 연산자
 */
export type ConditionOperator =
  | "="
  | "!="
  | ">"
  | "<"
  | ">="
  | "<="
  | "LIKE"
  | "IN"
  | "NOT IN"
  | "IS NULL"
  | "IS NOT NULL";

/**
 * 기본 API 응답 형태
 */
export interface BaseApiResponse<T = unknown> {
  success: boolean;
  data?: T;
  message?: string;
  error?: {
    code: string;
    message: string;
    details?: unknown;
  };
}

/**
 * 페이지네이션 응답
 */
export interface PaginatedResponse<T> {
  data: T[];
  total: number;
  page: number;
  size: number;
  totalPages: number;
}

/**
 * 회사 코드 (모든 데이터에 공통)
 */
export type CompanyCode = string;

/**
 * 활성 상태 (DB의 Y/N을 boolean으로 변환)
 */
export type ActiveStatus = "Y" | "N";

/**
 * boolean으로 변환하는 유틸리티 타입
 */
export type BooleanFromYN<T extends ActiveStatus> = T extends "Y" ? true : false;

// ===== 공통 유틸리티 타입들 =====

/**
 * 선택적 ID (신규 생성 시에는 없고, 기존 데이터는 있음)
 */
export type OptionalId<T> = Omit<T, "id"> & { id?: string | number };

/**
 * 타임스탬프 필드
 */
export interface TimestampFields {
  createdDate?: Date;
  updatedDate?: Date;
  createdBy?: string;
  updatedBy?: string;
}

/**
 * 감사 필드 (DB 표준)
 */
export interface AuditFields {
  created_date?: Date;
  updated_date?: Date;
  created_by?: string;
  updated_by?: string;
  is_active?: ActiveStatus;
}

// ===== 이벤트 타입들 =====

/**
 * 웹타입 이벤트
 */
export interface WebTypeEvent {
  type: "change" | "blur" | "focus" | "click" | "submit";
  value: unknown;
  field?: string;
  component?: unknown;
}

/**
 * 컴포넌트 이벤트
 */
export interface ComponentEvent {
  type: "select" | "drag" | "drop" | "resize" | "delete" | "update";
  componentId: string;
  data?: unknown;
}

// ===== 타입 가드용 유틸리티 =====

/**
 * 문자열이 WebType인지 확인
 */
export const isWebType = (value: string): value is WebType => {
  const webTypes: WebType[] = [
    "text",
    "textarea",
    "email",
    "tel",
    "url",
    "number",
    "decimal",
    "date",
    "datetime",
    "select",
    "dropdown",
    "radio",
    "checkbox",
    "boolean",
    "code",
    "entity",
    "file",
    "button",
  ];
  return webTypes.includes(value as WebType);
};

/**
 * 문자열이 ButtonActionType인지 확인
 */
export const isButtonActionType = (value: string): value is ButtonActionType => {
  const actionTypes: ButtonActionType[] = [
    "save",
    "cancel",
    "delete",
    "edit",
    "add",
    "search",
    "reset",
    "submit",
    "close",
    "popup",
    "modal",
    "navigate",
    "newWindow",
    "control",
    "transferData",
    "quickInsert",
    "approval",
  ];
  return actionTypes.includes(value as ButtonActionType);
};

/**
 * 문자열이 ComponentType인지 확인
 */
export const isComponentType = (value: string): value is ComponentType => {
  const componentTypes: ComponentType[] = [
    "container",
    "row",
    "column",
    "widget",
    "group",
    "datatable",
    "file",
    "area",
    "layout",
  ];
  return componentTypes.includes(value as ComponentType);
};

/**
 * Y/N 문자열을 boolean으로 변환
 */
export const ynToBoolean = (value: ActiveStatus | string | undefined): boolean => {
  return value === "Y";
};

/**
 * boolean을 Y/N 문자열로 변환
 */
export const booleanToYN = (value: boolean): ActiveStatus => {
  return value ? "Y" : "N";
};
