import {
  setupApphierarchy,
  basicAppHierarchyCreator_WithFields,
  getNewFieldAndAdd,
} from "./specHelpers"
import { joinKey } from "../src/common"
import { isFunction, isArray } from "lodash"

describe("recordApi > getContext", () => {
  it("'referenceExists()' should return true when the reference is in the index", async () => {
    const { recordApi, appHierarchy } = await setupApphierarchy(
      basicAppHierarchyCreator_WithFields
    )

    const customer = recordApi.getNew(
      appHierarchy.customerRecord.collectionNodeKey(),
      "customer"
    )
    customer.isalive = true
    await recordApi.save(customer)

    const invoiceCollectionKey = joinKey(customer.key, "invoices")
    const invoice = recordApi.getNew(invoiceCollectionKey, "invoice")

    const context = await recordApi.getContext(invoice.key)

    expect(isFunction(context.referenceExists)).toBeTruthy()
    const result = await context.referenceExists("customer", customer.key)
    expect(result).toBe(true)
  })

  it("'referenceExists()' should return false when the reference is not in the index", async () => {
    const { recordApi, appHierarchy } = await setupApphierarchy(
      basicAppHierarchyCreator_WithFields
    )

    const customer = recordApi.getNew(
      appHierarchy.customerRecord.collectionNodeKey(),
      "customer"
    )
    customer.isalive = true
    await recordApi.save(customer)

    const invoiceCollectionKey = joinKey(customer.key, "invoices")
    const invoice = recordApi.getNew(invoiceCollectionKey, "invoice")

    const context = await recordApi.getContext(invoice.key)

    const result = await context.referenceExists("customer", "not a key")
    expect(result).toBe(false)
  })

  it("referenceOptions() should return list of indexed {key, value}", async () => {
    const { recordApi, appHierarchy } = await setupApphierarchy(
      basicAppHierarchyCreator_WithFields
    )

    const customer = recordApi.getNew(
      appHierarchy.customerRecord.collectionNodeKey(),
      "customer"
    )
    customer.surname = "Leedog"
    customer.isalive = true
    await recordApi.save(customer)

    const invoiceCollectionKey = joinKey(customer.key, "invoices")
    const invoice = recordApi.getNew(invoiceCollectionKey, "invoice")

    const context = await recordApi.getContext(invoice.key)

    expect(isFunction(context.referenceOptions)).toBeTruthy()
    const result = await context.referenceOptions("customer")
    expect(isArray(result)).toBeTruthy()
    expect(result[0].key).toBe(customer.key)
    expect(result[0].value).toBe(customer.surname)
  })

  it("referenceOptions() should return an empty list when no records are in the index", async () => {
    const { recordApi, appHierarchy } = await setupApphierarchy(
      basicAppHierarchyCreator_WithFields
    )

    const customer = recordApi.getNew(
      appHierarchy.customerRecord.collectionNodeKey(),
      "customer"
    )
    customer.surname = "Leedog"
    customer.isalive = false
    await recordApi.save(customer)

    const invoiceCollectionKey = joinKey(customer.key, "invoices")
    const invoice = recordApi.getNew(invoiceCollectionKey, "invoice")

    const context = await recordApi.getContext(invoice.key)

    expect(isFunction(context.referenceOptions)).toBeTruthy()
    const result = await context.referenceOptions("customer")
    expect(isArray(result)).toBeTruthy()
    expect(result.length).toBe(0)
  })
})