import { z } from "zod"

import { Image } from "@/types/image"

// Help me write this zod schema based on the type ContactConfig
export const validateContactConfigSchema = z.object({
  all_contact_config: z.object({
    items: z.array(
      z.object({
        email: z.object({
          name: z.string().nullable(),
          address: z.string().nullable(),
        }),
        email_loyalty: z.object({
          name: z.string().nullable(),
          address: z.string().nullable(),
        }),
        mailing_address: z.object({
          zip: z.string().nullable(),
          street: z.string().nullable(),
          name: z.string().nullable(),
          city: z.string().nullable(),
          country: z.string().nullable(),
        }),
        phone: z.object({
          number: z.string().nullable(),
          name: z.string().nullable(),
        }),
        phone_loyalty: z.object({
          number: z.string().nullable(),
          name: z.string().nullable(),
        }),
        visiting_address: z.object({
          zip: z.string().nullable(),
          country: z.string().nullable(),
          city: z.string().nullable(),
          street: z.string().nullable(),
        }),
      })
    ),
  }),
})

export enum ContactFieldGroupsEnum {
  email = "email",
  email_loyalty = "email_loyalty",
  mailing_address = "mailing_address",
  phone = "phone",
  phone_loyalty = "phone_loyalty",
  visiting_address = "visiting_address",
}

export type ContactFieldGroups = keyof typeof ContactFieldGroupsEnum

export type ContactConfigData = z.infer<typeof validateContactConfigSchema>

export type ContactConfig = ContactConfigData["all_contact_config"]["items"][0]

export type ContactFields = {
  display_text: string | null
  contact_field: string
}

export const validateHeaderConfigSchema = z.object({
  all_current_header: z.object({
    items: z.array(
      z.object({
        frontpage_link_text: z.string(),
        logoConnection: z.object({
          edges: z.array(
            z.object({
              node: z.object({
                description: z.string().optional().nullable(),
                dimension: z.object({
                  height: z.number(),
                  width: z.number(),
                }),
                metadata: z.any().nullable(),
                system: z.object({
                  uid: z.string(),
                }),
                title: z.string().nullable(),
                url: z.string().nullable(),
              }),
            })
          ),
        }),
        menu: z.object({
          links: z.array(
            z.object({
              href: z.string(),
              title: z.string(),
            })
          ),
        }),
        top_menu: z.object({
          links: z.array(
            z.object({
              link: z.object({
                href: z.string(),
                title: z.string(),
              }),
              show_on_mobile: z.boolean(),
              sort_order_mobile: z.number(),
            })
          ),
        }),
      })
    ),
  }),
})

export type HeaderDataRaw = z.infer<typeof validateHeaderConfigSchema>

export type HeaderData = Omit<
  HeaderDataRaw["all_current_header"]["items"][0],
  "logoConnection"
> & {
  logo: Image
}

const validateHeaderRefConfigSchema = z.object({
  all_current_header: z.object({
    items: z.array(
      z.object({
        system: z.object({
          content_type_uid: z.string(),
          uid: z.string(),
        }),
      })
    ),
  }),
})

export type HeaderRefDataRaw = z.infer<typeof validateHeaderRefConfigSchema>

const validateAppDownload = z.object({
  href: z.string(),
  imageConnection: z.object({
    edges: z.array(
      z.object({
        node: z.object({
          description: z.string().optional().nullable(),
          dimension: z.object({
            height: z.number(),
            width: z.number(),
          }),
          metadata: z.any().nullable(),
          system: z.object({
            uid: z.string(),
          }),
          title: z.string(),
          url: z.string(),
        }),
      })
    ),
  }),
})

const validateNavigationItem = z.object({
  links: z.array(z.object({ href: z.string(), title: z.string() })),
  title: z.string(),
})

export type NavigationItem = z.infer<typeof validateNavigationItem>

export const validateFooterConfigSchema = z.object({
  all_current_footer: z.object({
    items: z.array(
      z.object({
        title: z.string(),
        about: z.object({
          title: z.string(),
          text: z.string(),
        }),
        app_downloads: z.object({
          title: z.string(),
          app_store: validateAppDownload,
          google_play: validateAppDownload,
        }),
        logoConnection: z.object({
          edges: z.array(
            z.object({
              node: z.object({
                description: z.string().optional().nullable(),
                dimension: z.object({
                  height: z.number(),
                  width: z.number(),
                }),
                metadata: z.any().nullable(),
                system: z.object({
                  uid: z.string(),
                }),
                title: z.string(),
                url: z.string(),
              }),
            })
          ),
        }),
        navigation: z.array(validateNavigationItem),
        social_media: z.object({
          title: z.string(),
          facebook: z.object({ href: z.string(), title: z.string() }),
          instagram: z.object({ href: z.string(), title: z.string() }),
          twitter: z.object({ href: z.string(), title: z.string() }),
        }),
        trip_advisor: z.object({
          title: z.string(),
          logoConnection: z.object({
            edges: z.array(
              z.object({
                node: z.object({
                  description: z.string().optional().nullable(),
                  dimension: z.object({
                    height: z.number(),
                    width: z.number(),
                  }),
                  metadata: z.any().nullable(),
                  system: z.object({
                    uid: z.string(),
                  }),
                  title: z.string(),
                  url: z.string(),
                }),
              })
            ),
          }),
        }),
      })
    ),
  }),
})

export type FooterDataRaw = z.infer<typeof validateFooterConfigSchema>

export type FooterData = Omit<
  FooterDataRaw["all_current_footer"]["items"][0],
  "logoConnection"
> & {
  logo: Image
}

const validateFooterRefConfigSchema = z.object({
  all_current_footer: z.object({
    items: z.array(
      z.object({
        system: z.object({
          content_type_uid: z.string(),
          uid: z.string(),
        }),
      })
    ),
  }),
})

export type FooterRefDataRaw = z.infer<typeof validateFooterRefConfigSchema>
