/**
 * 데이터베이스 관련 타입 정의
 *
 * Raw Query 기반 타입 안전성 보장
 */

/**
 * 쿼리 결과 인터페이스
 */
export interface QueryResult<T = any> {
  rows: T[];
  rowCount: number | null;
  command: string;
  fields?: any[];
}

/**
 * 트랜잭션 격리 수준
 */
export enum IsolationLevel {
  READ_UNCOMMITTED = 'READ UNCOMMITTED',
  READ_COMMITTED = 'READ COMMITTED',
  REPEATABLE_READ = 'REPEATABLE READ',
  SERIALIZABLE = 'SERIALIZABLE',
}

/**
 * 테이블 스키마 정의
 */
export interface TableSchema {
  tableName: string;
  columns: ColumnDefinition[];
  constraints?: TableConstraint[];
  indexes?: IndexDefinition[];
  comment?: string;
}

/**
 * 컬럼 정의
 */
export interface ColumnDefinition {
  name: string;
  type: PostgreSQLDataType;
  nullable?: boolean;
  defaultValue?: string;
  isPrimaryKey?: boolean;
  isUnique?: boolean;
  references?: ForeignKeyReference;
  comment?: string;
}

/**
 * PostgreSQL 데이터 타입
 */
export type PostgreSQLDataType =
  // 숫자 타입
  | 'SMALLINT'
  | 'INTEGER'
  | 'BIGINT'
  | 'DECIMAL'
  | 'NUMERIC'
  | 'REAL'
  | 'DOUBLE PRECISION'
  | 'SERIAL'
  | 'BIGSERIAL'

  // 문자열 타입
  | 'CHARACTER VARYING' // VARCHAR
  | 'VARCHAR'
  | 'CHARACTER'
  | 'CHAR'
  | 'TEXT'

  // 날짜/시간 타입
  | 'TIMESTAMP'
  | 'TIMESTAMP WITH TIME ZONE'
  | 'TIMESTAMPTZ'
  | 'DATE'
  | 'TIME'
  | 'TIME WITH TIME ZONE'
  | 'INTERVAL'

  // Boolean
  | 'BOOLEAN'

  // JSON
  | 'JSON'
  | 'JSONB'

  // UUID
  | 'UUID'

  // 배열
  | 'ARRAY'

  // 기타
  | 'BYTEA'
  | string; // 커스텀 타입 허용

/**
 * 외래 키 참조
 */
export interface ForeignKeyReference {
  table: string;
  column: string;
  onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION';
  onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION';
}

/**
 * 테이블 제약 조건
 */
export interface TableConstraint {
  name: string;
  type: 'PRIMARY KEY' | 'FOREIGN KEY' | 'UNIQUE' | 'CHECK';
  columns: string[];
  references?: ForeignKeyReference;
  checkExpression?: string;
}

/**
 * 인덱스 정의
 */
export interface IndexDefinition {
  name: string;
  columns: string[];
  unique?: boolean;
  type?: 'BTREE' | 'HASH' | 'GIN' | 'GIST';
  where?: string; // Partial index
}

/**
 * 쿼리 실행 옵션
 */
export interface QueryOptions {
  timeout?: number;
  preparedStatement?: boolean;
  rowMode?: 'array' | 'object';
}

/**
 * 동적 테이블 생성 요청
 */
export interface DynamicTableRequest {
  tableName: string;
  columns: ColumnDefinition[];
  constraints?: TableConstraint[];
  indexes?: IndexDefinition[];
  ifNotExists?: boolean;
  comment?: string;
}

/**
 * 동적 테이블 수정 요청
 */
export interface AlterTableRequest {
  tableName: string;
  operations: AlterTableOperation[];
}

/**
 * 테이블 변경 작업
 */
export type AlterTableOperation =
  | { type: 'ADD_COLUMN'; column: ColumnDefinition }
  | { type: 'DROP_COLUMN'; columnName: string }
  | { type: 'ALTER_COLUMN'; columnName: string; newDefinition: Partial<ColumnDefinition> }
  | { type: 'RENAME_COLUMN'; oldName: string; newName: string }
  | { type: 'ADD_CONSTRAINT'; constraint: TableConstraint }
  | { type: 'DROP_CONSTRAINT'; constraintName: string };

/**
 * 페이지네이션 요청
 */
export interface PaginationRequest {
  page: number;
  pageSize: number;
  orderBy?: string;
  orderDirection?: 'ASC' | 'DESC';
}

/**
 * 페이지네이션 응답
 */
export interface PaginationResponse<T> {
  data: T[];
  pagination: {
    currentPage: number;
    pageSize: number;
    totalItems: number;
    totalPages: number;
    hasNextPage: boolean;
    hasPreviousPage: boolean;
  };
}

/**
 * 쿼리 통계
 */
export interface QueryStatistics {
  query: string;
  executionTime: number;
  rowsAffected: number;
  timestamp: Date;
  success: boolean;
  error?: string;
}