package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest;

import com.annimon.stream.Stream;

import java.util.List;

import javax.inject.Singleton;

import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
import it.integry.integrywmsnative.gest.accettazione.dto.GetPickingListAccettazioneDTO;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO;
import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO;
import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumerService;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

@Singleton
public class ProdOrdineProduzioneRESTConsumer extends _BaseRESTConsumer {

    public void getOrdiniInevasi(String codMdep, RunnableArgs<List<OrdineAccettazioneInevasoDTO>> onComplete, RunnableArgs<Exception> onFailed) {
        OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class);
        service.listOrdiniInevasi(codMdep, "P").enqueue(new Callback<>() {
            @Override
            public void onResponse(Call<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>> call, Response<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>> response) {
                analyzeAnswer(response, "getOrdiniInevasi", onComplete, onFailed);
            }

            @Override
            public void onFailure(Call<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>> call, Throwable t) {
                onFailed.run(new Exception(t));
            }
        });
    }


    public void retrievePickingListNew(List<OrdineAccettazioneInevasoDTO> orders, RunnableArgs<List<SitArtOrdDTO>> onComplete, RunnableArgs<Exception> onFailed) {
        List<GetPickingListAccettazioneDTO> getPickingListDTOs = Stream.of(orders)
                .map(x -> new GetPickingListAccettazioneDTO()
                        .setData(x.getData())
                        .setGestione(x.getGestione())
                        .setNumero(x.getNumero()))
                .toList();

        OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class);
        service.getArticoliFromOrdiniAccettazione(getPickingListDTOs).enqueue(new Callback<>() {
            @Override
            public void onResponse(Call<ServiceRESTResponse<List<SitArtOrdDTO>>> call, Response<ServiceRESTResponse<List<SitArtOrdDTO>>> response) {
                analyzeAnswer(response, "retrieveListaArticoliFromOrdiniProduzione", onComplete, onFailed);
            }

            @Override
            public void onFailure(Call<ServiceRESTResponse<List<SitArtOrdDTO>>> call, Throwable t) {
                UtilityLogger.errorMe(new Exception(t));
                onFailed.run(new Exception(t));
            }
        });
    }

}
