const {
  convertToJS
} = require("../src/index.cjs")

function checkLines(response, lines) {
  const toCheck = response.split("\n")
  let count = 0
  for (let line of lines) {
    expect(toCheck[count++]).toBe(line)
  }
}

describe("Test that the string processing works correctly", () => {
  it("should convert string without HBS", () => {
    const response = convertToJS("Hello my name is Michael")
    expect(response).toBe("return `Hello my name is Michael`;")
  })

  it("basic example with square brackets", () => {
    const response = convertToJS("{{ [query] }}")
    checkLines(response, [
      "const var1 = $(\"[query]\");",
      "return `${var1}`;",
    ])
  })

  it("handle properties", () => {
    const response = convertToJS("{{ [query].id }}")
    checkLines(response, [
      "const var1 = $(\"[query].id\");",
      "return `${var1}`;",
    ])
  })

  it("should convert some basic HBS strings", () => {
    const response = convertToJS("Hello {{ name }}, welcome to {{ company }}!")
    checkLines(response, [
      "const var1 = $(\"name\");",
      "const var2 = $(\"company\");",
      "return `Hello ${var1}, welcome to ${var2}`;",
    ])
  })

  it("should handle many square brackets in helpers", () => {
    const response = convertToJS("Hello {{ avg [user].[_id] [user].[_rev] }}")
    checkLines(response, [
      "const var1 = helpers.avg($(\"[user].[_id]\"), $(\"[user].[_rev]\"));",
      "return `Hello ${var1}`;",
    ])
  })

  it("should handle one of the examples (after)", () => {
    const response = convertToJS("{{ after [1, 2, 3] 1}}")
    checkLines(response, [
      "const var1 = helpers.after([1, 2, 3], 1);",
      "return `${var1}`;",
    ])
  })

  it("should handle one of the examples (equalsLength)", () => {
    const response = convertToJS("{{equalsLength '[1,2,3]' 3}}")
    checkLines(response, [
      "const var1 = helpers.equalsLength('[1,2,3]', 3);",
      "return `${var1}`;"
    ])
  })

  it("should handle one of the examples (pluck)", () => {
    const response = convertToJS("{{pluck [{ 'name': 'Bob' }] 'name' }}")
    checkLines(response, [
      "const var1 = helpers.pluck([{ 'name': 'Bob' }], 'name');",
      "return `${var1}`;",
    ])
  })

  it("should handle sorting an array", () => {
    const response = convertToJS("{{ sort ['b', 'a', 'c'] }}")
    checkLines(response, [
      "const var1 = helpers.sort(['b', 'a', 'c']);",
      "return `${var1}`;",
    ])
  })

  it("should handle a helper block", () => {
    const response = convertToJS("This is the average: {{ avg array }}")
    checkLines(response, [
      "const var1 = helpers.avg($(\"array\"));",
      "return `This is the average: ${var1}`;",
    ])
  })

  it("should handle multi-variable helper", () => {
    const response = convertToJS("This is the average: {{ join ( avg val1 val2 val3 ) }}")
    checkLines(response, [
      "const var1 = helpers.join(helpers.avg($(\"val1\"), $(\"val2\"), $(\"val3\")));",
      "return `This is the average: ${var1}`;",
    ])
  })

  it("should handle a complex statement", () => {
    const response = convertToJS("This is the average: {{ join ( avg val1 val2 val3 ) val4 }}")
    checkLines(response, [
      "const var1 = helpers.join(helpers.avg($(\"val1\"), $(\"val2\"), $(\"val3\")), $(\"val4\"));",
      "return `This is the average: ${var1}`;",
    ])
  })

  it("should handle square brackets", () => {
    const response = convertToJS("This is: {{ [val thing] }}")
    checkLines(response, [
      "const var1 = $(\"[val thing]\");",
      "return `This is: ${var1}`;",
    ])
  })

  it("should handle square brackets with properties", () => {
    const response = convertToJS("{{ [user].[_id] }}")
    checkLines(response, [
      "const var1 = $(\"[user].[_id]\");",
      "return `${var1}`;",
    ])
  })

  it("should handle multiple complex statements", () => {
    const response = convertToJS("average: {{ avg ( abs val1 ) val2 }} add: {{ add 1 2 }}")
    checkLines(response, [
      "const var1 = helpers.avg(helpers.abs($(\"val1\")), $(\"val2\"));",
      "const var2 = helpers.add(1, 2);",
      "return `average: ${var1} add: ${var2}`;",
    ])
  })
})