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

// 리포트 템플릿
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;
  font_size?: number;
  font_color?: string;
  // 이미지 워터마크
  image_url?: 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;
  z_index: number;
  font_size?: number;
  font_family?: string;
  font_weight?: string;
  font_color?: string;
  background_color?: string;
  border_width?: number;
  border_color?: string;
  border_radius?: number;
  text_align?: string;
  padding?: number;
  query_id?: string;
  field_name?: string;
  default_value?: string;
  format?: string;
  visible?: boolean;
  printable?: boolean;
  conditional?: string;
  locked?: boolean; // 잠금 여부 (편집/이동/삭제 방지)
  group_id?: string; // 그룹 ID (같은 그룹 ID를 가진 컴포넌트는 함께 움직임)
  // 이미지 전용
  image_url?: string; // 이미지 URL 또는 업로드된 파일 경로
  image_file?: File; // 업로드된 이미지 파일 (클라이언트 측에서만 사용)
  object_fit?: "contain" | "cover" | "fill" | "none"; // 이미지 맞춤 방식
  // 구분선 전용
  orientation?: "horizontal" | "vertical"; // 구분선 방향
  line_style?: "solid" | "dashed" | "dotted" | "double"; // 선 스타일
  line_width?: number; // 구분선 두께 (border_width와 별도)
  line_color?: string; // 구분선 색상 (border_color와 별도)
  // 서명/도장 전용
  show_label?: boolean; // 레이블 표시 여부 ("서명:", "(인)")
  label_text?: string; // 커스텀 레이블 텍스트
  label_position?: "top" | "left" | "bottom" | "right"; // 레이블 위치
  person_name?: string; // 도장란 이름 (예: "홍길동")
  // 테이블 전용
  table_columns?: Array<{
    field: string; // 필드명
    header: string; // 헤더 표시명
    width?: number; // 컬럼 너비 (px)
    align?: "left" | "center" | "right"; // 정렬
  }>;
  header_background_color?: string; // 헤더 배경색
  header_text_color?: string; // 헤더 텍스트 색상
  show_border?: boolean; // 테두리 표시
  row_height?: number; // 행 높이 (px)
  // 페이지 번호 전용
  page_number_format?: "number" | "numberTotal" | "koreanNumber"; // 페이지 번호 포맷
  // 카드 컴포넌트 전용
  card_title?: string; // 카드 제목
  card_items?: Array<{
    label: string; // 항목 라벨 (예: "회사명")
    value: string; // 항목 값 (예: "당사 주식회사") 또는 기본값
    field_name?: string; // 쿼리 필드명 (바인딩용)
  }>;
  label_width?: number; // 라벨 컬럼 너비 (px)
  show_card_border?: boolean; // 카드 테두리 표시 여부
  show_card_title?: boolean; // 카드 제목 표시 여부
  title_font_size?: number; // 제목 폰트 크기
  label_font_size?: number; // 라벨 폰트 크기
  value_font_size?: number; // 값 폰트 크기
  title_color?: string; // 제목 색상
  label_color?: string; // 라벨 색상
  value_color?: string; // 값 색상
  // 계산 컴포넌트 전용
  calc_items?: Array<{
    label: string; // 항목 라벨 (예: "공급가액")
    value: number | string; // 항목 값 또는 기본값
    operator: "+" | "-" | "x" | "÷"; // 연산자
    field_name?: string; // 쿼리 필드명 (바인딩용)
  }>;
  result_label?: string; // 결과 라벨 (예: "합계 금액")
  result_color?: string; // 결과 색상
  result_font_size?: number; // 결과 폰트 크기
  show_calc_border?: boolean; // 테두리 표시 여부
  number_format?: "none" | "comma" | "currency"; // 숫자 포맷 (없음, 천단위, 원화)
  currency_suffix?: string; // 통화 접미사 (예: "원")
  // 바코드 컴포넌트 전용
  barcode_type?: "CODE128" | "CODE39" | "EAN13" | "EAN8" | "UPC" | "QR"; // 바코드 타입
  barcode_value?: string; // 고정값
  barcode_field_name?: string; // 쿼리 필드 바인딩
  show_barcode_text?: boolean; // 바코드 아래 텍스트 표시 (1D만)
  barcode_color?: string; // 바코드 색상
  barcode_background?: string; // 배경 색상
  barcode_margin?: number; // 여백
  qr_error_correction_level?: "L" | "M" | "Q" | "H"; // QR 오류 보정 수준
  // QR코드 다중 필드 (JSON 형식)
  qr_data_fields?: Array<{
    field_name: string; // 쿼리 필드명
    label: string; // JSON 키 이름
  }>;
  qr_use_multi_field?: boolean; // 다중 필드 사용 여부
  qr_include_all_rows?: boolean; // 모든 행 포함 (배열 JSON)
  // 체크박스 컴포넌트 전용
  checkbox_checked?: boolean; // 체크 상태 (고정값)
  checkbox_field_name?: string; // 쿼리 필드 바인딩 (truthy/falsy 값)
  checkbox_label?: string; // 체크박스 옆 레이블 텍스트
  checkbox_size?: number; // 체크박스 크기 (px)
  checkbox_color?: string; // 체크 색상
  checkbox_border_color?: string; // 테두리 색상
  checkbox_label_position?: "left" | "right"; // 레이블 위치
}

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

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

// 리포트 목록 조회 파라미터
export interface GetReportsParams {
  page?: number;
  limit?: number;
  search_text?: string;
  report_type?: string;
  use_yn?: string;
  sort_by?: string;
  sort_order?: "ASC" | "DESC";
}

// 리포트 생성 요청
export interface CreateReportRequest {
  report_name_kor: string;
  report_name_eng?: string;
  template_id?: string;
  report_type: string;
  description?: string;
  company_code?: string;
}

// 리포트 수정 요청
export interface UpdateReportRequest {
  report_name_kor?: string;
  report_name_eng?: string;
  report_type?: string;
  description?: string;
  use_yn?: string;
}

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

  // 하위 호환성 (deprecated)
  canvas_width?: number;
  canvas_height?: number;
  page_orientation?: string;
  margin_top?: number;
  margin_bottom?: number;
  margin_left?: number;
  margin_right?: number;
  components?: ComponentConfig[];
}

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

// 템플릿 생성 요청
export interface CreateTemplateRequest {
  template_name_kor: string;
  template_name_eng?: string;
  template_type: string;
  description?: string;
  layout_config?: any;
  default_queries?: any;
}
