package it.integry.integrywmsnative.core.rest.consumers;

import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Singleton;

import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.utility.UtilityDB;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

@Singleton
public class PosizioniRESTConsumer extends _BaseRESTConsumer{

    private final SystemRESTConsumer mSystemRESTConsumer;

    public PosizioniRESTConsumer(SystemRESTConsumer systemRESTConsumer) {
        this.mSystemRESTConsumer = systemRESTConsumer;
    }

    public void getPosizioneFromString(String posizione, RunnableArgs<MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
        String sql = "SELECT TOP 1 mtb_depo_posizioni.*," +
                " CASE WHEN jtb_fasi.cod_jfas IS NULL THEN 'N' ELSE 'S' END AS flag_linea_produzione " +
                " FROM mtb_depo_posizioni " +
                " LEFT OUTER JOIN jtb_fasi " +
                " ON mtb_depo_posizioni.posizione = jtb_fasi.cod_jfas " +
                " WHERE posizione = " + UtilityDB.valueToString(posizione);

        SystemRESTConsumer.processSqlStatic(sql, MtbDepoPosizione.class, new ISimpleOperationCallback<MtbDepoPosizione>() {
            @Override
            public void onSuccess(MtbDepoPosizione value) {
                if(onComplete != null) onComplete.run(value);
            }

            @Override
            public void onFailed(Exception ex) {
                if(onFailed != null) onFailed.run(ex);
            }
        });
    }

    public static void getAvailablePosizioni(RunnableArgs<List<MtbDepoPosizione>> onComplete, RunnableArgs<Exception> onFailed) {
//        String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
        String codMdep = null;

        PosizioniRESTConsumerService posizioniRESTConsumerService = RESTBuilder.getService(PosizioniRESTConsumerService.class);
        posizioniRESTConsumerService.getAvailablePosizioni(codMdep).enqueue(new Callback<>() {
            @Override
            public void onResponse(Call<ServiceRESTResponse<List<MtbDepoPosizione>>> call, Response<ServiceRESTResponse<List<MtbDepoPosizione>>> response) {
                analyzeAnswer(response, "getAvailablePosizioni", (m) -> {
                    onComplete.run(response.body().getDto());
                }, onFailed);
            }

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


    public void getBancaliInPosizione(MtbDepoPosizione mtbDepoPosizione, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
        String sql = "SELECT * FROM mtb_colt WHERE segno > 0 AND cod_mdep = " + UtilityDB.valueToString(mtbDepoPosizione.getCodMdep()) + " AND posizione = " + UtilityDB.valueToString(mtbDepoPosizione.getPosizione());


        Type typeOfObjectsList = new TypeToken<ArrayList<MtbColt>>() {}.getType();
        SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback<List<MtbColt>>() {
            @Override
            public void onSuccess(List<MtbColt> value) {
                if(onComplete != null) onComplete.run(value);
            }

            @Override
            public void onFailed(Exception ex) {
                if(onFailed != null) onFailed.run(ex);
            }
        });

    }


}
