/**
 * 대시보드 관리 시스템 타입 정의
 */

export type ElementType = "chart" | "widget";

export type ElementSubtype =
  | "bar"
  | "horizontal-bar"
  | "pie"
  | "line"
  | "area"
  | "stacked-bar"
  | "donut"
  | "combo" // 차트 타입
  | "exchange"
  | "weather"
  | "weather-map" // 날씨 지도 위젯
  | "clock"
  | "calendar"
  | "calculator"
  | "vehicle-status"
  | "vehicle-list" // (구버전 - 호환용)
  | "vehicle-map" // (구버전 - 호환용)
  // | "map-summary" // (구버전 - 주석 처리: 2025-10-28, map-summary-v2로 대체)
  // | "map-test" // 🧪 지도 테스트 위젯 (REST API 지원) - V2로 대체
  | "map-summary-v2" // 지도 위젯 (다중 데이터 소스) - 승격 완료
  // | "map-test-v2" // (테스트 버전 - 주석 처리: 2025-10-28, map-summary-v2로 승격)
  | "chart" // 차트 위젯 (다중 데이터 소스) - 승격 완료
  // | "chart-test" // (테스트 버전 - 주석 처리: 2025-10-28, chart로 승격)
  | "list-v2" // 리스트 위젯 (다중 데이터 소스) - 승격 완료
  // | "list-test" // (테스트 버전 - 주석 처리: 2025-10-28, list-v2로 승격)
  | "custom-metric-v2" // 통계 카드 위젯 (다중 데이터 소스) - 승격 완료
  // | "custom-metric-test" // (테스트 버전 - 주석 처리: 2025-10-28, custom-metric-v2로 승격)
  // | "status-summary-test" // 🧪 상태 요약 테스트 (CustomMetricTest로 대체 가능)
  | "risk-alert-v2" // 리스크/알림 위젯 (다중 데이터 소스) - 승격 완료
  // | "risk-alert-test" // (테스트 버전 - 주석 처리: 2025-10-28, risk-alert-v2로 승격)
  | "delivery-status"
  | "status-summary" // 범용 상태 카드 (통합)
  // | "list-summary" // 범용 목록 카드 (다른 분 작업 중 - 임시 주석)
  | "delivery-status-summary" // (구버전 - 호환용)
  | "delivery-today-stats" // (구버전 - 호환용)
  | "cargo-list" // (구버전 - 호환용)
  | "customer-issues" // (구버전 - 호환용)
  // | "risk-alert" // (구버전 - 주석 처리: 2025-10-28, risk-alert-v2로 대체)
  | "driver-management" // (구버전 - 호환용)
  | "todo"
  | "booking-alert"
  | "maintenance"
  | "document"
  // | "list" // (구버전 - 주석 처리: 2025-10-28, list-v2로 대체)
  | "yard-management-3d" // 3D 필드 위젯
  | "work-history" // 작업 이력 위젯
  | "transport-stats"; // 커스텀 통계 카드 위젯
// | "custom-metric"; // (구버전 - 주석 처리: 2025-10-28, custom-metric-v2로 대체)

// 차트 분류
export type ChartCategory = "axis-based" | "circular";

// 축 기반 차트 (X/Y축 사용)
export const AXIS_BASED_CHARTS = ["bar", "horizontal-bar", "line", "area", "stacked-bar", "combo"] as const;

// 원형 차트 (그룹핑 사용)
export const CIRCULAR_CHARTS = ["pie", "donut"] as const;

// 차트인지 확인
export const isChartType = (subtype: ElementSubtype): boolean => {
  return (
    (AXIS_BASED_CHARTS as readonly string[]).includes(subtype) ||
    (CIRCULAR_CHARTS as readonly string[]).includes(subtype)
  );
};

// 축 기반 차트인지 확인
export const isAxisBasedChart = (subtype: ElementSubtype): boolean => {
  return (AXIS_BASED_CHARTS as readonly string[]).includes(subtype);
};

// 원형 차트인지 확인
export const isCircularChart = (subtype: ElementSubtype): boolean => {
  return (CIRCULAR_CHARTS as readonly string[]).includes(subtype);
};

