package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione;

import androidx.lifecycle.MutableLiveData;

import java.util.List;

import javax.inject.Inject;

import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.gest.accettazione_ordini_elenco.dto.OrdineAccettazioneInevasoDTO;
import it.integry.integrywmsnative.gest.accettazione_ordini_elenco.dto.SitArtOrdDTO;
import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest.ProdOrdineProduzioneRESTConsumer;

public class ProdOrdineProduzioneElencoViewModel {

    private final ProdOrdineProduzioneRESTConsumer mProdOrdineProduzioneRESTConsumer;

    private final MutableLiveData<List<OrdineAccettazioneInevasoDTO>> mOrderList = new MutableLiveData<>();

    private Listener mListener;

    private String codMdep;


    @Inject
    public ProdOrdineProduzioneElencoViewModel(ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) {
        this.mProdOrdineProduzioneRESTConsumer = prodOrdineProduzioneRESTConsumer;
    }


    public void init(String codMdep) {
        this.codMdep = codMdep;

        this.sendOnLoadingStarted();

        mProdOrdineProduzioneRESTConsumer.getOrdiniInevasi(codMdep, orderList -> {
            this.mOrderList.setValue(orderList);

            this.sendOnLoadingEnded();
        }, this::sendError);

    }


    public void loadPicking(List<OrdineAccettazioneInevasoDTO> selectedOrders) {

        this.sendOnLoadingStarted();
            this.mProdOrdineProduzioneRESTConsumer.retrievePickingListNew(selectedOrders, sitArtOrds -> {

                this.sendOnOrdersDispatched(selectedOrders, sitArtOrds);
                this.sendOnLoadingEnded();

            }, this::sendError);

    }


    public MutableLiveData<List<OrdineAccettazioneInevasoDTO>> getOrderList() {
        return mOrderList;
    }

    public ProdOrdineProduzioneElencoViewModel setListener(Listener listener) {
        this.mListener = listener;
        return this;
    }

    private void sendOnLoadingStarted() {
        if (this.mListener != null) mListener.onLoadingStarted();
    }

    private void sendOnLoadingEnded() {
        if (this.mListener != null) mListener.onLoadingEnded();
    }

    private void sendError(Exception ex) {
        if (this.mListener != null) mListener.onError(ex);
    }

    private void sendOnOrdersDispatched(List<OrdineAccettazioneInevasoDTO> orders, List<SitArtOrdDTO> sitArts) {
        if (this.mListener != null) mListener.onOrdersDispatched(orders, sitArts);
    }

    public interface Listener extends ILoadingListener {

        void onError(Exception ex);

        void onOrdersDispatched(List<OrdineAccettazioneInevasoDTO> orders, List<SitArtOrdDTO> sitArts);
    }

}
