/**
 * 플로우 관리 시스템 타입 정의
 */

// 다중 REST API 연결 설정
export interface RestApiConnectionConfig {
  connectionId: number;
  connectionName: string;
  endpoint: string;
  jsonPath: string;
  alias: string; // 컬럼 접두어 (예: "api1_")
}

// 다중 외부 DB 연결 설정
export interface ExternalDbConnectionConfig {
  connectionId: number;
  connectionName: string;
  dbType: string;
  tableName: string;
  alias: string; // 컬럼 접두어 (예: "db1_")
}

// 플로우 정의
export interface FlowDefinition {
  id: number;
  name: string;
  description?: string;
  tableName: string;
  dbSourceType?: "internal" | "external" | "restapi" | "multi_restapi" | "multi_external_db"; // 데이터 소스 타입
  dbConnectionId?: number; // 외부 DB 연결 ID (external인 경우)
  // REST API 관련 필드 (단일)
  restApiConnectionId?: number; // REST API 연결 ID (restapi인 경우)
  restApiEndpoint?: string; // REST API 엔드포인트
  restApiJsonPath?: string; // JSON 응답에서 데이터 경로 (기본: data)
  // 다중 REST API 관련 필드
  restApiConnections?: RestApiConnectionConfig[]; // 다중 REST API 설정 배열
  companyCode: string; // 회사 코드 (* = 공통)
  isActive: boolean;
  createdBy?: string;
  createdAt: Date;
  updatedAt: Date;
}

// 플로우 정의 생성 요청
export interface CreateFlowDefinitionRequest {
  name: string;
  description?: string;
  tableName: string;
  dbSourceType?: "internal" | "external" | "restapi" | "multi_restapi" | "multi_external_db"; // 데이터 소스 타입
  dbConnectionId?: number; // 외부 DB 연결 ID
  // REST API 관련 필드 (단일)
  restApiConnectionId?: number; // REST API 연결 ID
  restApiEndpoint?: string; // REST API 엔드포인트
  restApiJsonPath?: string; // JSON 응답에서 데이터 경로
  // 다중 REST API 관련 필드
  restApiConnections?: RestApiConnectionConfig[]; // 다중 REST API 설정 배열
  companyCode?: string; // 회사 코드 (미제공 시 사용자의 company_code 사용)
}

// 플로우 정의 수정 요청
export interface UpdateFlowDefinitionRequest {
  name?: string;
  description?: string;
  isActive?: boolean;
}

// 조건 연산자
export type ConditionOperator =
  | "equals"
  | "="
  | "not_equals"
  | "!="
  | "in"
  | "not_in"
  | "greater_than"
  | ">"
  | "less_than"
  | "<"
  | "greater_than_or_equal"
  | ">="
  | "less_than_or_equal"
  | "<="
  | "is_null"
  | "is_not_null"
  | "like"
  | "not_like";

// 플로우 조건
export interface FlowCondition {
  column: string;
  operator: ConditionOperator;
  value: any;
}

// 플로우 조건 그룹
export interface FlowConditionGroup {
  type: "AND" | "OR";
  conditions: FlowCondition[];
}

// 플로우 단계 표시 설정
export interface FlowStepDisplayConfig {
  visibleColumns?: string[]; // 표시할 컬럼 목록
  columnOrder?: string[]; // 컬럼 순서 (선택사항)
  columnLabels?: Record<string, string>; // 컬럼별 커스텀 라벨 (선택사항)
  columnWidths?: Record<string, number>; // 컬럼별 너비 설정 (px, 선택사항)
}

// 플로우 단계
export interface FlowStep {
  id: number;
  flowDefinitionId: number;
  stepName: string;
  stepOrder: number;
  tableName?: string; // 이 단계에서 조회할 테이블명 (NULL이면 flow_definition의 tableName 사용)
  conditionJson?: FlowConditionGroup;
  color: string;
  positionX: number;
  positionY: number;
  // 하이브리드 플로우 지원 필드
  moveType?: "status" | "table" | "both"; // 데이터 이동 방식
  statusColumn?: string; // 상태 컬럼명 (상태 변경 방식)
  statusValue?: string; // 이 단계의 상태값
  targetTable?: string; // 타겟 테이블명 (테이블 이동 방식)
  fieldMappings?: Record<string, string>; // 필드 매핑 정보
  requiredFields?: string[]; // 필수 입력 필드
  // 외부 연동 필드
  integrationType?: FlowIntegrationType; // 연동 타입 (기본값: internal)
  integrationConfig?: FlowIntegrationConfig; // 연동 설정 (JSONB)
  // 🆕 표시 설정 (플로우 위젯에서 사용)
  displayConfig?: FlowStepDisplayConfig; // 단계별 컬럼 표시 설정
  createdAt: Date;
  updatedAt: Date;
}