// 차트 카테고리 가져오기
export const getChartCategory = (subtype: ElementSubtype): ChartCategory | null => {
  if (isAxisBasedChart(subtype)) return "axis-based";
  if (isCircularChart(subtype)) return "circular";
  return null;
};

export interface Position {
  x: number;
  y: number;
  z?: number;
}

export interface Size {
  width: number;
  height: number;
}

export interface DashboardElement {
  id: string;
  type: ElementType;
  subtype: ElementSubtype;
  position: Position;
  size: Size;
  title: string;
  customTitle?: string; // 사용자 정의 제목 (옵션)
  showHeader?: boolean; // 헤더 표시 여부 (기본값: true)
  content: string;
  dataSource?: ChartDataSource; // 데이터 소스 설정 (단일, 하위 호환용)
  dataSources?: ChartDataSource[]; // 다중 데이터 소스 설정 (테스트 위젯용)
  chartConfig?: ChartConfig; // 차트 설정
  clockConfig?: ClockConfig; // 시계 설정
  calendarConfig?: CalendarConfig; // 달력 설정
  driverManagementConfig?: DriverManagementConfig; // 기사 관리 설정
  listConfig?: ListWidgetConfig; // 리스트 위젯 설정
  yardConfig?: YardManagementConfig; // 3D 필드 설정
  customMetricConfig?: CustomMetricConfig; // 사용자 커스텀 카드 설정
}

export interface DragData {
  type: ElementType;
  subtype: ElementSubtype;
}

export interface ResizeHandle {
  direction: "nw" | "ne" | "sw" | "se";
  cursor: string;
}

// 키-값 쌍 인터페이스
export interface KeyValuePair {
  id: string; // 고유 ID
  key: string; // 키
  value: string; // 값
}

export interface ChartDataSource {
  id?: string; // 고유 ID (다중 데이터 소스용)
  name?: string; // 사용자 지정 이름 (예: "기상특보", "교통정보")
  type: "database" | "api"; // 데이터 소스 타입

  // DB 커넥션 관련
  connectionType?: "current" | "external"; // 현재 DB vs 외부 DB
  externalConnectionId?: string; // 외부 DB 커넥션 ID
  query?: string; // SQL 쿼리 (SELECT만)

  // API 관련
  endpoint?: string; // API URL
  // HTTP 메서드 (기본 GET, POST/PUT/DELETE/PATCH도 지원)
  method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
  // 요청 Body (옵션) - 문자열 그대로 전송 (JSON 또는 일반 텍스트)
  body?: string;
  headers?: KeyValuePair[]; // 커스텀 헤더 (배열)
  queryParams?: KeyValuePair[]; // URL 쿼리 파라미터 (배열)
  jsonPath?: string; // JSON 응답에서 데이터 추출 경로 (예: "data.results")

  // 공통
  lastExecuted?: string; // 마지막 실행 시간
  lastError?: string; // 마지막 오류 메시지
  mapDisplayType?: "auto" | "marker" | "polygon"; // 지도 표시 방식 (auto: 자동, marker: 마커, polygon: 영역)

  // 지도 색상 설정 (MapTestWidgetV2용)
  markerColor?: string; // 마커 색상 (예: "#ff0000")
  polygonColor?: string; // 폴리곤 색상 (예: "#0000ff")
  polygonOpacity?: number; // 폴리곤 투명도 (0.0 ~ 1.0, 기본값: 0.5)
  markerType?: string; // 마커 종류 (circle, arrow, truck)
  minZoom?: number; // 최소 줌 레벨 (최대로 멀리 보기, 기본값: 2)
  maxZoom?: number; // 최대 줌 레벨 (최대로 가까이 보기, 기본값: 18)
  initialZoom?: number; // 초기 줌 레벨 (기본값: 13)

  // 컬럼 매핑 (다중 데이터 소스 통합용)
  columnMapping?: Record<string, string>; // { 원본컬럼: 표시이름 } (예: { "name": "product" })

  // 메트릭 설정 (CustomMetricTestWidget용)
  selectedColumns?: string[]; // 표시할 컬럼 선택 (빈 배열이면 전체 표시)

