interface Point {
  x: number;
  y: number;
}

interface Rect {
  x: number;
  y: number;
  width: number;
  height: number;
}

interface Scalar {
  [key: number]: number;
}

interface Mat {
  delete(): void;
}

interface MatVector {
  size(): number;
  get(index: number): Mat;
  delete(): void;
}

interface WeChatQRCode {
  detectAndDecode(img: Mat, out: MatVector): MatVector;
}

interface OpenCVInstance {
  Mat: new () => Mat;
  MatVector: new () => MatVector;
  Point: new (x: number, y: number) => Point;
  Scalar: new (...args: number[]) => Scalar;
  imread: (img: HTMLImageElement) => Mat;
  imshow: (canvasId: string, mat: Mat) => void;
  rectangle: (
    img: Mat,
    pt1: Point,
    pt2: Point,
    color: Scalar,
    thickness: number,
    lineType: number,
    shift: number,
  ) => void;
  boundingRect: (contour: Mat) => Rect;
  LINE_AA: number;
  /**
   * 创建一个 WeChatQRCode 对象
   * @param args - 参数
   * eg：
   * new wechat_qrcode_WeChatQRCode(
   *   'detect_prototxt',
   *   'detect_caffemodel',
   *   'sr_prototxt',
   *   'sr_caffemodel',
   * )
   * @returns WeChatQRCode 对象
   */
  wechat_qrcode_WeChatQRCode: new (...args: string[]) => WeChatQRCode;
}

declare function opencvInit(): Promise<OpenCVInstance>;
declare global {
    interface Window {
        __Module__: any;
        __cv__: OpenCVInstance | Promise<OpenCVInstance>;
    }
}

export { opencvInit };
