import { useRef } from 'react';
import { IObject } from '../../interfaces';
import { IUseViewProps, IViewResponse, IStatusInfo } from '../useView/useView.interfaces';

/**
 * Tipos de Schemas para ser usado nos filtros
 */
export interface IFilterOptions {
   noRequest?: boolean;
   disableQueryChange?: boolean;
   replaceUrl?: boolean;
}

export interface IStatusInfoViewList extends IStatusInfo {
   errorLoadMore: boolean;
   searchingMore: boolean;
   searching: boolean;
   lastPage: boolean;
}

export interface IUseViewListProps extends IUseViewProps {
   // Filtros default
   filtersDefault?: any;
   // Schema do Filtro
   schemaFilter?: IObject;
   // Limite de items na API
   limit?: number;
   // Se deve adicionar items ao final da array ou substituir array
   infiniteScroll?: boolean;
   // Inverte os items da array "items". O primeiro elemento do array se torna o último e o último torna-se o primeiro. Se infiniteScroll estiver ativo, todos os items serão adicionados no começo da array
   reverseItems?: boolean;
   // Não deve mudar query da url
   disableQueryChange?: boolean;
   // Não deve passar esses filtros para query da url
   ignoreFiltersInQuery?: any[];
   // Não deve passar determinadas keys da query para o filtro
   ignoreQueryInFilters?: any[];
   // Só verificar alteração na query, se for a mesma routa definida
   changeOnlyPath?: string;
   // Tratar dados do filter que serão enviados para o Body da Request
   handleRequestBody?: (filter: any) => any;
   // Tratar dados do Filter que serão enviados para Url Query
   handleFilterToQuery?: (query: any) => any;
   // Tratar dados do Query que são enviados para o filtro
   handleQueryToFilter?: (filter: any) => any;
}

export interface IViewList<IFilter = IObject, IQuery = IObject, IResource = any> extends IViewResponse {
   // Status: Buscando items se infiniteScroll = true
   searchingMore: boolean;
   // Status: Buscando items se infiniteScroll = false
   searching: boolean;
   // Status: Se chegou na página inicial
   lastPage: boolean;
   // Status: Erro ao carregar mais items se infiniteScroll = true
   errorLoadMore: boolean;
   // array de numeros para ser usado com skeleton
   skeletonResources: number[];
   // Array de items
   resources: any[];
   // Quantidade de items totais
   resourcesTotal: number;
   // Remover item da array
   removeResource: (id: any, softDelete: boolean) => void;
   // Remover diversos itens da array
   removeManyResources: (ids: any[], softDelete: boolean) => void;
   // Tratar dados do filter que serão enviados para o Body da Request
   setHandleRequestBody: (f: (filter: IFilter) => any) => void;
   // Tratar dados do Filter que serão enviados para Url Query
   setHandleFilterToQuery: (f: (query: IFilter) => any) => void;
   // Tratar dados do Query que são enviados para o filtro
   setHandleQueryToFilter: (f: (filter: IQuery) => any) => void;
   // Registrar funções que são chamadas na busca de dados
   registerOnSearch: (f: () => void) => void;
   // Array de items
   filters: IFilter;
   // Array de items
   setFilters: (f: (draft: any) => any, options?: IFilterOptions) => void;
   // Limite de recursos por página
   limit: number;
   // Define página da lista
   setPage: (page: number, options?: IFilterOptions) => void;
   // Define offset atual da lista
   setOffset: (offset: number, options?: IFilterOptions) => void;
   // Define ordem dos items
   setSort: (sort: string, options?: IFilterOptions) => void;
   // Carrega próxima página
   loadNextPage: (options?: IFilterOptions) => void;
   // Recarrega página atual
   reloadResources: (wait1s?: boolean, options?: IFilterOptions) => void;
   // Reinicia todos os filtros, query e faz uma nova request
   resetPageViewList: (wait1s?: boolean, options?: IFilterOptions) => void;
}