  // 지도 팝업 설정 (MapTestWidgetV2용)
  popupFields?: {
    fieldName: string; // DB 컬럼명 (예: vehicle_number)
    label: string; // 표시할 한글명 (예: 차량 번호)
    format?: "text" | "date" | "datetime" | "number" | "url"; // 표시 포맷
  }[];

  // REST API 위치 데이터 저장 설정 (MapTestWidgetV2용)
  saveToHistory?: boolean; // REST API에서 가져온 위치 데이터를 vehicle_location_history에 저장
}

export interface ChartConfig {
  // 다중 데이터 소스 (테스트 위젯용)
  dataSources?: ChartDataSource[]; // 여러 데이터 소스 (REST API + Database 혼합 가능)

  // 위젯 레벨 설정 (MapTestWidgetV2용)
  refreshInterval?: number; // 위젯 전체 자동 새로고침 간격 (초, 0이면 수동)

  // 멀티 차트 설정 (ChartTestWidget용)
  chartType?: string; // 차트 타입 (line, bar, pie, etc.)
  mergeMode?: boolean; // 데이터 병합 모드 (여러 데이터 소스를 하나의 라인/바로 합침)
  dataSourceConfigs?: Array<{
    dataSourceId: string; // 데이터 소스 ID
    xAxis: string; // X축 필드명
    yAxis: string[]; // Y축 필드명 배열
    label?: string; // 데이터 소스 라벨
    chartType?: "bar" | "line" | "area"; // 🆕 각 데이터 소스별 차트 타입 (바/라인/영역 혼합 가능)
  }>;

  // 축 매핑 (단일 데이터 소스용)
  xAxis?: string; // X축 필드명
  yAxis?: string | string[]; // Y축 필드명 (다중 가능)

  // 데이터 처리
  groupBy?: string; // 그룹핑 필드
  aggregation?: "sum" | "avg" | "count" | "max" | "min";
  sortBy?: string; // 정렬 기준 필드
  sortOrder?: "asc" | "desc"; // 정렬 순서
  limit?: number; // 데이터 개수 제한

  // 데이터 필터
  dateFilter?: {
    enabled: boolean; // 날짜 필터 활성화
    dateColumn?: string; // 날짜 컬럼
    startDate?: string; // 시작일 (YYYY-MM-DD)
    endDate?: string; // 종료일 (YYYY-MM-DD)
    quickRange?: "today" | "week" | "month" | "year"; // 빠른 선택
  };

  // 안전장치
  autoLimit?: number; // 자동 LIMIT (기본: 1000)

  // 스타일
  colors?: string[]; // 차트 색상 팔레트
  title?: string; // 차트 제목
  showLegend?: boolean; // 범례 표시
  legendPosition?: "top" | "bottom" | "left" | "right"; // 범례 위치

  // 축 설정
  xAxisLabel?: string; // X축 라벨
  yAxisLabel?: string; // Y축 라벨
  showGrid?: boolean; // 그리드 표시

  // 애니메이션
  enableAnimation?: boolean; // 애니메이션 활성화

  // 상태 필터링 (커스텀 상태 카드용)
  statusFilter?: string[]; // 표시할 상태 목록 (예: ["driving", "parked"])
  animationDuration?: number; // 애니메이션 시간 (ms)

  // 툴팁
  showTooltip?: boolean; // 툴팁 표시
  tooltipFormat?: string; // 툴팁 포맷 (템플릿)

  // 차트별 특수 설정
  barOrientation?: "vertical" | "horizontal"; // 막대 방향
  lineStyle?: "smooth" | "straight"; // 선 스타일
  areaOpacity?: number; // 영역 투명도
  pieInnerRadius?: number; // 도넛 차트 내부 반지름 (0-1)
  stackMode?: "normal" | "percent"; // 누적 모드

  // 지도 관련 설정
  tileMapUrl?: string; // 타일맵 URL (예: VWorld, OpenStreetMap)
  latitudeColumn?: string; // 위도 컬럼
  longitudeColumn?: string; // 경도 컬럼
  labelColumn?: string; // 라벨 컬럼
  statusColumn?: string; // 상태 컬럼
  showWeather?: boolean; // 날씨 정보 표시 여부
  showWeatherAlerts?: boolean; // 기상특보 영역 표시 여부

