package it.integry.integrywmsnative.gest.pv_ordini_acquisto.helper;

import android.app.Activity;

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

import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloGriglia;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.view_model.ArticoloDTO;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.rest.consumers.PVOrdiniAcquistoRESTConsumer;
import it.integry.integrywmsnative.core.utility.UtilityDate;

public class OrdineAcquistoPvHelper {

    private Activity mContext;
    private GrigliaRepository mGrigliaRepository;
    private ArticoloGrigliaRepository mArticoliGrigliaRepository;
    private ArticoliOrdineRepository mArticoliOrdineRepository;
    private OrdineRepository mOrdineRepository;

    public OrdineAcquistoPvHelper(Activity context, GrigliaRepository grigliaRepository, ArticoloGrigliaRepository articoloGrigliaRepository, ArticoliOrdineRepository articoliOrdineRepository, OrdineRepository ordineRepository) {
        this.mContext = context;
        this.mGrigliaRepository = grigliaRepository;
        this.mArticoliGrigliaRepository = articoloGrigliaRepository;
        this.mArticoliOrdineRepository = articoliOrdineRepository;
        this.mOrdineRepository = ordineRepository;

    }

    public void downloadAndSaveLisA(String codAlis, RunnableArgs<Griglia> onSave, RunnableArgs<Exception> onFail) {
        Griglia griglia = new Griglia();
        griglia.setCodAlis(codAlis);
        updateGriglia(griglia, onSave, onFail);
    }

    public void updateGriglia(Griglia griglia, RunnableArgs<Griglia> onSave, RunnableArgs<Exception> onFail) {
        PVOrdiniAcquistoRESTConsumer.getArticoliListino(griglia.getCodAlis(), dto -> {
            mContext.runOnUiThread(() -> {
                if (dto.getGrigliaAcquistiChild().size() <= 0) {
                    onFail.run(new Exception("La griglia selezionata (" + griglia.getCodAlis() + ") non esiste o non presenta articoli"));
                    return;
                }
                griglia.setDescrLisa(dto.getDescrLisa());
                griglia.setDescrDepo(dto.getDescrDepo());
                griglia.setCountArticoli(dto.getGrigliaAcquistiChild().size());
                mGrigliaRepository.saveGriglia(griglia, id -> saveLisAToGriglia(dto.getGrigliaAcquistiChild(), griglia, onSave, onFail), onFail);
            });
        }, onFail);
    }

    private void saveLisAToGriglia(List<ArticoloDTO> articoli, Griglia griglia, RunnableArgs<Griglia> onSave, RunnableArgs<Exception> onFail) {
        List<ArticoloGriglia> articoliGriglia = new ArrayList<>();
        for (ArticoloDTO articolo : articoli) {
            ArticoloGriglia toSave = articolo.toArticoloGriglia();
            toSave.setIdGriglia(griglia.getGrigliaId());
            articoliGriglia.add(toSave);
        }
        mArticoliGrigliaRepository.saveArticoliToGriglia(articoliGriglia, griglia, () -> onSave.run(griglia), onFail);
    }

    public void createNewOrder(Griglia griglia, RunnableArgs<Ordine> onSuccess, RunnableArgs<Exception> onError) {
        Ordine ordine = new Ordine();
        ordine.setDataIns(UtilityDate.getDateInstance());
        ordine.setIdGriglia(griglia.getGrigliaId());
        mOrdineRepository.insert(ordine, id -> {
            ordine.setOrdineId(id);
            onSuccess.run(ordine);
        }, onError);
    }

    public void deleteOrder(Ordine ordine, Runnable onSuccess, RunnableArgs<Exception> onFail) {
        mOrdineRepository.delete(ordine, onSuccess, onFail);
    }
}
