/**
 * 리포트 관리 시스템 타입 정의
 */

// 리포트 템플릿
export interface ReportTemplate {
  template_id: string;
  template_name_kor: string;
  template_name_eng: string | null;
  template_type: string;
  is_system: string;
  thumbnail_url: string | null;
  description: string | null;
  layout_config: string | null;
  default_queries: string | null;
  use_yn: string;
  sort_order: number;
  created_at: string;
  created_by: string | null;
  updated_at: string | null;
  updated_by: string | null;
}

// 리포트 마스터
export interface ReportMaster {
  report_id: string;
  report_name_kor: string;
  report_name_eng: string | null;
  template_id: string | null;
  report_type: string;
  company_code: string | null;
  description: string | null;
  use_yn: string;
  created_at: string;
  created_by: string | null;
  updated_at: string | null;
  updated_by: string | null;
}

// 리포트 레이아웃
export interface ReportLayout {
  layout_id: string;
  report_id: string;
  canvas_width: number;
  canvas_height: number;
  page_orientation: string;
  margin_top: number;
  margin_bottom: number;
  margin_left: number;
  margin_right: number;
  components: ComponentConfig[];
  pages?: ReportPage[]; // 새 페이지 구조 (옵셔널, 하위 호환성)
  created_at: string;
  created_by: string | null;
  updated_at: string | null;
  updated_by: string | null;
}

// 리포트 쿼리
export interface ReportQuery {
  query_id: string;
  report_id: string;
  query_name: string;
  query_type: "MASTER" | "DETAIL";
  sql_query: string;
  parameters: string[];
  external_connection_id: number | null; // 외부 DB 연결 ID
  display_order: number;
  created_at: string;
  created_by: string | null;
  updated_at: string | null;
  updated_by: string | null;
}

// 외부 DB 연결 (간단한 버전)
export interface ExternalConnection {
  id: number;
  connection_name: string;
  db_type: string;
  description?: string;
  is_active: string;
}

// 워터마크 설정
export interface WatermarkConfig {
  enabled: boolean;
  type: "text" | "image";
  // 텍스트 워터마크
  text?: string;
  fontSize?: number;
  fontColor?: string;
  // 이미지 워터마크
  imageUrl?: string;
  // 공통 설정
  opacity: number; // 0~1
  style: "diagonal" | "center" | "tile";
  rotation?: number; // 대각선일 때 각도 (기본 -45)
}

// 페이지 설정
export interface ReportPage {
  page_id: string;
  page_name: string;
  page_order: number;
  width: number; // mm
  height: number; // mm
  orientation: "portrait" | "landscape";
  margins: {
    top: number;
    bottom: number;
    left: number;
    right: number;
  };
  background_color: string;
  components: ComponentConfig[];
}

// 레이아웃 설정 (페이지 기반)
export interface ReportLayoutConfig {
  pages: ReportPage[];
  watermark?: WatermarkConfig; // 전체 페이지 공유 워터마크
}

