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

import java.util.List;

import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloGriglia;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
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.expansion.RunnableArgs;

public class PVEditOrderHelper {
    private final GrigliaRepository mGrigliaRepository;
    private final ArticoliOrdineRepository mArticoliOrdineRepository;
    private final ArticoloGrigliaRepository mArticoliGrigliaRepository;

    public PVEditOrderHelper(GrigliaRepository grigliaRepository, ArticoliOrdineRepository articoliOrdineRepository, ArticoloGrigliaRepository articoloGrigliaRepository) {
        mGrigliaRepository = grigliaRepository;
        mArticoliOrdineRepository = articoliOrdineRepository;
        mArticoliGrigliaRepository = articoloGrigliaRepository;
    }

    public void checkArticolo(Ordine ordine, String barcode, RunnableArgs<ArticoloOrdine> onSuccess, RunnableArgs<Exception> onFail) {
        try {
            mArticoliOrdineRepository.findArticoloByScanAndOrdine(ordine, barcode, (articolo) -> {
                if (articolo != null) {
                    onSuccess.run(articolo);
                } else {
                    mArticoliGrigliaRepository.findArticoloByScanAndGriglia(barcode, ordine.getIdGriglia(), artGrid -> {
                        if (artGrid != null) {
                            onSuccess.run(artGrid.convertToArticoloOrdine(ordine));
                        } else {
                            onFail.run(new Exception("L' articolo ( " + barcode + " ) non  è presente nella griglia"));
                        }
                    }, onFail);
                }
            }, onFail);

        } catch (Exception e) {
            onFail.run(e);
        }
    }


    public void saveArticoliToOrdine(List<ArticoloOrdine> articoli, Runnable onSave, RunnableArgs<Exception> onFail) {
        mArticoliOrdineRepository.saveArticoliToOrdine(articoli, onSave, onFail);
    }

    public void removeArticoloFromOrdine(ArticoloOrdine articolo, Runnable onSave, RunnableArgs<Exception> onError) {
        mArticoliOrdineRepository.deleteArticolo(articolo, onSave, onError);
    }

    public void getNewArticoli(int idGrigla, RunnableArgs<List<ArticoloGriglia>> onSuccess, RunnableArgs<Exception> onError) {
        mArticoliGrigliaRepository.findNewArticoliInGrigla(idGrigla, onSuccess, onError);
    }
}
