package it.integry.integrywmsnative.gest.accettazione_bolla_elenco;

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_bolla_elenco.rest.BolleAccettazioneRESTConsumer;
import it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto.SitBollaAccettazioneDTO;
import it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto.TestataBollaAccettazioneDTO;

public class MainAccettazioneBollaElencoViewModel {

    private final BolleAccettazioneRESTConsumer bolleAccettazioneRESTConsumer;

    private final MutableLiveData<List<TestataBollaAccettazioneDTO>> bolleList = new MutableLiveData<>();
    private Listener listener;

    @Inject
    public MainAccettazioneBollaElencoViewModel(BolleAccettazioneRESTConsumer bolleAccettazioneRESTConsumer) {
        this.bolleAccettazioneRESTConsumer = bolleAccettazioneRESTConsumer;
    }

    public void init() {
        this.sendOnLoadingStarted();

        bolleAccettazioneRESTConsumer.retrieveBolleDaAccettare(bolleList -> {
            this.bolleList.postValue(bolleList);

            this.sendOnLoadingEnded();

        }, this::sendError);
    }


    public MutableLiveData<List<TestataBollaAccettazioneDTO>> getBolleList() {
        return bolleList;
    }




    public void loadPicking(List<TestataBollaAccettazioneDTO> selectedBolle) {
        this.sendOnLoadingStarted();

        this.bolleAccettazioneRESTConsumer.retrievePickingListBolle(selectedBolle, sitArts -> {
            this.sendOnLoadingEnded();

            this.sendOnPickingReady(selectedBolle, sitArts);

        }, this::sendError);
    }

















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

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

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

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

    private void sendOnPickingReady(List<TestataBollaAccettazioneDTO> bolle, List<SitBollaAccettazioneDTO> sitArts) {
        if(this.listener != null) listener.onPickingReady(bolle, sitArts);
    }


    public interface Listener extends ILoadingListener {
        void onError(Exception ex);

        void onPickingReady(List<TestataBollaAccettazioneDTO> bolle, List<SitBollaAccettazioneDTO> sitArts);
    }

}
