/**
 * DDL 실행 관련 타입 정의 (프론트엔드)
 */

// 기본 웹타입
export type WebType =
  | "text"
  | "number"
  | "decimal"
  | "date"
  | "datetime"
  | "boolean"
  | "code"
  | "entity"
  | "textarea"
  | "select"
  | "checkbox"
  | "radio"
  | "file"
  | "email"
  | "tel";

// 컬럼 정의 인터페이스
export interface CreateColumnDefinition {
  /** 컬럼명 (영문자, 숫자, 언더스코어만 허용) */
  name: string;
  /** 컬럼 라벨 (화면 표시용) */
  label?: string;
  /** 입력타입 */
  inputType: string;
  /** 웹타입 (레거시 호환용) */
  webType?: WebType;
  /** NULL 허용 여부 */
  nullable?: boolean;
  /** 컬럼 길이 (text, code 타입에서 사용) */
  length?: number;
  /** 기본값 */
  defaultValue?: string;
  /** 컬럼 설명 */
  description?: string;
  /** 표시 순서 */
  order?: number;
  /** 상세 설정 (JSON 형태) */
  detailSettings?: Record<string, any>;
}

// 테이블 생성 요청 인터페이스
export interface CreateTableRequest {
  /** 테이블명 */
  tableName: string;
  /** 테이블 설명 */
  description?: string;
  /** 컬럼 정의 목록 */
  columns: CreateColumnDefinition[];
}

// 컬럼 추가 요청 인터페이스
export interface AddColumnRequest {
  /** 컬럼 정의 */
  column: CreateColumnDefinition;
}

// DDL 실행 결과 인터페이스
export interface DDLExecutionResult {
  /** 실행 성공 여부 */
  success: boolean;
  /** 결과 메시지 */
  message: string;
  /** 결과 데이터 */
  data?: any;
  /** 오류 정보 */
  error?: {
    code: string;
    details: string;
  };
}

// 검증 결과 인터페이스
export interface ValidationResult {
  /** 검증 통과 여부 */
  isValid: boolean;
  /** 오류 메시지 목록 */
  errors: string[];
  /** 경고 메시지 목록 */
  warnings?: string[];
  /** 검증 요약 */
  summary?: string;
}

// DDL 실행 로그 인터페이스
export interface DDLExecutionLog {
  /** 로그 ID */
  id: number;
  /** 사용자 ID */
  user_id: string;
  /** 회사 코드 */
  company_code: string;
  /** DDL 유형 */
  ddl_type: "CREATE_TABLE" | "ADD_COLUMN" | "DROP_TABLE" | "DROP_COLUMN";
  /** 테이블명 */
  table_name: string;
  /** 실행된 DDL 쿼리 (미리보기용) */
  ddl_query_preview?: string;
  /** 실행 성공 여부 */
  success: boolean;
  /** 오류 메시지 (실패 시) */
  error_message?: string;
  /** 실행 시간 */
  executed_at: string;
}

// DDL 통계 인터페이스
export interface DDLStatistics {
  /** 전체 실행 횟수 */
  totalExecutions: number;
  /** 성공 횟수 */
  successfulExecutions: number;
  /** 실패 횟수 */
  failedExecutions: number;
  /** DDL 타입별 통계 */
  byDDLType: Record<string, number>;
  /** 사용자별 통계 */
  byUser: Record<string, number>;
  /** 최근 실패 로그 */
  recentFailures: any[];
}

// 웹타입 옵션 (UI용)
export interface WebTypeOption {
  value: WebType;
  label: string;
  description?: string;
  supportsLength: boolean;
  defaultLength?: number;
}