  // 마커 색상 설정
  markerColorMode?: "single" | "conditional"; // 마커 색상 모드 (단일/조건부)
  markerColorColumn?: string; // 색상 조건 컬럼
  markerColorRules?: MarkerColorRule[]; // 색상 규칙 배열
  markerDefaultColor?: string; // 기본 마커 색상
}

// 마커 색상 규칙
export interface MarkerColorRule {
  id: string; // 고유 ID
  value: string; // 컬럼 값 (예: "active", "inactive")
  color: string; // 마커 색상 (hex)
  label?: string; // 라벨 (선택사항)
}

export interface QueryResult {
  columns: string[]; // 컬럼명 배열
  rows: Record<string, any>[]; // 데이터 행 배열
  totalRows: number; // 전체 행 수
  executionTime: number; // 실행 시간 (ms)
  error?: string; // 오류 메시지
  columnTypes?: Record<string, string>; // 각 컬럼의 타입 정보 (number, string, object, array 등)
}

// 시계 위젯 설정
export interface ClockConfig {
  style: "analog" | "digital" | "both"; // 시계 스타일
  timezone: string; // 타임존 (예: 'Asia/Seoul')
  showDate: boolean; // 날짜 표시 여부
  showSeconds: boolean; // 초 표시 여부 (디지털)
  format24h: boolean; // 24시간 형식 (true) vs 12시간 형식 (false)
  theme: "light" | "dark" | "custom"; // 테마
  customColor?: string; // 사용자 지정 색상 (custom 테마일 때)
}

// 달력 위젯 설정
export interface CalendarConfig {
  view: "month" | "week" | "day"; // 뷰 타입
  startWeekOn: "monday" | "sunday"; // 주 시작 요일
  highlightWeekends: boolean; // 주말 강조
  highlightToday: boolean; // 오늘 강조
  showHolidays: boolean; // 공휴일 표시
  theme: "light" | "dark" | "custom"; // 테마
  customColor?: string; // 사용자 지정 색상
  showWeekNumbers?: boolean; // 주차 표시 (선택)
}

// 기사 관리 위젯 설정
export interface DriverManagementConfig {
  viewType: "list"; // 뷰 타입 (현재는 리스트만)
  autoRefreshInterval: number; // 자동 새로고침 간격 (초)
  visibleColumns: string[]; // 표시할 컬럼 목록
  theme: "light" | "dark" | "custom"; // 테마
  customColor?: string; // 사용자 지정 색상
  statusFilter: "all" | "driving" | "standby" | "resting" | "maintenance"; // 상태 필터
  sortBy: "name" | "vehicleNumber" | "status" | "departureTime"; // 정렬 기준
  sortOrder: "asc" | "desc"; // 정렬 순서
}

// 기사 정보
export interface DriverInfo {
  id: string; // 기사 고유 ID
  name: string; // 기사 이름
  vehicleNumber: string; // 차량 번호
  vehicleType: string; // 차량 유형
  phone: string; // 연락처
  status: "standby" | "driving" | "resting" | "maintenance"; // 운행 상태
  departure?: string; // 출발지
  destination?: string; // 목적지
  departureTime?: string; // 출발 시간
  estimatedArrival?: string; // 예상 도착 시간
  progress?: number; // 운행 진행률 (0-100)
}

// 외부 DB 커넥션 정보 (기존 외부 커넥션 관리에서 가져옴)
export interface ExternalConnection {
  id: string;
  name: string; // 사용자 지정 이름 (표시용)
  type: "postgresql" | "mysql" | "mssql" | "oracle";
}

// API 응답 구조
export interface ApiResponse<T = any> {
  success: boolean;
  data: T;
  message?: string;
  error?: string;
}

// 차트 데이터 (변환 후)
export interface ChartData {
  labels: string[]; // X축 레이블
  datasets: ChartDataset[]; // Y축 데이터셋 (다중 시리즈)
}

export interface ChartDataset {
  label: string; // 시리즈 이름
  data: number[]; // 데이터 값
  color?: string; // 색상
}

