package it.integry.integrywmsnative.gest.accettazione;

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.dto.OrdineAccettazioneInevasoDTO;
import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO;
import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumer;

public class MainAccettazioneViewModel {

    private final OrdiniAccettazioneRESTConsumer mOrdiniAccettazioneRESTConsumer;

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

    private Listener mListener;
    private String codMdep;

    @Inject
    public MainAccettazioneViewModel(OrdiniAccettazioneRESTConsumer ordiniAccettazioneRESTConsumer) {
        this.mOrdiniAccettazioneRESTConsumer = ordiniAccettazioneRESTConsumer;
    }

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

        this.sendOnLoadingStarted();
        new Thread(() -> {

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

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

        }).start();
    }


    public void loadPicking(List<OrdineAccettazioneInevasoDTO> selectedOrders) {

        this.sendOnLoadingStarted();

        new Thread(() -> {

            this.mOrdiniAccettazioneRESTConsumer.retrievePickingListNew(selectedOrders, sitArtOrds -> {

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

            }, this::sendError);

        }).start();

    }


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

    public MainAccettazioneViewModel 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);
    }

}
