/**
 * 데이터 매핑 관련 타입 정의
 */

export type DataDirection = "none" | "inbound" | "outbound" | "bidirectional";
export type InsertMode = "insert" | "upsert" | "update";
export type TransformType = "none" | "constant" | "format" | "function";
export type DataType = "string" | "number" | "boolean" | "date" | "json";

/**
 * 필드 변환 설정
 */
export interface FieldTransform {
  type: TransformType;
  value?: any;
  format?: string; // 날짜 포맷 등 (예: "YYYY-MM-DD")
  functionName?: string; // 커스텀 변환 함수명
}

/**
 * 필드 매핑 정보
 */
export interface FieldMapping {
  id: string; // 매핑 고유 ID
  sourceField: string; // 소스 필드명 (외부 API 또는 내부 테이블)
  targetField: string; // 타겟 필드명 (내부 테이블 또는 외부 API)
  dataType: DataType;
  transform?: FieldTransform;
  required?: boolean;
  defaultValue?: any;
}

/**
 * Inbound 매핑 설정 (외부 → 내부)
 */
export interface InboundMapping {
  targetTable: string;
  targetSchema?: string;
  fieldMappings: FieldMapping[];
  insertMode: InsertMode;
  keyFields?: string[]; // upsert/update 시 키 필드
  batchSize?: number; // 배치 처리 크기
}

/**
 * Outbound 매핑 설정 (내부 → 외부)
 */
export interface OutboundMapping {
  sourceTable: string;
  sourceSchema?: string;
  sourceFilter?: string; // WHERE 조건
  fieldMappings: FieldMapping[];
  triggerCondition?: string; // 트리거 조건
}

/**
 * 전체 데이터 매핑 설정
 */
export interface DataMappingConfig {
  direction: DataDirection;
  inboundMapping?: InboundMapping;
  outboundMapping?: OutboundMapping;
}

/**
 * 테이블 정보
 */
export interface TableInfo {
  name: string;
  schema?: string;
  displayName?: string;
  fields: FieldInfo[];
}

/**
 * 필드 정보
 */
export interface FieldInfo {
  name: string;
  dataType: DataType;
  nullable: boolean;
  isPrimaryKey?: boolean;
  displayName?: string;
  description?: string;
}

/**
 * 데이터 매핑 실행 결과
 */
export interface DataMappingResult {
  success: boolean;
  direction: DataDirection;
  recordsProcessed?: number;
  recordsInserted?: number;
  recordsUpdated?: number;
  recordsSkipped?: number;
  errors?: string[];
  executionTime: number;
  timestamp: string;
}

/**
 * 매핑 검증 결과
 */
export interface MappingValidationResult {
  isValid: boolean;
  errors: string[];
  warnings: string[];
}

/**
 * 프리셋 매핑 템플릿
 */
export interface MappingTemplate {
  id: string;
  name: string;
  description: string;
  direction: DataDirection;
  config: DataMappingConfig;
  tags?: string[];
}

// 상수 정의
export const DATA_DIRECTION_OPTIONS = [
  { value: "none", label: "매핑 없음" },
  { value: "inbound", label: "외부 → 내부 (GET)" },
  { value: "outbound", label: "내부 → 외부 (POST)" },
  { value: "bidirectional", label: "양방향" },
] as const;

export const INSERT_MODE_OPTIONS = [
  { value: "insert", label: "삽입만" },
  { value: "upsert", label: "삽입/업데이트" },
  { value: "update", label: "업데이트만" },
] as const;

export const TRANSFORM_TYPE_OPTIONS = [
  { value: "none", label: "변환 없음" },
  { value: "constant", label: "상수값" },
  { value: "format", label: "포맷 변환" },
  { value: "function", label: "커스텀 함수" },
] as const;

export const DATA_TYPE_OPTIONS = [
  { value: "string", label: "문자열" },
  { value: "number", label: "숫자" },
  { value: "boolean", label: "불린" },
  { value: "date", label: "날짜" },
  { value: "json", label: "JSON" },
] as const;
