
export type PrismicQueryTypes =
& FragmentValue
& FragmentValues
& FragmentBefore
& FragmentAfter
& FragmentBeforeAfter
& FragmentGeo
& FragmentYear
& FragmentMonth
& FragmentDay<any>
& FragmentHour
& DocumentAndResults

export interface PrismicQuery {
  at?: FragmentValue<DateValue | DateValue[]>;
  not?: FragmentValue<DateValue | DateValue[]>;
  missing?: Fragment;
  has?: Fragment;
  any?: FragmentValues<DateValue>;
  in?: FragmentValues<string>;
  fulltext?: FragmentValue<string>;
  similar?: DocumentAndResults;
  dateBefore?: FragmentBefore;
  dateAfter?: FragmentAfter;
  dateBetween?: FragmentBeforeAfter;
  dayOfMonth?: FragmentDay<number>;
  dayOfMonthAfter?: FragmentDay<number>;
  dayOfMonthBefore?: FragmentDay<number>;
  dayOfWeek?: FragmentDay<string | number>;
  dayOfWeekAfter?: FragmentDay<string | number>;
  dayOfWeekBefore?: FragmentDay<string | number>;
  month?: FragmentMonth;
  monthBefore?: FragmentMonth;
  monthAfter?: FragmentMonth;
  year?: FragmentYear;
  hour?: FragmentHour;
  hourBefore?: FragmentHour;
  hourAfter?: FragmentHour;
  gt?: FragmentValue<number>;
  lt?: FragmentValue<number>;
  inRange?: FragmentBeforeAfter<number>;
  near?: FragmentGeo;
}

export type PrismicBlockType = 'text' | 'html' | 'image' | 'embed' | 'link'
export type PrismicBlock = Record<string, any>

// TODO: Find other block types
export type PrismicBlockText = Array<{
  type: string;
  text: string | number;
  spans: string[];
}>

export interface PrismicPage {
  alternate_langauges: any[];
  data?: PrismicBlock;
  first_publication_date: string;
  href: string;
  id: string;
  lang: string;
  last_publication_date: string;
  linked_documents: any[];
  slugs: string[];
  tags: string[];
  type: string;
  uid: string;
  // TODO: Extend in slices implementation
  body?: any[];
}

export interface PrismicDocument {
  results: PrismicPage[];
  page: number;
  results_per_page: number;
  results_size: number;
  total_results_size: number;
  total_pages: number;
  next_page: string | null;
  prev_page: string | null;
}

export interface PrismicSlice {
  slice_type: string;
  slice_label: string | null;
  primary: PrismicBlock;
  items: PrismicBlock[];
}

export interface PrismicMeta {
  page: number;
  results_per_page: number;
  results_size: number;
  total_results_size: number;
  total_pages: number;
  next_page: string;
  prev_page: string;
}

export interface ContentSearchParams {
  endpoint: string
  apiOptions: {
    accessToken: string
  }
  query?: PrismicQuery
  queryOptions?: any
  linkResolver?: string
}
export interface ApiContext {
  client: any
  config: ContentSearchParams
}
export interface Component {
  component: string
}
export type TransformBlock<T = any> = (block: T) => string;
