import * as penpot from "#self";
import { createWriteStream } from 'fs';
import { Writable } from "stream";

// Example of creating component and instance out of order

(async function() {
  const context = penpot.createBuildContext();

  {
    context.addFile({name: "Test File 1"});
    context.addPage({name: "Foo Page"})

    const mainBoardId = context.genId();
    const mainRectId = context.genId();

    // First create instance (just for with the purpose of teaching
    // that it can be done, without putting that under obligation to
    // do it in this order or the opposite)

    context.addBoard({
      name: "Board Instance 1",
      x: 700,
      y: 0,
      width: 500,
      height: 300,
      shapeRef: mainBoardId,
      touched: ["name-group"]
    })

    context.addRect({
      name: "Rect Instance 1",
      x: 800,
      y: 20,
      width:100,
      height:200,
      shapeRef: mainRectId,
      touched: ["name-group"]
    });

    // this function call takes the current board from context, but it
    // also can be passed as parameter on an explicit way if you
    // prefer
    context.addComponentInstance({
      componentId: "00000000-0000-0000-0000-000000000001"
    });

    context.closeBoard();

    // Then, create the main instance
    context.addBoard({
      id: mainBoardId,
      name: "Board",
      x: 0,
      y: 0,
      width: 500,
      height: 300,
    })

    context.addRect({
      id: mainRectId,
      name: "Rect 1",
      x: 20,
      y: 20,
      width:100,
      height:200,
    });

    context.addComponent({
      componentId: "00000000-0000-0000-0000-000000000001",
      name: "Component 1",
    });

    context.closeBoard();
    context.closeFile();
  }

  {
    // Create a file stream to write the zip to
    const output = createWriteStream('sample-with-components.zip');
    // Wrap Node's stream in a WHATWG WritableStream
    const writable = Writable.toWeb(output);
    await penpot.exportStream(context, writable);
  }

})().catch((cause) => {
  console.error(cause);

  const causeExplain = cause.explain;
  if (causeExplain) {
    console.log("EXPLAIN:")
    console.error(cause.explain);
  }

  // const innerCause = cause.cause;
  // if (innerCause) {
  //   console.log("INNER:");
  //   console.error(innerCause);
  // }
  process.exit(-1);
}).finally(() => {
  process.exit(0);
})