// 컴포넌트 설정
export interface ComponentConfig {
  id: string;
  type: string; // "text", "label", "table", "image", "divider", "signature", "stamp"
  x: number;
  y: number;
  width: number;
  height: number;
  zIndex: number;
  fontSize?: number;
  fontFamily?: string;
  fontWeight?: string;
  fontColor?: string;
  backgroundColor?: string;
  borderWidth?: number;
  borderColor?: string;
  borderRadius?: number;
  textAlign?: string;
  padding?: number;
  queryId?: string;
  fieldName?: string;
  defaultValue?: string;
  format?: string;
  visible?: boolean;
  printable?: boolean;
  conditional?: string;
  locked?: boolean; // 잠금 여부 (편집/이동/삭제 방지)
  groupId?: string; // 그룹 ID (같은 그룹 ID를 가진 컴포넌트는 함께 움직임)
  // 이미지 전용
  imageUrl?: string; // 이미지 URL 또는 업로드된 파일 경로
  imageFile?: File; // 업로드된 이미지 파일 (클라이언트 측에서만 사용)
  objectFit?: "contain" | "cover" | "fill" | "none"; // 이미지 맞춤 방식
  // 구분선 전용
  orientation?: "horizontal" | "vertical"; // 구분선 방향
  lineStyle?: "solid" | "dashed" | "dotted" | "double"; // 선 스타일
  lineWidth?: number; // 구분선 두께 (borderWidth와 별도)
  lineColor?: string; // 구분선 색상 (borderColor와 별도)
  // 서명/도장 전용
  showLabel?: boolean; // 레이블 표시 여부 ("서명:", "(인)")
  labelText?: string; // 커스텀 레이블 텍스트
  labelPosition?: "top" | "left" | "bottom" | "right"; // 레이블 위치
  personName?: string; // 도장란 이름 (예: "홍길동")
  // 테이블 전용
  tableColumns?: Array<{
    field: string; // 필드명
    header: string; // 헤더 표시명
    width?: number; // 컬럼 너비 (px)
    align?: "left" | "center" | "right"; // 정렬
  }>;
  headerBackgroundColor?: string; // 헤더 배경색
  headerTextColor?: string; // 헤더 텍스트 색상
  showBorder?: boolean; // 테두리 표시
  rowHeight?: number; // 행 높이 (px)
  // 페이지 번호 전용
  pageNumberFormat?: "number" | "numberTotal" | "koreanNumber"; // 페이지 번호 포맷
  // 카드 컴포넌트 전용
  cardTitle?: string; // 카드 제목
  cardItems?: Array<{
    label: string; // 항목 라벨 (예: "회사명")
    value: string; // 항목 값 (예: "당사 주식회사") 또는 기본값
    fieldName?: string; // 쿼리 필드명 (바인딩용)
  }>;
  labelWidth?: number; // 라벨 컬럼 너비 (px)
  showCardBorder?: boolean; // 카드 테두리 표시 여부
  showCardTitle?: boolean; // 카드 제목 표시 여부
  titleFontSize?: number; // 제목 폰트 크기
  labelFontSize?: number; // 라벨 폰트 크기
  valueFontSize?: number; // 값 폰트 크기
  titleColor?: string; // 제목 색상
  labelColor?: string; // 라벨 색상
  valueColor?: string; // 값 색상
  // 계산 컴포넌트 전용
  calcItems?: Array<{
    label: string; // 항목 라벨 (예: "공급가액")
    value: number | string; // 항목 값 또는 기본값
    operator: "+" | "-" | "x" | "÷"; // 연산자
    fieldName?: string; // 쿼리 필드명 (바인딩용)
  }>;
  resultLabel?: string; // 결과 라벨 (예: "합계 금액")
  resultColor?: string; // 결과 색상
  resultFontSize?: number; // 결과 폰트 크기
  showCalcBorder?: boolean; // 테두리 표시 여부
  numberFormat?: "none" | "comma" | "currency"; // 숫자 포맷 (없음, 천단위, 원화)
  currencySuffix?: string; // 통화 접미사 (예: "원")
  // 바코드 컴포넌트 전용
  barcodeType?: "CODE128" | "CODE39" | "EAN13" | "EAN8" | "UPC" | "QR"; // 바코드 타입
  barcodeValue?: string; // 고정값
  barcodeFieldName?: string; // 쿼리 필드 바인딩
  showBarcodeText?: boolean; // 바코드 아래 텍스트 표시 (1D만)
  barcodeColor?: string; // 바코드 색상
  barcodeBackground?: string; // 배경 색상
  barcodeMargin?: number; // 여백
  qrErrorCorrectionLevel?: "L" | "M" | "Q" | "H"; // QR 오류 보정 수준
  // QR코드 다중 필드 (JSON 형식)
  qrDataFields?: Array<{
    fieldName: string; // 쿼리 필드명
    label: string; // JSON 키 이름
  }>;
  qrUseMultiField?: boolean; // 다중 필드 사용 여부
  qrIncludeAllRows?: boolean; // 모든 행 포함 (배열 JSON)
  // 체크박스 컴포넌트 전용
  checkboxChecked?: boolean; // 체크 상태 (고정값)
  checkboxFieldName?: string; // 쿼리 필드 바인딩 (truthy/falsy 값)
  checkboxLabel?: string; // 체크박스 옆 레이블 텍스트
  checkboxSize?: number; // 체크박스 크기 (px)
  checkboxColor?: string; // 체크 색상
  checkboxBorderColor?: string; // 테두리 색상
  checkboxLabelPosition?: "left" | "right"; // 레이블 위치
}

// 리포트 상세
export interface ReportDetail {
  report: ReportMaster;
  layout: ReportLayout | null;
  queries: ReportQuery[];
  menuObjids?: number[]; // 연결된 메뉴 ID 목록
}

// 리포트 목록 응답
export interface GetReportsResponse {
  items: ReportMaster[];
  total: number;
  page: number;
  limit: number;
}

// 리포트 목록 조회 파라미터
export interface GetReportsParams {
  page?: number;
  limit?: number;
  searchText?: string;
  reportType?: string;
  useYn?: string;
  sortBy?: string;
  sortOrder?: "ASC" | "DESC";
}

// 리포트 생성 요청
export interface CreateReportRequest {
  reportNameKor: string;
  reportNameEng?: string;
  templateId?: string;
  reportType: string;
  description?: string;
  companyCode?: string;
}

// 리포트 수정 요청
export interface UpdateReportRequest {
  reportNameKor?: string;
  reportNameEng?: string;
  reportType?: string;
  description?: string;
  useYn?: string;
}

// 레이아웃 저장 요청
export interface SaveLayoutRequest {
  layoutConfig: ReportLayoutConfig; // 페이지 기반 구조
  queries?: Array<{
    id: string;
    name: string;
    type: "MASTER" | "DETAIL";
    sqlQuery: string;
    parameters: string[];
    externalConnectionId?: number;
  }>;
  menuObjids?: number[]; // 연결할 메뉴 ID 목록

  // 하위 호환성 (deprecated)
  canvasWidth?: number;
  canvasHeight?: number;
  pageOrientation?: string;
  marginTop?: number;
  marginBottom?: number;
  marginLeft?: number;
  marginRight?: number;
  components?: ComponentConfig[];
}

// 템플릿 목록 응답
export interface GetTemplatesResponse {
  system: ReportTemplate[];
  custom: ReportTemplate[];
}

// 템플릿 생성 요청
export interface CreateTemplateRequest {
  templateNameKor: string;
  templateNameEng?: string;
  templateType: string;
  description?: string;
  layoutConfig?: any;
  defaultQueries?: any;
}
