import { parse, initPromise } from './wasm'
import { enginelessExecutor } from '../lib/testHelpers'

beforeAll(async () => {
  await initPromise
})

describe('testing artifacts', () => {
  // Enable rotations #152
  test('sketch artifacts', async () => {
    const code = `
const mySketch001 = startSketchOn('XY')
  |> startProfileAt([0, 0], %)
  |> lineTo([-1.59, -1.54], %)
  |> lineTo([0.46, -5.82], %)
  // |> rx(45, %)`
    const programMemory = await enginelessExecutor(parse(code))
    // @ts-ignore
    const sketch001 = programMemory?.get('mySketch001')
    expect(sketch001).toEqual({
      type: 'UserVal',
      __meta: [{ sourceRange: [46, 71] }],
      value: {
        type: 'SketchGroup',
        on: expect.any(Object),
        start: {
          to: [0, 0],
          from: [0, 0],
          tag: null,
          __geoMeta: {
            id: expect.any(String),
            sourceRange: [46, 71],
          },
        },
        value: [
          {
            type: 'ToPoint',
            tag: null,
            to: [-1.59, -1.54],
            from: [0, 0],
            __geoMeta: {
              sourceRange: [77, 102],
              id: expect.any(String),
            },
          },
          {
            type: 'ToPoint',
            to: [0.46, -5.82],
            from: [-1.59, -1.54],
            tag: null,
            __geoMeta: {
              sourceRange: [108, 132],
              id: expect.any(String),
            },
          },
        ],
        id: expect.any(String),
        __meta: [{ sourceRange: [46, 71] }],
      },
    })
  })
  test('extrude artifacts', async () => {
    // Enable rotations #152
    const code = `
const mySketch001 = startSketchOn('XY')
  |> startProfileAt([0, 0], %)
  |> lineTo([-1.59, -1.54], %)
  |> lineTo([0.46, -5.82], %)
  // |> rx(45, %)
  |> extrude(2, %)`
    const programMemory = await enginelessExecutor(parse(code))
    // @ts-ignore
    const sketch001 = programMemory?.get('mySketch001')
    expect(sketch001).toEqual({
      type: 'ExtrudeGroup',
      id: expect.any(String),
      value: [
        {
          type: 'extrudePlane',
          faceId: expect.any(String),
          tag: null,
          id: expect.any(String),
          sourceRange: [77, 102],
        },
        {
          type: 'extrudePlane',
          faceId: expect.any(String),
          tag: null,
          id: expect.any(String),
          sourceRange: [108, 132],
        },
      ],
      sketchGroup: {
        id: expect.any(String),
        __meta: expect.any(Array),
        on: expect.any(Object),
        start: expect.any(Object),
        type: 'SketchGroup',
        value: [
          {
            type: 'ToPoint',
            from: [0, 0],
            to: [-1.59, -1.54],
            tag: null,
            __geoMeta: {
              id: expect.any(String),
              sourceRange: [77, 102],
            },
          },
          {
            type: 'ToPoint',
            from: [-1.59, -1.54],
            to: [0.46, -5.82],
            tag: null,
            __geoMeta: {
              id: expect.any(String),
              sourceRange: [108, 132],
            },
          },
        ],
      },
      height: 2,
      startCapId: expect.any(String),
      endCapId: expect.any(String),
      __meta: [{ sourceRange: [46, 71] }],
    })
  })
  test('sketch extrude and sketch on one of the faces', async () => {
    // Enable rotations #152
    // TODO #153 in order for getExtrudeWallTransform to work we need to query the engine for the location of a face.
    const code = `
const sk1 = startSketchOn('XY')
  |> startProfileAt([0, 0], %)
  |> lineTo([-2.5, 0], %)
  |> lineTo([0, 10], %, $p)
  |> lineTo([2.5, 0], %)
  // |> rx(45, %)
  // |> translate([1,0,1], %)
  // |> ry(5, %)
const theExtrude = extrude(2, sk1)
// const theTransf = getExtrudeWallTransform('p', theExtrude)
const sk2 = startSketchOn('XY')
  |> startProfileAt([0, 0], %)
  |> lineTo([-2.5, 0], %)
  |> lineTo([0, 3], %, $o)
  |> lineTo([2.5, 0], %)
  // |> transform(theTransf, %)
  |> extrude(2, %)

`
    const programMemory = await enginelessExecutor(parse(code))
    // @ts-ignore
    const geos = [programMemory?.get('theExtrude'), programMemory?.get('sk2')]
    expect(geos).toEqual([
      {
        type: 'ExtrudeGroup',
        id: expect.any(String),
        value: [
          {
            type: 'extrudePlane',
            faceId: expect.any(String),
            tag: null,
            id: expect.any(String),
            sourceRange: [69, 89],
          },
          {
            type: 'extrudePlane',
            faceId: expect.any(String),
            tag: {
              end: 116,
              start: 114,
              type: 'TagDeclarator',
              value: 'p',
              digest: null,
            },
            id: expect.any(String),
            sourceRange: [95, 117],
          },
          {
            type: 'extrudePlane',
            faceId: expect.any(String),
            tag: null,
            id: expect.any(String),
            sourceRange: [123, 142],
          },
        ],
        sketchGroup: {
          id: expect.any(String),
          __meta: expect.any(Array),
          on: expect.any(Object),
          start: expect.any(Object),
          type: 'SketchGroup',
          tags: {
            p: {
              __meta: [
                {
                  sourceRange: [114, 116],
                },
              ],
              type: 'TagIdentifier',
              value: 'p',
              info: expect.any(Object),
            },
          },
          value: [
            {
              type: 'ToPoint',
              from: [0, 0],
              to: [-2.5, 0],
              tag: null,
              __geoMeta: {
                id: expect.any(String),
                sourceRange: [69, 89],
              },
            },
            {
              type: 'ToPoint',
              from: [-2.5, 0],
              to: [0, 10],
              tag: {
                end: 116,
                start: 114,
                type: 'TagDeclarator',
                value: 'p',
                digest: null,
              },
              __geoMeta: {
                id: expect.any(String),
                sourceRange: [95, 117],
              },
            },
            {
              type: 'ToPoint',
              from: [0, 10],
              to: [2.5, 0],
              tag: null,
              __geoMeta: {
                id: expect.any(String),
                sourceRange: [123, 142],
              },
            },
          ],
        },
        height: 2,
        startCapId: expect.any(String),
        endCapId: expect.any(String),
        __meta: [{ sourceRange: [38, 63] }],
      },
      {
        type: 'ExtrudeGroup',
        id: expect.any(String),
        value: [
          {
            type: 'extrudePlane',
            faceId: expect.any(String),
            tag: null,
            id: expect.any(String),
            sourceRange: [373, 393],
          },
          {
            type: 'extrudePlane',
            faceId: expect.any(String),
            tag: {
              end: 419,
              start: 417,
              type: 'TagDeclarator',
              value: 'o',
              digest: null,
            },
            id: expect.any(String),
            sourceRange: [399, 420],
          },
          {
            type: 'extrudePlane',
            faceId: expect.any(String),
            tag: null,
            id: expect.any(String),
            sourceRange: [426, 445],
          },
        ],
        sketchGroup: {
          id: expect.any(String),
          __meta: expect.any(Array),
          on: expect.any(Object),
          start: expect.any(Object),
          type: 'SketchGroup',
          tags: {
            o: {
              __meta: [
                {
                  sourceRange: [417, 419],
                },
              ],
              type: 'TagIdentifier',
              value: 'o',
              info: expect.any(Object),
            },
          },
          value: [
            {
              type: 'ToPoint',
              from: [0, 0],
              to: [-2.5, 0],
              tag: null,
              __geoMeta: {
                id: expect.any(String),
                sourceRange: [373, 393],
              },
            },
            {
              type: 'ToPoint',
              from: [-2.5, 0],
              to: [0, 3],
              tag: {
                end: 419,
                start: 417,
                type: 'TagDeclarator',
                value: 'o',
                digest: null,
              },
              __geoMeta: {
                id: expect.any(String),
                sourceRange: [399, 420],
              },
            },
            {
              type: 'ToPoint',
              from: [0, 3],
              to: [2.5, 0],
              tag: null,
              __geoMeta: {
                id: expect.any(String),
                sourceRange: [426, 445],
              },
            },
          ],
        },
        height: 2,
        startCapId: expect.any(String),
        endCapId: expect.any(String),
        __meta: [{ sourceRange: [342, 367] }],
      },
    ])
  })
})
