import { BlazePlayerEvent, BlazePlayerEventType } from './blaze-player-event';
import { BlazeWidgetLabel } from '../classes/blaze-widget-label';
import { BlazeRecommendationsType } from '../classes/blaze-recommendations-type'
import { BlazeCTAActionType } from './common.interface';

export interface StoryPageType {
  storyId: string;
  pageId?: string;
}

export type PresetRowWidgetLayout = 'widgetRectangle' | 'widgetCircle';

export type PresetGridWidgetLayout = 'twoColumnsTheme' | 'threeColumnsTheme';

export type OnDataLoadStartedEvent = Readonly<{
  widgetId: string;
}>;

export type OnDataLoadCompleteEvent = Readonly<{
  widgetId: string;
  itemsCount: number;
  error?: string;
}>;

export type OnPlayerDidAppearEvent = Readonly<{
  widgetId: string;
}>;

export type OnPlayerDidDismissEvent = Readonly<{
  widgetId: string;
}>;

export type OnItemClickedEvent = Readonly<{
  widgetId: string;
  widgetItemId: string;
  widgetItemTitle?: string;
}>;

export type OnTriggerCTAEvent = Readonly<{
  widgetId: string;
  actionType: BlazeCTAActionType;
  actionParam: string;
}>;

export type OnTriggerPlayerBodyTextLinkEvent = Readonly<{
  widgetId: string;
  actionParam: string;
}>;

export type OnPlayerEventTriggeredEvent = Readonly<{
  widgetId: string;
  playerEvent: BlazePlayerEvent;
}>;

export type OnPlayerEventTriggeredEventInternal = Readonly<{
  widgetId: string;
  playerEventType: BlazePlayerEventType;
  playerEventParams: string;
}>;

export type OnHeightChangedEventInternal = Readonly<{
  newHeight: number
}>;

export type BlazeDataSourceType =
  {
    labels: BlazeWidgetLabel;
    orderType?: BlazeOrderType;
    labelsPriority?: BlazeWidgetLabel[];
    maxItems?: number;
  }
  |
  {
    ids: string[],
    orderType?: BlazeOrderType
  }
  |
  {
    recommendationsType: BlazeRecommendationsType
  };

type BlazeOrderType = 'manual' // Manual order. Items are arranged manually according to a custom-defined order.
  | 'recentlyUpdatedFirst' // Recently updated items appear first. Items are ordered based on their most recent update timestamp, with the most recently updated items appearing at the beginning.
  | 'recentlyUpdatedLast' // Recently updated items appear last. Items are ordered based on their most recent update timestamp, with the most recently updated items appearing at the end.
  | 'aToZ' // Items are arranged in alphabetical order from A to Z based on their titles.
  | 'zToA' // Items are arranged in alphabetical order from Z to A based on their titles.
  | 'recentlyCreatedFirst' // Recently created items appear first. Sorts the items by their last creation time in descending order, meaning the most recently created items will be displayed first.
  | 'recentlyCreatedLast' // Recently created items appear last. Sorts the items by their last creation time in ascending order, meaning the least recently created items will be displayed first.
  | 'random'; // Items are ordered randomly.

export interface BlazeWidgetDelegate {
  onDataLoadStarted?: (event: OnDataLoadStartedEvent) => void;
  onDataLoadComplete?: (event: OnDataLoadCompleteEvent) => void;
  onPlayerDidAppear?: (event: OnPlayerDidAppearEvent) => void;
  onPlayerDidDismiss?: (event: OnPlayerDidDismissEvent) => void;
  onItemClicked?: (event: OnItemClickedEvent) => void;
  onTriggerCTA?: (event: OnTriggerCTAEvent) => void;
  onTriggerPlayerBodyTextLink?: (event: OnTriggerPlayerBodyTextLinkEvent) => void;
  onPlayerEventTriggered?: (event: OnPlayerEventTriggeredEvent) => void;
}