import { SyntheticEvent } from "react";
import { ToolbarProps } from "../Buttons/Toolbar/Toolbar/ToolbarProps";
import { ErrorEvent as KendoErrorEvent } from "@progress/kendo-react-pdf-viewer";
import { DownloadEvent as KendoDownloadEvent } from "@progress/kendo-react-pdf-viewer";

type TypedArray =
  | Int8Array
  | Uint8Array
  | Uint8ClampedArray
  | Int16Array
  | Uint16Array
  | Int32Array
  | Uint32Array
  | Float32Array
  | Float64Array;
type SaveOptions = any;

export type PDFViewerTool =
  | "pager"
  | "spacer"
  | "zoomInOut"
  | "zoom"
  | "selection"
  | "search"
  | "open"
  | "download"
  | "print";

export interface ZoomLevels {
  id: number;
  locationString?: string;
  priority: number;
  text: string;
  type: string;
  value: number;
}

export interface PageEvent {
  page: number;
  syntheticEvent: SyntheticEvent<any>;
  target: PDFViewerHandle;
}

export interface PDFViewerHandle {
  document: any;
  element: null | HTMLDivElement;
  pages: any[];
  props: PDFViewerProps;
}

export interface DownloadEvent {
  blob: Blob;
  fileName: string;
  saveOptions: SaveOptions;
  target: PDFViewerHandle;
}

export interface ZoomEvent {
  syntheticEvent: React.SyntheticEvent<any>;
  target: PDFViewerHandle;
  zoom: number;
}

export interface LoadEvent {
  target: PDFViewerHandle;
}

export interface PDFViewerProps {
  dataTestId?: string;
  id?: string;
  arrayBuffer?: ArrayBuffer;
  data?: string;
  defaultZoom?: number;
  maxZoom?: number;
  minZoom?: number;
  saveFileName?: string;
  saveOptions?: SaveOptions;
  style?: React.CSSProperties;
  tools?: PDFViewerTool[];
  typedArray?: TypedArray;
  url?: string;
  zoom?: number;
  zoomLevels?: ZoomLevels[];
  zoomRate?: number;
  onDownload?: (event: KendoDownloadEvent) => boolean | void;
  onError?: (event: KendoErrorEvent) => void;
  onLoad?: (event: LoadEvent) => void;
  onPageChange?: (event: PageEvent) => void;
  onRenderContent?: (
    defaultRendering: React.ReactElement<HTMLDivElement>
  ) => React.ReactNode;
  onRenderLoader?: (
    defaultRendering: null | React.ReactElement<HTMLDivElement>
  ) => React.ReactNode;
  onRenderToolbar?: (
    defaultRendering: React.ReactElement<ToolbarProps>
  ) => React.ReactNode;
  onZoom?: (event: ZoomEvent) => void;
}