// 플로우 단계 생성 요청
export interface CreateFlowStepRequest {
  flowDefinitionId: number;
  stepName: string;
  stepOrder: number;
  tableName?: string; // 이 단계에서 조회할 테이블명
  conditionJson?: FlowConditionGroup;
  color?: string;
  positionX?: number;
  positionY?: number;
  // 하이브리드 플로우 지원 필드
  moveType?: "status" | "table" | "both";
  statusColumn?: string;
  statusValue?: string;
  targetTable?: string;
  fieldMappings?: Record<string, string>;
  requiredFields?: string[];
  // 외부 연동 필드
  integrationType?: FlowIntegrationType;
  integrationConfig?: FlowIntegrationConfig;
  // 🆕 표시 설정
  displayConfig?: FlowStepDisplayConfig;
}

// 플로우 단계 수정 요청
export interface UpdateFlowStepRequest {
  stepName?: string;
  stepOrder?: number;
  tableName?: string; // 이 단계에서 조회할 테이블명
  conditionJson?: FlowConditionGroup;
  color?: string;
  positionX?: number;
  positionY?: number;
  // 하이브리드 플로우 지원 필드
  moveType?: "status" | "table" | "both";
  statusColumn?: string;
  statusValue?: string;
  targetTable?: string;
  fieldMappings?: Record<string, string>;
  requiredFields?: string[];
  // 외부 연동 필드
  integrationType?: FlowIntegrationType;
  integrationConfig?: FlowIntegrationConfig;
  // 🆕 표시 설정
  displayConfig?: FlowStepDisplayConfig;
}

// 플로우 단계 연결
export interface FlowStepConnection {
  id: number;
  flowDefinitionId: number;
  fromStepId: number;
  toStepId: number;
  label?: string;
  createdAt: Date;
}

// 플로우 단계 연결 생성 요청
export interface CreateFlowConnectionRequest {
  flowDefinitionId: number;
  fromStepId: number;
  toStepId: number;
  label?: string;
}

// 플로우 데이터 상태
export interface FlowDataStatus {
  id: number;
  flowDefinitionId: number;
  tableName: string;
  recordId: string;
  currentStepId?: number;
  updatedBy?: string;
  updatedAt: Date;
}

// 플로우 오딧 로그
export interface FlowAuditLog {
  id: number;
  flowDefinitionId: number;
  tableName: string;
  recordId: string;
  fromStepId?: number;
  toStepId?: number;
  changedBy?: string;
  changedAt: Date;
  note?: string;
  // 하이브리드 플로우 지원 필드
  moveType?: "status" | "table" | "both";
  sourceTable?: string;
  targetTable?: string;
  sourceDataId?: string;
  targetDataId?: string;
  statusFrom?: string;
  statusTo?: string;
  // 외부 DB 연결 정보
  dbConnectionId?: number;
  dbConnectionName?: string;
  // 조인 필드
  fromStepName?: string;
  toStepName?: string;
}

// 플로우 상세 정보
export interface FlowDetailResponse {
  definition: FlowDefinition;
  steps: FlowStep[];
  connections: FlowStepConnection[];
}

// 단계별 데이터 카운트
export interface FlowStepDataCount {
  stepId: number;
  count: number;
}

// 단계별 데이터 리스트
export interface FlowStepDataList {
  records: any[];
  total: number;
  page: number;
  pageSize: number;
}

// 데이터 이동 요청
export interface MoveDataRequest {
  flowId: number;
  fromStepId: number;
  recordId: string;
  toStepId: number;
  note?: string;
}

// SQL WHERE 절 결과
export interface SqlWhereResult {
  where: string;
  params: any[];
}

// ==================== 플로우 외부 연동 타입 ====================

// 연동 타입
export type FlowIntegrationType =
  | "internal" // 내부 DB (기본값)
  | "external_db" // 외부 DB
  | "procedure" // 프로시저/함수 호출
  | "rest_api" // REST API (추후 구현)
  | "webhook" // Webhook (추후 구현)
  | "hybrid"; // 복합 연동 (추후 구현)

