package it.integry.integrywmsnative.gest.accettazione.core;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.REST.RESTBuilder;
import it.integry.integrywmsnative.core.REST.model.EsitoType;
import it.integry.integrywmsnative.core.REST.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
import it.integry.integrywmsnative.gest.accettazione.core.interfaces.ILoadOrdiniCallback;
import it.integry.integrywmsnative.gest.accettazione.core.interfaces.ILoadPickingListCallback;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneDTO;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneGroupedInevasoDTO;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO;
import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumerService;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by GiuseppeS on 06/03/2018.
 */

public class AccettazioneHelper {

    private Context mContext;

    public AccettazioneHelper(Context context){
        mContext = context;
    }

    public void loadOrdini(final ILoadOrdiniCallback callback){
        String codMdep = SettingsManager.i().userSession.depo.getCodMdep();

        OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class);
        service.listOrdiniInevasi(codMdep).enqueue(new Callback<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>>() {
            @Override
            public void onResponse(Call<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>> call, Response<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>> response) {

                if(response.isSuccessful()) {

                    if(response.body() != null) {
                        if(response.body().getEsito() == EsitoType.OK) {
                            callback.onLoadSuccess(response.body().getDto());
                        } else {
                            Log.e("Accettazione", response.body().getErrorMessage());
                            callback.onLoadFail(new Exception(response.message()));
                        }
                    } else {
                        Log.e("Accettazione", response.message());
                        callback.onLoadFail(new Exception(response.message()));
                    }
                } else {
                    Log.e("Accettazione", "Status " + response.code() + ": " + response.message());
                    callback.onLoadFail(new Exception("Status " + response.code() + ": " + response.message()));
                }
            }

            @Override
            public void onFailure(Call<ServiceRESTResponse<List<OrdineAccettazioneInevasoDTO>>> call, Throwable t) {
                Log.e("Accettazione", t.toString());
                callback.onLoadFail(new Exception(t));
            }
        });
    }

    public void retrievePickingList(List<String> barcodeOrdini, final ILoadPickingListCallback callback){

        String joinedBarcodes = TextUtils.join(",", barcodeOrdini);

        OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class);

        service.pickingListAccettazione(joinedBarcodes).enqueue(new Callback<ServiceRESTResponse<List<OrdineAccettazioneDTO>>>() {
            @Override
            public void onResponse(Call<ServiceRESTResponse<List<OrdineAccettazioneDTO>>> call, Response<ServiceRESTResponse<List<OrdineAccettazioneDTO>>> response) {
                if(response.isSuccessful()) {

                    if(response.body() != null) {
                        if(response.body().getEsito() == EsitoType.OK) {
                            List<OrdineAccettazioneDTO> dto = response.body().getDto();

                            for (OrdineAccettazioneDTO ordine : dto) {
                                for(OrdineAccettazioneDTO.Riga riga : ordine.ordini){
                                    riga.numOrd = ordine.numero;
                                    riga.dataOrd = ordine.data;
                                    riga.gestioneOrd = ordine.gestione;
                                    riga.codAlis = ordine.codAlis;
                                }
                            }

                            callback.onLoadSuccess(dto);
                        } else {
                            Log.e("Accettazione", response.body().getErrorMessage());
                            callback.onLoadFail(new Exception(response.message()));
                        }
                    } else {
                        Log.e("Accettazione", response.message());
                        callback.onLoadFail(new Exception(response.message()));
                    }
                } else {
                    Log.e("Accettazione", "Status " + response.code() + ": " + response.message());
                    callback.onLoadFail(new Exception("Status " + response.code() + ": " + response.message()));
                }
            }

            @Override
            public void onFailure(Call<ServiceRESTResponse<List<OrdineAccettazioneDTO>>> call, Throwable t) {
                Log.e("Accettazione", t.toString());
                UtilityLogger.errorMe(new Exception(t));
                callback.onLoadFail(new Exception(t));
            }
        });

    }


    public List<OrdineAccettazioneGroupedInevasoDTO> getSelectedOrders(List<OrdineAccettazioneGroupedInevasoDTO> groupedOrdiniInevasi){
        List<OrdineAccettazioneGroupedInevasoDTO> selectedOrdini = new ArrayList<>();

        for(int i = 0; i < groupedOrdiniInevasi.size(); i++){
            List<OrdineAccettazioneGroupedInevasoDTO.Ordine> selectedOrdiniGroup = new ArrayList<>();

            for(int j = 0; j < groupedOrdiniInevasi.get(i).ordini.size(); j++){
                if(groupedOrdiniInevasi.get(i).ordini.get(j).checkBox) {
                    selectedOrdiniGroup.add(groupedOrdiniInevasi.get(i).ordini.get(j));
                }
            }

            if(selectedOrdiniGroup.size() > 0) {
                try {
                    OrdineAccettazioneGroupedInevasoDTO cloneOrdine = groupedOrdiniInevasi.get(i).clone();
                    cloneOrdine.ordini = selectedOrdiniGroup;
                    selectedOrdini.add(cloneOrdine);
                } catch (CloneNotSupportedException e) {
                    e.printStackTrace();
                }
            }
        }

        return selectedOrdini;
    }

    public List<OrdineAccettazioneGroupedInevasoDTO> getFilteredOrdersByFornitore(List<OrdineAccettazioneGroupedInevasoDTO> groupedOrdiniInevasi, String textFilter){
        List<OrdineAccettazioneGroupedInevasoDTO> selectedOrdini = new ArrayList<>();

        for(int i = 0; i < groupedOrdiniInevasi.size(); i++){

            if(groupedOrdiniInevasi.get(i).nomeFornitore.toLowerCase().contains(textFilter.toLowerCase())){
                selectedOrdini.add(groupedOrdiniInevasi.get(i));
            }
        }

        return selectedOrdini;
    }


}
