/**
 * 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;
  /** 실행된 DDL 쿼리 */
  executedQuery?: string;
  /** 오류 정보 */
  error?: {
    code: string;
    details: string;
  };
}

// 검증 결과 인터페이스
export interface ValidationResult {
  /** 검증 통과 여부 */
  isValid: boolean;
  /** 오류 메시지 목록 */
  errors: string[];
  /** 경고 메시지 목록 */
  warnings?: 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: string;
  /** 실행 성공 여부 */
  success: boolean;
  /** 오류 메시지 (실패 시) */
  error_message?: string;
  /** 실행 시간 */
  executed_at: Date;
}

// PostgreSQL 타입 매핑
export interface PostgreSQLTypeMapping {
  /** 웹타입 */
  webType: WebType;
  /** PostgreSQL 데이터 타입 */
  postgresType: string;
  /** 기본 길이 (있는 경우) */
  defaultLength?: number;
  /** 길이 지정 가능 여부 */
  supportsLength: boolean;
}

// 테이블 메타데이터 인터페이스
export interface TableMetadata {
  /** 테이블명 */
  tableName: string;
  /** 테이블 라벨 */
  tableLabel: string;
  /** 테이블 설명 */
  description?: string;
  /** 생성 일시 */
  createdDate: Date;
  /** 수정 일시 */
  updatedDate: Date;
}

// 컬럼 메타데이터 인터페이스
export interface ColumnMetadata {
  /** 테이블명 */
  tableName: string;
  /** 컬럼명 */
  columnName: string;
  /** 컬럼 라벨 */
  columnLabel: string;
  /** 웹타입 */
  webType: WebType;
  /** 상세 설정 (JSON 문자열) */
  detailSettings: string;
  /** 컬럼 설명 */
  description?: string;
  /** 표시 순서 */
  displayOrder: number;
  /** 표시 여부 */
  isVisible: boolean;
  /** 코드 카테고리 (code 타입용) */
  codeCategory?: string;
  /** 코드 값 (code 타입용) */
  codeValue?: string;
  /** 참조 테이블 (entity 타입용) */
  referenceTable?: string;
  /** 참조 컬럼 (entity 타입용) */
  referenceColumn?: string;
  /** 생성 일시 */
  createdDate: Date;
  /** 수정 일시 */
  updatedDate: Date;
}

// 시스템 테이블 목록 (보호 대상)
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;

// 웹타입별 PostgreSQL 타입 매핑
export const WEB_TYPE_TO_POSTGRES_MAP: Record<WebType, PostgreSQLTypeMapping> =
  {
    text: {
      webType: "text",
      postgresType: "varchar",
      defaultLength: 255,
      supportsLength: true,
    },
    number: {
      webType: "number",
      postgresType: "integer",
      supportsLength: false,
    },
    decimal: {
      webType: "decimal",
      postgresType: "numeric(10,2)",
      supportsLength: false,
    },
    date: {
      webType: "date",
      postgresType: "date",
      supportsLength: false,
    },
    datetime: {
      webType: "datetime",
      postgresType: "timestamp",
      supportsLength: false,
    },
    boolean: {
      webType: "boolean",
      postgresType: "boolean",
      supportsLength: false,
    },
    code: {
      webType: "code",
      postgresType: "varchar",
      defaultLength: 100,
      supportsLength: true,
    },
    entity: {
      webType: "entity",
      postgresType: "integer",
      supportsLength: false,
    },
    textarea: {
      webType: "textarea",
      postgresType: "text",
      supportsLength: false,
    },
    select: {
      webType: "select",
      postgresType: "varchar",
      defaultLength: 100,
      supportsLength: true,
    },
    checkbox: {
      webType: "checkbox",
      postgresType: "boolean",
      supportsLength: false,
    },
    radio: {
      webType: "radio",
      postgresType: "varchar",
      defaultLength: 100,
      supportsLength: true,
    },
    file: {
      webType: "file",
      postgresType: "text",
      supportsLength: false,
    },
    email: {
      webType: "email",
      postgresType: "varchar",
      defaultLength: 255,
      supportsLength: true,
    },
    tel: {
      webType: "tel",
      postgresType: "varchar",
      defaultLength: 50,
      supportsLength: true,
    },
  };