// 플로우 전용 외부 DB 연결 정보
export interface FlowExternalDbConnection {
  id: number;
  name: string;
  description?: string;
  dbType: "postgresql" | "mysql" | "mssql" | "oracle";
  host: string;
  port: number;
  databaseName: string;
  username: string;
  passwordEncrypted: string; // 암호화된 비밀번호
  sslEnabled: boolean;
  connectionOptions?: Record<string, any>;
  isActive: boolean;
  createdBy?: string;
  updatedBy?: string;
  createdAt: Date;
  updatedAt: Date;
}

// 외부 DB 연결 생성 요청
export interface CreateFlowExternalDbConnectionRequest {
  name: string;
  description?: string;
  dbType: "postgresql" | "mysql" | "mssql" | "oracle";
  host: string;
  port: number;
  databaseName: string;
  username: string;
  password: string; // 평문 비밀번호 (저장 시 암호화)
  sslEnabled?: boolean;
  connectionOptions?: Record<string, any>;
}

// 외부 DB 연결 수정 요청
export interface UpdateFlowExternalDbConnectionRequest {
  name?: string;
  description?: string;
  host?: string;
  port?: number;
  databaseName?: string;
  username?: string;
  password?: string; // 평문 비밀번호 (저장 시 암호화)
  sslEnabled?: boolean;
  connectionOptions?: Record<string, any>;
  isActive?: boolean;
}

// 외부 DB 연동 설정 (integration_config JSON)
export interface FlowExternalDbIntegrationConfig {
  type: "external_db";
  connectionId: number; // flow_external_db_connection.id
  operation: "update" | "insert" | "delete" | "custom";
  tableName: string;
  updateFields?: Record<string, any>; // 업데이트할 필드 (템플릿 변수 지원)
  whereCondition?: Record<string, any>; // WHERE 조건 (템플릿 변수 지원)
  customQuery?: string; // operation이 'custom'인 경우 사용
}

// 프로시저 호출 파라미터 정의
export interface FlowProcedureParam {
  name: string;
  dataType: string;
  mode: "IN" | "OUT" | "INOUT";
  source: "record_field" | "static" | "step_variable";
  field?: string; // source가 record_field인 경우: 레코드 컬럼명
  value?: string; // source가 static인 경우: 고정값
}

// 프로시저 호출 설정 (integration_config JSON)
export interface FlowProcedureConfig {
  type: "procedure";
  dbSource: "internal" | "external";
  connectionId?: number; // 외부 DB인 경우 external_db_connections.id
  procedureName: string;
  procedureSchema?: string; // 스키마명 (기본: public)
  callType: "procedure" | "function"; // CALL vs SELECT
  parameters: FlowProcedureParam[];
}

// 프로시저/함수 목록 항목
export interface ProcedureListItem {
  name: string;
  schema: string;
  type: "PROCEDURE" | "FUNCTION";
  returnType?: string;
}

// 프로시저 파라미터 정보
export interface ProcedureParameterInfo {
  name: string;
  position: number;
  dataType: string;
  mode: "IN" | "OUT" | "INOUT";
  defaultValue?: string;
}

// 연동 설정 통합 타입
export type FlowIntegrationConfig =
  | FlowExternalDbIntegrationConfig
  | FlowProcedureConfig;

// 연동 실행 컨텍스트
export interface FlowIntegrationContext {
  flowId: number;
  stepId: number;
  dataId: string | number;
  tableName?: string;
  currentUser: string;
  variables: Record<string, any>; // 템플릿 변수 ({{dataId}}, {{currentUser}} 등)
  transactionId?: string;
}

// 연동 실행 결과
export interface FlowIntegrationResult {
  success: boolean;
  message?: string;
  data?: any;
  error?: {
    code: string;
    message: string;
    details?: any;
  };
  rollbackInfo?: any; // 롤백을 위한 정보
}

// 외부 연동 실행 로그
export interface FlowIntegrationLog {
  id: number;
  flowDefinitionId: number;
  stepId: number;
  dataId?: string;
  integrationType: string;
  connectionId?: number;
  requestPayload?: Record<string, any>;
  responsePayload?: Record<string, any>;
  status: "success" | "failed" | "timeout" | "rollback";
  errorMessage?: string;
  executionTimeMs?: number;
  executedBy?: string;
  executedAt: Date;
}

// 외부 연결 권한
export interface FlowExternalConnectionPermission {
  id: number;
  connectionId: number;
  userId?: number;
  roleName?: string;
  canView: boolean;
  canUse: boolean;
  canEdit: boolean;
  canDelete: boolean;
  createdAt: Date;
}
