// Contains the type definitions for all the emscripten bound methods from the wasm debugger.
// These are defined in //skia/experimental/wasm-skp-debugger/debugger_bindings.cpp
import type {
  CanvasKit,
  Surface
}
// @ts-ignore
from '../wasm_libs/types/canvaskit'; // gazelle:ignore

export interface Debugger extends CanvasKit {
  SkpFilePlayer(ab: ArrayBuffer): SkpFilePlayerResult;
  MinVersion(): number;
}
// An object containing either the successfully loaded file player or an error.
export interface SkpFilePlayerResult {
  readonly error: string;
  readonly player: SkpDebugPlayer;
}
export interface SkpDebugPlayer {
  changeFrame(index: number): void;
  deleteCommand(index: number): void;
  draw(surface: Surface): void;
  drawTo(surface: Surface, index: number): void;
  findCommandByPixel(surface: Surface, x: number, y: number, upperBound: number): number;
  getBounds(): SkIRect;
  getBoundsForFrame(frame: number): SkIRect;
  getFrameCount(): number;
  getImageResource(index: number): string;
  getImageCount(): number;
  getImageInfo(index: number): ImageInfoNoColorspace;
  getLayerKeys(): LayerKey[]
  getLayerSummariesJs(): LayerSummary[];
  getSize(): number;
  imageUseInfo(frame: number, nodeid: number): ImageUseMap;
  jsonCommandList(surface: Surface): string;
  lastCommandInfo(): string;
  loadSkp(ptr: number, len: number): string;
  setClipVizColor(color: Color): void;
  setCommandVisibility(index: number, visible: boolean): void;
  setGpuOpBounds(visible: boolean): void;
  setInspectedLayer(nodeId: number): void;
  setOriginVisible(visible: boolean): void;
  setOverdrawVis(visible: boolean): void;
  setAndroidClipViz(visible: boolean): void;
  TRANSPARENT: number;
}
export interface ImageInfoNoColorspace {
  width: number,
  height: number,
  colorType: number,
  alphaType: number,
}
export interface SkIRect {
  fLeft: number;
  fTop: number;
  fRight: number;
  fBottom: number;
}
export type Color = number;
export type Matrix3x3 = [
  [number, number, number],
  [number, number, number],
  [number, number, number],
];
export type Matrix4x4 = [
  [number, number, number, number],
  [number, number, number, number],
  [number, number, number, number],
  [number, number, number, number],
];
// return type of lastCommandInfo after json.parse
export interface MatrixClipInfo {
  ClipRect: [number, number, number, number],
  ViewMatrix: Matrix3x3 | Matrix4x4,
}

export interface SkpJsonGpuOp {
  Name: string,
  ClientID: number,
  OpsTaskID: number,
  ChildID: number,
  // TODO(nifong): bounds, stack
}
export interface SkpJsonAuditTrail {
  Ops: SkpJsonGpuOp[],
}
export interface SkpJsonCommand {
  command: string // name
  shortDesc?: string // short description
  layerNodeId?: number,
  imageIndex?: number,
  key?: string, // text that goes along with a DrawAnnotation command
  auditTrail: SkpJsonAuditTrail,
}
// Return type of SkpDebugPlayer.jsonCommandList() after json.parse
export interface SkpJsonCommandList {
  commands: SkpJsonCommand[],
}
// Indentifier of a layer update evenet
export interface LayerKey {
  frame: number,
  nodeId: number,
}
// Info about layer events relevant to a particular layer and frame
// struct from LayerManager.h
export interface LayerSummary {
  nodeId: number,
  frameOfLastUpdate: number,
  fullRedraw: boolean,
  layerWidth: number,
  layerHeight: number,
}
// return type of imageUseInfoForFrame
// Keys are image ids, values are lists of command indices
export type ImageUseMap = Map<string, number[]>
