import { z } from "zod"

import { BlocksEnums } from "@/types/enums/blocks"

export const tableSchema = z.object({
  typename: z
    .literal(BlocksEnums.block.Table)
    .optional()
    .default(BlocksEnums.block.Table),
  table: z
    .object({
      heading: z.string().optional(),
      preamble: z.string().optional().default(""),
      column_widths: z.array(z.number()),
      table: z.object({
        tableState: z.object({
          columns: z.array(
            z.object({
              id: z.string(),
              label: z.string().default(""),
              accessor: z.string(),
              dataType: z.string(),
            })
          ),
          data: z.array(z.object({}).catchall(z.string())),
          skipReset: z.boolean(),
          tableActionEnabled: z.boolean(),
          headerRowAdded: z.boolean().optional().default(false),
        }),
      }),
    })
    .transform((data) => {
      const totalWidth = data.column_widths.reduce(
        (acc, width) => acc + width,
        0
      )
      const columns = data.table.tableState.columns.map((col, idx) => ({
        id: col.id,
        header: col.label || "",
        width: data.column_widths[idx] || 0,
      }))

      const rows = data.table.tableState.data.map((rowData) =>
        columns.reduce<Record<string, string>>((transformedRow, column) => {
          transformedRow[column.id] = rowData[column.id] || ""
          return transformedRow
        }, {})
      )

      return {
        heading: data.heading,
        preamble: data.preamble,
        columns,
        rows,
        totalWidth,
      }
    }),
})