// 웹타입 옵션 목록
export const WEB_TYPE_OPTIONS: WebTypeOption[] = [
  {
    value: "text",
    label: "텍스트",
    description: "일반 텍스트 입력",
    supportsLength: true,
    defaultLength: 255,
  },
  {
    value: "number",
    label: "숫자",
    description: "정수 입력",
    supportsLength: false,
  },
  {
    value: "decimal",
    label: "소수",
    description: "소수점 숫자 입력",
    supportsLength: false,
  },
  {
    value: "date",
    label: "날짜",
    description: "날짜 선택",
    supportsLength: false,
  },
  {
    value: "datetime",
    label: "날짜시간",
    description: "날짜와 시간 선택",
    supportsLength: false,
  },
  {
    value: "boolean",
    label: "불린",
    description: "참/거짓 값",
    supportsLength: false,
  },
  {
    value: "code",
    label: "코드",
    description: "공통코드 선택",
    supportsLength: true,
    defaultLength: 100,
  },
  {
    value: "entity",
    label: "엔티티",
    description: "다른 테이블 참조",
    supportsLength: false,
  },
  {
    value: "textarea",
    label: "긴 텍스트",
    description: "여러 줄 텍스트 입력",
    supportsLength: false,
  },
  {
    value: "select",
    label: "선택박스",
    description: "드롭다운 선택",
    supportsLength: true,
    defaultLength: 100,
  },
  {
    value: "checkbox",
    label: "체크박스",
    description: "체크박스 입력",
    supportsLength: false,
  },
  {
    value: "radio",
    label: "라디오버튼",
    description: "단일 선택 라디오버튼",
    supportsLength: true,
    defaultLength: 100,
  },
  {
    value: "file",
    label: "파일",
    description: "파일 업로드",
    supportsLength: false,
  },
  {
    value: "email",
    label: "이메일",
    description: "이메일 주소 입력",
    supportsLength: true,
    defaultLength: 255,
  },
  {
    value: "tel",
    label: "전화번호",
    description: "전화번호 입력",
    supportsLength: true,
    defaultLength: 50,
  },
];

// 컬럼 정의 테이블 속성
export interface ColumnDefinitionTableProps {
  columns: CreateColumnDefinition[];
  onChange: (columns: CreateColumnDefinition[]) => void;
  disabled?: boolean;
}

// 테이블 생성 모달 속성
export interface CreateTableModalProps {
  isOpen: boolean;
  onClose: () => void;
  onSuccess: (result: DDLExecutionResult) => void;
  // 🆕 복제 모드 관련
  mode?: "create" | "duplicate";
  sourceTableName?: string; // 복제 대상 테이블명
}

// 컬럼 추가 모달 속성
export interface AddColumnModalProps {
  isOpen: boolean;
  onClose: () => void;
  tableName: string;
  onSuccess: (result: DDLExecutionResult) => void;
}

// DDL 로그 뷰어 속성
export interface DDLLogViewerProps {
  isOpen: boolean;
  onClose: () => void;
}

// 유효성 검사 규칙
export const VALIDATION_RULES = {
  tableName: {
    pattern: /^[a-zA-Z_][a-zA-Z0-9_]*$/,
    minLength: 2,
    maxLength: 63,
    errorMessage: "테이블명은 영문자로 시작하고, 영문자/숫자/언더스코어만 사용 가능합니다 (2-63자)",
  },
  columnName: {
    pattern: /^[a-zA-Z_][a-zA-Z0-9_]*$/,
    minLength: 2,
    maxLength: 63,
    errorMessage: "컬럼명은 영문자로 시작하고, 영문자/숫자/언더스코어만 사용 가능합니다 (2-63자)",
  },
  columnLength: {
    min: 1,
    max: 65535,
    errorMessage: "컬럼 길이는 1 이상 65535 이하여야 합니다",
  },
} as const;

// 시스템 테이블 목록 (보호 대상)
export const SYSTEM_TABLES = [
  "user_info",
  "company_mng",
  "menu_info",
  "auth_group",
  "table_labels",
  "column_labels",
  "screen_definitions",
  "screen_layouts",
  "common_code",
  "multi_lang_key_master",
  "multi_lang_text",
  "button_action_standards",
  "ddl_execution_log",
] as const;

// 예약어 목록
export const RESERVED_WORDS = [
  "user",
  "order",
  "group",
  "table",
  "column",
  "index",
  "select",
  "insert",
  "update",
  "delete",
  "from",
  "where",
  "join",
  "on",
  "as",
  "and",
  "or",
  "not",
  "null",
  "true",
  "false",
  "create",
  "alter",
  "drop",
  "primary",
  "key",
  "foreign",
  "references",
  "constraint",
  "default",
  "unique",
  "check",
  "view",
  "procedure",
  "function",
] as const;

// 예약된 컬럼명 목록 (자동 추가되는 기본 컬럼들)
export const RESERVED_COLUMNS = ["id", "created_date", "updated_date", "company_code"] as const;
