export interface ExtractedImage {
  url: string;
  alt: string;
}

export interface ExtractedRichTextType {
  component: "richText";
  richText: string;
  darkBackground?: boolean;
}

export interface ExtractedFloatingImagesType {
  component: "floatingImages";
  heading: string;
  description?: string;
  images: ExtractedImage[];
}

export interface ExtractedBannerType {
  component: "banner";
  title: string;
  description: string;
  slug: string;
  image: {
    desktopImage: ExtractedImage;
    mobileImage?: ExtractedImage | null;
  };
  notice?: string;
}

export interface ExtractedTextField {
  component: "textField";
  textField: string;
}

export interface ExtractedGalleryType {
  component: "gallery";
  title: string;
  description?: string;
  gallery: ExtractedImage[];
  darkBackground?: boolean;
}

export interface ExtractedBasicCardType {
  component: "basicCard";
  title: string;
  description?: string;
  target: string;
  url: string;
  image: ExtractedImage;
  subtitle?: string;
  ctaLabel?: string;
}

export interface ExtractedBasicCardSectionType {
  component: "basicCardSection";
  cards: ExtractedBasicCardType[];
  title?: string;
  description?: string;
}

export interface ExtractedMomentsActionsSectionType {
  component: "momentsActionsSection";
  actions: ExtractedBasicCardType[];
}

export interface ExtractedSliderType {
  component: "slider";
  slides: ExtractedBannerType[];
}

export interface ExtractedMomentsVideoType {
  component: "momentVideo";
  title: string;
  description: string;
  sourceURL: string;
  thumbnail: ExtractedImage;
}

export interface ExtractedImageComponentType {
  component: "image";
  desktopImage: ExtractedImage;
  mobileImage?: ExtractedImage;
}

export interface ExtractedIconRichTextBlockType {
  component: "iconRichtextBlock";
  image: ExtractedImage;
  info: string;
  title?: string;
}

export interface ExtractedIconRichTextGridType {
  component: "iconRichtextGrid";
  infoBlock: ExtractedIconRichTextBlockType[];
}

export interface ExtractedManagementChargeType {
  component: "managementCharge";
  infoGrid: {
    image?: ExtractedImage | null;
    info: string;
  }[][];
  title: string;
  backgroundImage: ExtractedImage;
}

export interface ExtractedFeatureEvent {
  note: string;
  image: ExtractedImage;
}

export interface ExtractedCuratedExperienceCategory {
  name: string;
  icon: {
    url: string;
    alt: string;
  };
}

export interface ExtractedCuratedExperienceSectionsType {
  component: "curatedExperience";
  title: string;
  description?: string;
  experiences: {
    documentId: string;
    name: string;
    slug: string;
    eventStartDate: string;
    finalSpots: boolean;
    soldOut: boolean;
    isActive: boolean;
    isFavorite: boolean;
    isInterested: boolean;
    isFeature: boolean;
    maxTicketPerHead: number;
    thumbnail: ExtractedImage;
    feature?: ExtractedFeatureEvent | null;
    categories: ExtractedCuratedExperienceCategory[] | undefined;
  }[];
}

export interface ExtractedDestinationSectionsType {
  component: "destinationsSection";
  title: string;
  description?: string;
  resorts: {
    id: number;
    documentId: string;
    name: string;
    slug: string;
    isFeatured: boolean;
    isFavorite: boolean;
    description: string;
    thumbnail: ExtractedImage;
    featuredImage?: ExtractedImage;
    displayAddress: string;
    imageGallery?: ExtractedImage[];
  }[];
}

export interface ExtractedReciprocalsSectionsType {
  component: "reciprocalsSection";
  title: string;
  description?: string;
  reciprocals: {
    documentId: string;
    name: string;
    content: string;
    exploreRedirectionURL: string;
    banner: ExtractedImage;
    thumbnail: ExtractedImage;
    logo?: ExtractedImage | null;
    inclusions?: string;
    bookings?: string;
  }[];
}

export interface ExtractedArticlesType {
  documentId: string;
  description: string;
  heading: string;
  slug: string;
  isFeatured: boolean;
  thumbnail: ExtractedImage;
  publishedAt?: string;
}

export interface ExtractedCommunitySectionsType {
  component: "communitySection";
  title: string;
  description?: string;
  communityArticles: ExtractedArticlesType[];
}

export interface ExtractedPressFeaturesSectionsType {
  component: "pressFeaturesSection";
  title: string;
  description?: string;
  articles: ExtractedArticlesType[];
}

export interface ExtractedMemberOffersSectionsType {
  component: "memberOffers";
  title: string;
  offers: ExtractedBasicCardType[];
}

export interface ExtractedExternalPartnersSectionsType {
  component: "externalPartners";
  title: string;
  partners: ExtractedBasicCardType[];
}

export interface ExtractedSeoType {
  id: number;
  metaTitle: string;
  metaDescription: string;
  shareImage?: ExtractedImage | null;
  metaSocial?:
    | {
        id: number;
        socialNetwork: string;
        title: string;
        description: string;
        image?: ExtractedImage;
      }[]
      | null;
}

export interface ExtractedHomePagePrivilegeSectionType {
  component: "homePagePrivileges";
  id: number;
  title: string;
  description: string;
  subtitle?: string;
  images: ExtractedImage[];
}

export interface ExtractedAboutPageTimelineEventsType {
  id: number;
  year: string;
  title: string;
  description: string;
  event_image: ExtractedImage;
}