// 리스트 위젯 설정
export interface ListWidgetConfig {
  columnMode?: "auto" | "manual"; // [Deprecated] 더 이상 사용하지 않음 (하위 호환성을 위해 유지)
  viewMode: "table" | "card"; // 뷰 모드 (테이블 or 카드) (기본: table)
  columns: ListColumn[]; // 컬럼 정의
  pageSize: number; // 페이지당 행 수 (기본: 10)
  enablePagination: boolean; // 페이지네이션 활성화 (기본: true)
  showHeader: boolean; // 헤더 표시 (기본: true, 테이블 모드에만 적용)
  stripedRows: boolean; // 줄무늬 행 (기본: true, 테이블 모드에만 적용)
  compactMode: boolean; // 압축 모드 (기본: false)
  cardColumns: number; // 카드 뷰 컬럼 수 (기본: 3)
  // 행 클릭 팝업 설정
  rowDetailPopup?: RowDetailPopupConfig;
}

// 행 상세 팝업 설정
export interface RowDetailPopupConfig {
  enabled: boolean; // 팝업 활성화 여부
  title?: string; // 팝업 제목 (기본: "상세 정보")
  // 추가 데이터 조회 설정
  additionalQuery?: {
    enabled: boolean;
    queryMode?: "table" | "custom"; // 조회 모드: table(테이블 조회), custom(커스텀 쿼리)
    tableName: string; // 조회할 테이블명 (예: vehicles)
    matchColumn: string; // 매칭할 컬럼 (예: id)
    sourceColumn?: string; // 클릭한 행에서 가져올 컬럼 (기본: matchColumn과 동일)
    customQuery?: string; // 커스텀 쿼리 ({id}, {vehicle_number} 등 파라미터 사용)
    // 팝업에 표시할 컬럼 목록 (비어있으면 전체 표시)
    displayColumns?: DisplayColumnConfig[];
  };
}

// 표시 컬럼 설정
export interface DisplayColumnConfig {
  column: string; // DB 컬럼명
  label: string; // 표시 라벨 (사용자 정의)
  // 필드 그룹 설정
  fieldGroups?: FieldGroup[];
}

// 필드 그룹 (팝업 내 섹션)
export interface FieldGroup {
  id: string;
  title: string; // 그룹 제목 (예: "운행 정보")
  icon?: string; // 아이콘 (예: "truck", "clock")
  color?: "blue" | "orange" | "green" | "red" | "purple" | "gray";
  fields: FieldConfig[];
}

// 필드 설정
export interface FieldConfig {
  column: string; // DB 컬럼명
  label: string; // 표시 라벨
  format?: "text" | "number" | "date" | "datetime" | "currency" | "boolean" | "distance" | "duration";
}

// 리스트 컬럼
export interface ListColumn {
  id: string; // 고유 ID
  label: string; // 표시될 컬럼명
  field: string; // 데이터 필드명
  width?: number; // 너비 (px)
  align?: "left" | "center" | "right"; // 정렬
  visible?: boolean; // 표시 여부 (기본: true)
}

// 3D 필드 설정
export interface YardManagementConfig {
  layoutId: number; // 선택된 야드 레이아웃 ID
  layoutName?: string; // 레이아웃 이름 (표시용)
}

// 사용자 커스텀 카드 설정
export interface CustomMetricConfig {
  // 단일 통계 카드 설정
  valueColumn?: string; // 계산할 컬럼명
  aggregation?: "sum" | "avg" | "count" | "min" | "max"; // 계산 방식
  title?: string; // 카드 제목
  unit?: string; // 표시 단위 (원, 건, % 등)
  color?: "indigo" | "green" | "blue" | "purple" | "orange" | "gray"; // 카드 색상
  decimals?: number; // 소수점 자릿수 (기본: 0)
  refreshInterval?: number; // 자동 새로고침 간격 (초, 0이면 비활성)

  // 필터 조건
  filters?: Array<{
    column: string; // 필터 컬럼명
    operator: "=" | "!=" | ">" | "<" | ">=" | "<=" | "contains" | "not_contains"; // 조건 연산자
    value: string; // 비교값
  }>;
}
