import { z } from "zod"

import { MembershipLevelEnum } from "@/constants/membershipLevels"

import { countriesMap } from "@/components/TempDesignSystem/Form/Country/countries"

export const getUserSchema = z.object({
  address: z.object({
    city: z.string().optional(),
    country: z.string().optional(),
    countryCode: z.nativeEnum(countriesMap).optional(),
    streetAddress: z.string().optional(),
    zipCode: z.string().optional(),
  }),
  dateOfBirth: z.string().optional().default("N/A"),
  email: z.string().email(),
  firstName: z.string(),
  language: z.string(),
  lastName: z.string(),
  memberships: z.array(
    z.object({
      currentPoints: z.number(),
      expirationDate: z.string(),
      membershipNumber: z.string(),
      membershipLevel: z.nativeEnum(MembershipLevelEnum).optional(),
      memberSince: z.string(),
      membershipType: z.string(),
    })
  ),
  phoneNumber: z.string().optional(),
  profileId: z.string(),
})

// Schema is the same for upcoming and previous stays endpoints
export const getStaysSchema = z.object({
  data: z.array(
    z.object({
      attributes: z.object({
        hotelOperaId: z.string(),
        hotelInformation: z.object({
          hotelContent: z.object({
            images: z.object({
              metaData: z.object({
                title: z.string(),
                altText: z.string(),
                altText_En: z.string(),
                copyRight: z.string(),
              }),
              imageSizes: z.object({
                tiny: z.string(),
                small: z.string(),
                medium: z.string(),
                large: z.string(),
              }),
            }),
          }),
          hotelName: z.string(),
          cityName: z.string().nullable(),
        }),
        confirmationNumber: z.string(),
        checkinDate: z.string(),
        checkoutDate: z.string(),
        isWebAppOrigin: z.boolean(),
      }),
      relationships: z.object({
        hotel: z.object({
          links: z.object({
            related: z.string(),
          }),
          data: z.object({
            id: z.string(),
            type: z.string(),
          }),
        }),
      }),
      type: z.string(),
      id: z.string(),
      links: z.object({
        self: z.object({
          href: z.string(),
          meta: z.object({
            method: z.string(),
          }),
        }),
      }),
    })
  ),
  links: z
    .object({
      self: z.string(),
      offset: z.number(),
      limit: z.number(),
      totalCount: z.number(),
    })
    .nullable(),
})

type GetStaysData = z.infer<typeof getStaysSchema>

export type Stay = GetStaysData["data"][number]

export const getFriendTransactionsSchema = z.object({
  data: z.array(
    z.object({
      attributes: z.object({
        awardPoints: z.number().default(0),
        checkinDate: z.string().default(""),
        checkoutDate: z.string().default(""),
        confirmationNumber: z.string().default(""),
        hotelOperaId: z.string().default(""),
        nights: z.number().default(1),
        pointsCalculated: z.boolean().default(true),
        hotelInformation: z
          .object({
            city: z.string().default(""),
            name: z.string().default(""),
            hotelContent: z.object({
              images: z.object({
                metaData: z.object({
                  title: z.string(),
                  altText: z.string(),
                  altText_En: z.string(),
                  copyRight: z.string(),
                }),
                imageSizes: z.object({
                  tiny: z.string(),
                  small: z.string(),
                  medium: z.string(),
                  large: z.string(),
                }),
              }),
            }),
          })
          .optional(),
      }),
      relationships: z.object({
        booking: z.object({
          data: z.object({
            id: z.string().default(""),
            type: z.string().default(""),
          }),
          links: z.object({
            related: z.string().default(""),
          }),
        }),
        hotel: z
          .object({
            data: z.object({
              id: z.string().default(""),
              type: z.string().default(""),
            }),
            links: z.object({
              related: z.string().default(""),
            }),
          })
          .optional(),
      }),
      type: z.string().default(""),
    })
  ),
  links: z
    .object({
      self: z.string(),
      offset: z.number(),
      limit: z.number(),
      totalCount: z.number(),
    })
    .nullable(),
})

export const getCreditCardsSchema = z.object({
  data: z.array(
    z.object({
      attribute: z.object({
        cardName: z.string().optional(),
        alias: z.string(),
        truncatedNumber: z.string(),
        expirationDate: z.string(),
        cardType: z.string(),
      }),
    })
  ),
})

export const getMembershipCardsSchema = z.array(
  z.object({
    currentPoints: z.number(),
    expirationDate: z.string(),
    membershipNumber: z.string(),
    memberSince: z.string(),
    membershipType: z.string(),
  })
)
