const fs = require('fs')
const readXlsxFile = require('read-excel-file/node')

const guaranteeSerialsPath = './static/uploads/serials'
const productSerialsPath = './static/uploads/serials_products'

const serialChecker = async (serial, type = 'guaranteeSerial') => {
  let exelsPath
  if (type === 'guaranteeSerial') exelsPath = guaranteeSerialsPath
  if (type === 'orginality') exelsPath = productSerialsPath

  const lowerSerial = serial.toLowerCase()
  // a promise to lowercase items and filter null or DateObjects
  const toLowerCaseArray = array => {
    return new Promise((resolve, reject) => {
      const newArray = []
      array.forEach((item, index) => {
        if (item !== null && typeof item === 'string') newArray.push(item.toLowerCase())
        if (item !== null && typeof item === 'number') newArray.push(item.toString())
        if (index === array.length - 1) return resolve(newArray)
      })
    })
  }

  // create an array of all exel files data
  const exelFilesData = []
  try {
    // get a list of all exel files
    const serialFiles = await fs.readdirSync(exelsPath)

    // push each exel file data to exelFilesData array
    let n0 = 0
    for await (const file of serialFiles) {
      // reading all exel files one by one
      const exelFile = await readXlsxFile(`${exelsPath}/${file}`)
      exelFilesData.push(exelFile)

      // flat exelFilesData and filter and lowerCase it's items
      if (n0 === serialFiles.length - 1) {
        const flattedArray = exelFilesData.flat(10000)
        const lowerCaseFlattedArray = await toLowerCaseArray(flattedArray)

        // loop throw lowerCased items to find exact match item
        let n1 = 0
        for await (const item of lowerCaseFlattedArray) {
          if (item === lowerSerial) return true
          if (n1 === lowerCaseFlattedArray.length - 1) return false
          n1++
        }
      }
      n0++
    }
  } catch (e) {
    throw new Error(e)
  }
}

module.exports.serialChecker = serialChecker
