// These functions will throw an error if the JSON doesn't match the DebugTrace interface, even if
// the JSON is valid.

import {
  Convert as GencodeConvert,
  DebugTrace,
  Function as FunctionInfo,
  Slot as SlotInfo,
} from './generate/debug-trace-quicktype';

export { DebugTrace, FunctionInfo, SlotInfo };

export class Convert extends GencodeConvert {
  public static toDebugTrace(json: string): DebugTrace {
    // Use the quicktype library to parse and check the validity of the passed-in JSON.
    const out = GencodeConvert.toDebugTrace(json);

    // Confirm the version of the JSON trace data.
    const expectedVersion: string = '20220209';
    if (out.version != expectedVersion) {
      throw Error(
        `Version mismatch. Trace version is '${out.version}', expected version ` +
          `is '${expectedVersion}'`
      );
    }

    // The trace data consists of three values--one trace-op and two data fields.
    // https://github.com/google/skia/blob/2ac310266912687a2266d45f5008b942d56fc35e/src/sksl/tracing/SkVMDebugTrace.h#L52-L53
    // Our JSON trace arrays omit trailing zeros from the data to save space. Re-insert them here.
    for (let index = 0; index < out.trace.length; ++index) {
      while (out.trace[index].length < 3) {
        out.trace[index].push(0);
      }
    }

    // If the groupIdx field is missing from a slot, have it mirror `index` (the component index).
    for (let index = 0; index < out.slots.length; ++index) {
      if ((out.slots[index].groupIdx ?? -1) < 0) {
        out.slots[index].groupIdx = out.slots[index].index;
      }
    }

    return out;
  }
}