export interface ExtractedAboutPageTimelineSectionType {
  component: "aboutTimeline";
  events: ExtractedAboutPageTimelineEventsType[];
}

export interface ExtractAboutPageWhoWeAreSectionType {
  component: "aboutWhoWeAreSection";
  title: string;
  description?: string;
  image1: ExtractedImage;
  image2?: ExtractedImage;
}

export interface ExtractedKarmaCaresType {
  id: number;
  documentId: string;
  title: string;
  subtitle?: string;
  eventDate: string;
  slug: string;
  publishedAt: string;
  thumbnail: ExtractedImage;
  layout?: (ExtractedRichTextType | ExtractedFloatingImagesType)[];
  relatedKarmaCares?: ExtractedKarmaCaresType[];
  bannerImage?: ExtractedImageComponentType;
  description?: string;
  redirectUrl?: string;
}

export interface ExtractedKarmaCaresSectionType {
  component: "karmaCaresSection";
  title: string;
  description?: string;
  cares: ExtractedKarmaCaresType[];
}

export interface ExtractedAboutMomentsSection {
  component: "aboutPageMomentsSection";
  title: string;
  description: string;
  image: ExtractedImage;
}

export interface ExtractedKarmaBoutiqueType {
  documentId: string;
  name: string;
  shortDescription: string;
  longDescription: string;
  publishedAt: string;
  slug: string;
  thumbnail: ExtractedImage;
  moreInformation?: {
    title: string;
    description: string;
    icon: ExtractedImage;
  }[];
  image1?: ExtractedImage;
  image2?: ExtractedImage;
}

export interface ExtractedKarmaBoutiqueSectionsType {
  component: "karmaBoutiqueSection";
  title: string;
  description?: string;
  boutiques: ExtractedKarmaBoutiqueType[];
}

export interface ExtractedVideoSectionType {
  component: "videoSection";
  title: string;
  description?: string;
  link: string;
  cta: {
    label: string;
    link: string;
    isExternal: boolean;
    icon: ExtractedImage;
  };
}

export interface ExtractedTitleWithRichTextSection {
  component: "titleWithRichtextSection";
  title?: string;
  description?: string;
  cards: {
    title?: string;
    description?: string;
    icon?: ExtractedImage;
  }[];
  image?: ExtractedImage;
}

export interface ExtractedTextBlockSection {
  component: "textBlockSection";
  title?: string;
  description: string;
  textBlock: {
    title: string;
    description: string;
  }[];
}

export interface ExtractedTextBlock {
  component: "textBlock";
  title?: string;
  description?: string;
}

export interface ExtractedVideoTypes {
  component: "video";
  video: ExtractedImage;
  thumbnail?: ExtractedImage;
}

export interface ExtractedCtaButtonType {
  component: "ctaButton";
  label: string;
  link: string;
  isExternal: boolean;
  icon: ExtractedImage;
  darkBackground?: boolean;
}

export interface ExtractedSectionTitleType {
  component: "sectionTitle";
  title: string;
  darkBackground?: boolean;
}

export type ExtractedChroniclesLayoutType = (
  | ExtractedRichTextType
  | ExtractedVideoTypes
  | ExtractedFloatingImagesType
  | ExtractedCtaButtonType
  | ExtractedGalleryType
  | ExtractedSectionTitleType
  | ExtractedAwardsSectionsType
  | ExtractedMemberOffersSectionsType
  | ExtractedBannerType
)[];

export interface ExtractedChroniclesType {
  id: number;
  documentId: string;
  heading: string;
  slug: string;
  description: string;
  createdAt?: string;
  updatedAt?: string;
  publishedAt?: string;
  thumbnail: ExtractedImage;
  bannerImage?: ExtractedImageComponentType;
  layout?: ExtractedChroniclesLayoutType;
}

export interface ExtractedAwardsType {
  id: number;
  documentId: string;
  awardTitle: string;
  awardCategory: string;
  winnerName: string;
  organization?: string;
  winningPosition?: string;
  createdAt?: string;
  updatedAt?: string;
  publishedAt?: string;
  winningYear: string;
  thumbnail: ExtractedImage;
}

export interface ExtractedAwardsSectionsType {
  component: "awardsSection";
  title?: string;
  description?: string;
  awards?: ExtractedAwardsType[];
}

export interface ExtractedFormSection {
  component: "formSection";
  title?: string;
  description?: string;
}

export interface ExtractedPartnersListingSection {
  component: "partnersListingSection";
  title?: string;
  description?: string;
}

export interface ExtractedStrategicPartnersSection {
  component: "strategicPartnersSection";
  title?: string;
  description?: string;
  partners: {
    label?: string;
    link: string;
    isExternal: boolean;
    icon: ExtractedImage;
  }[];
}

export interface ExtractedGetInTouchSection {
  component: "letsConnectSection";
  title: string;
  description?: string;
  subtitle?: string;
  backgroundImage: ExtractedImageComponentType;
  contactButtons: {
    textField: string;
  }[];
}

export interface ExtractedFaqSectionType {
  component: "faqsSection";
  faqs: {
    question: string;
    answer: string;
  }[];
}

export interface ExtractedMembershipBenefitsType {
  component: "membershipBenefitsSection";
  title: string;
  description?: string;
  image: ExtractedImage;
  cards: {
    text: string;
    image: ExtractedImage;
  }[];
}
