// @flow
import * as ACTIONS from 'constants/action_types';

declare type SearchSuggestion = {
  value: string,
  shorthand: string,
  type: string,
};

declare type SearchOptions = {
  // :(
  // https://github.com/facebook/flow/issues/6492
  RESULT_COUNT: number,
  CLAIM_TYPE: string,
  INCLUDE_FILES: string,
  INCLUDE_CHANNELS: string,
  INCLUDE_FILES_AND_CHANNELS: string,
  MEDIA_AUDIO: string,
  MEDIA_VIDEO: string,
  MEDIA_TEXT: string,
  MEDIA_IMAGE: string,
  MEDIA_APPLICATION: string,
};

declare type SearchState = {
  isActive: boolean,
  searchQuery: string,
  options: SearchOptions,
  suggestions: { [string]: Array<SearchSuggestion> },
  urisByQuery: {},
  resolvedResultsByQuery: {},
  resolvedResultsByQueryLastPageReached: {},
};

declare type SearchSuccess = {
  type: ACTIONS.SEARCH_SUCCESS,
  data: {
    query: string,
    uris: Array<string>,
  },
};

declare type UpdateSearchQuery = {
  type: ACTIONS.UPDATE_SEARCH_QUERY,
  data: {
    query: string,
  },
};

declare type UpdateSearchSuggestions = {
  type: ACTIONS.UPDATE_SEARCH_SUGGESTIONS,
  data: {
    query: string,
    suggestions: Array<SearchSuggestion>,
  },
};

declare type UpdateSearchOptions = {
  type: ACTIONS.UPDATE_SEARCH_OPTIONS,
  data: SearchOptions,
};

declare type ResolvedSearchResult = {
  channel: string,
  channel_claim_id: string,
  claimId: string,
  duration: number,
  fee: number,
  name: string,
  nsfw: boolean,
  release_time: string,
  thumbnail_url: string,
  title: string,
};

declare type ResolvedSearchSuccess = {
  type: ACTIONS.RESOLVED_SEARCH_SUCCESS,
  data: {
    append: boolean,
    pageSize: number,
    results: Array<ResolvedSearchResult>,
    query: string,
  },
};