import BlocState from "../../core/states/BlocState";
import InitialState from "../../core/states/InitialState";
import ErrorState from "../../core/states/ErrorState";
import LoadingState from "../../core/states/LoadingState";
import { DefaultCubit } from "./DefaultCubit"
import AsyncCubit, { CallbackType, ErrCallbackType } from "./interface/AsyncCubit";

export const DefaultAsyncCubit = (state?: BlocState): AsyncCubit => {
    let cubit = DefaultCubit<BlocState>(state ?? new InitialState());

    const handleDefaultStates = async (callback: CallbackType, errorCallback?: ErrCallbackType, showLoading: boolean = true,) => {
        if (showLoading) {
            cubit.emit(new LoadingState());
        }
        try {
            await callback();
        } catch (e) {
            if (errorCallback) {
                errorCallback(e)
            } else {
                cubit.emit(new ErrorState<any>("Error Has Occured"));
            }
        }
    }

    return {
        ...cubit,
        handleDefaultStates,
    }
}