import { z } from "zod"

import * as pageLinks from "@/server/routers/contentstack/schemas/pageLinks"

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

export const dynamicContentSchema = z.object({
  typename: z
    .literal(BlocksEnums.block.DynamicContent)
    .optional()
    .default(BlocksEnums.block.DynamicContent),
  dynamic_content: z.object({
    component: z.enum(DynamicContentEnum.Blocks.enums),
    subtitle: z.string().optional().default(""),
    title: z.string().optional().default(""),
    link: z
      .object({
        text: z.string().optional().default(""),
        linkConnection: z.object({
          edges: z.array(
            z.object({
              node: z
                .discriminatedUnion("__typename", [
                  pageLinks.accountPageSchema,
                  pageLinks.contentPageSchema,
                  pageLinks.hotelPageSchema,
                  pageLinks.loyaltyPageSchema,
                ])
                .transform((data) => {
                  const link = pageLinks.transform(data)
                  if (link) {
                    return link
                  }
                  return data
                }),
            })
          ),
        }),
      })
      .transform((data) => {
        if (data.linkConnection?.edges.length) {
          const link = data.linkConnection.edges?.[0]?.node
          return {
            href: link.url,
            text: data.text,
            title: link.title,
          }
        }
        return undefined
      }),
  }),
})

export const dynamicContentRefsSchema = z.object({
  dynamic_content: z.object({
    link: z
      .object({
        linkConnection: z.object({
          edges: z.array(
            z.object({
              node: z.discriminatedUnion("__typename", [
                pageLinks.accountPageRefSchema,
                pageLinks.contentPageRefSchema,
                pageLinks.hotelPageRefSchema,
                pageLinks.loyaltyPageRefSchema,
              ]),
            })
          ),
        }),
      })
      .transform((data) => {
        if (data.linkConnection?.edges.length) {
          return data.linkConnection.edges[0].node.system
        }
        return null
      }),
  }),
})
