import { MutableRefObject } from 'react';
import { Subject } from 'rxjs';
import { IObject } from '../../interfaces';
import { Resolve } from '../../services/resolve.service';

export interface IUseViewProps {
   /**
    * Observables que devem ser iniciados antes do inicio da página
    */
   resolves?: { [key: string]: Resolve<any> };

   /**
    * Se deve fazer o carregamento inicial dos resolves
    */
   firstLoad?: boolean;
}

export interface IStatusInfo {
   // Status: Iniciando
   starting: boolean;
   // Status: Erro no carregmento dos resolves
   errorLoadData: boolean;
   // Status: Erro crítico desconhecido
   criticalError: boolean;
}

export interface IViewResponse {
   // Registrar funções que são chamadas na inicialização da página
   registerOnInit: (v) => void;
   // Registrar funções que são chamadas no erro na inicialização da página
   registerOnInitError: (v) => void;
   // Status: Iniciando
   starting: boolean;
   // Status: Erro no carregmento dos resolves
   errorLoadData: boolean;
   // Status: Erro crítico desconhecido
   criticalError: boolean;
   // statusInfo
   statusInfo: IStatusInfo;
   // Definir status da página
   setStatusInfo: (v: IObject) => any;
   // Subject para destruir resolves
   $destroy: Subject<any>;
   // Recarregar página
   reloadPage: (wait1s?: boolean) => void;
   // Lista de funções que devem ser executadas no parametro de determinado resolver
   getParamsResolve: MutableRefObject<{ [key: string]: () => any }>;
   // Registrar nova função para parametro de resolver
   registerResolveParams: (resolveName: string, fn: () => any) => void;
}
