import { CsvUtils, DataContainer, DataType, ParseOptions, AsyncParser } from '@tableau/taco-toolkit/handlers'

export default class CsvDataParser extends AsyncParser<Uint8Array> {
  async parse(fetcherResult: Uint8Array, { dataContainer }: ParseOptions): Promise<DataContainer> {
    const tableName = 'csv-data-table'

    const containerBuilder = AsyncParser.createContainerBuilder(dataContainer)
    const { tableBuilder } = containerBuilder.getTable(tableName)

    // fetcherResult contains the CSV content yielded from Fetcher
    const { headers, rows } = await CsvUtils.parse(fetcherResult, { hasHeader: true })
    if (!headers) {
      throw new Error('The parsing result does not include the expected headers.')
    }

    tableBuilder.addColumnHeaders(headers.map((id: string) => ({ id, dataType: DataType.String })))

    const dataRows = await CsvUtils.createDataRows(rows, headers)
    tableBuilder.addRows(dataRows)

    return containerBuilder.getDataContainer()
  }
}
