package it.integry.integrywmsnative.core.model;

import androidx.databinding.ObservableArrayList;
import android.os.Parcel;
import android.os.Parcelable;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityLogger;

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

public class MtbColt extends EntityBase implements Parcelable {
    private String gestione;
    private String dataCollo;
    private String serCollo;
    private Integer numCollo;
    private String rifOrd;
    private String codAnag;
    private String codVdes;
    private String codMdep;
    private String codVlis;
    private String codDtip;
    private String codTcol;
    private String serDoc;
    private String filtroOrdini;
    private String preparatoDa;
    private String annotazioni;
    private String posizione;
    private String codDtipProvv;
    private String serDocProvv;
    private String codJfas;
    private String dataOrd;
    private String dataDoc;
    private String oraInizPrep;
    private String oraFinePrep;
    private String dataDocProvv;
    private String dataVers;
    private Integer segno;
    private Integer numOrd;
    private Integer numDoc;
    private Integer numDocProvv;
    private BigDecimal pesoKg;
    private BigDecimal lunghezzaCm;
    private BigDecimal larghezzaCm;
    private BigDecimal altezzaCm;

    public List<MtbCols> mtbCols;

    private Boolean disablePrint;

    protected MtbColt(Parcel in) {
        type = "mtb_colt";
        gestione = in.readString();
        dataCollo = in.readString();
        serCollo = in.readString();
        if (in.readByte() == 0) {
            numCollo = null;
        } else {
            numCollo = in.readInt();
        }
        rifOrd = in.readString();
        codAnag = in.readString();
        codVdes = in.readString();
        codMdep = in.readString();
        codVlis = in.readString();
        codDtip = in.readString();
        codTcol = in.readString();
        serDoc = in.readString();
        filtroOrdini = in.readString();
        preparatoDa = in.readString();
        annotazioni = in.readString();
        posizione = in.readString();
        codDtipProvv = in.readString();
        serDocProvv = in.readString();
        codJfas = in.readString();
        dataOrd = in.readString();
        dataDoc = in.readString();
        oraInizPrep = in.readString();
        oraFinePrep = in.readString();
        dataDocProvv = in.readString();
        dataVers = in.readString();
        if (in.readByte() == 0) {
            segno = null;
        } else {
            segno = in.readInt();
        }
        if (in.readByte() == 0) {
            numOrd = null;
        } else {
            numOrd = in.readInt();
        }
        if (in.readByte() == 0) {
            numDoc = null;
        } else {
            numDoc = in.readInt();
        }
        if (in.readByte() == 0) {
            numDocProvv = null;
        } else {
            numDocProvv = in.readInt();
        }




        if (in.readByte() == 0) {
            pesoKg = null;
        } else {
            pesoKg = new BigDecimal(in.readFloat());
        }

        if (in.readByte() == 0) {
            lunghezzaCm = null;
        } else {
            lunghezzaCm = new BigDecimal(in.readFloat());
        }

        if (in.readByte() == 0) {
            larghezzaCm = null;
        } else {
            larghezzaCm = new BigDecimal(in.readFloat());
        }
        if (in.readByte() == 0) {
            altezzaCm = null;
        } else {
            altezzaCm = new BigDecimal(in.readFloat());
        }




        in.readList(mtbColr, MtbColr.class.getClassLoader());


    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(gestione);
        dest.writeString(dataCollo);
        dest.writeString(serCollo);
        if (numCollo == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeInt(numCollo);
        }
        dest.writeString(rifOrd);
        dest.writeString(codAnag);
        dest.writeString(codVdes);
        dest.writeString(codMdep);
        dest.writeString(codVlis);
        dest.writeString(codDtip);
        dest.writeString(codTcol);
        dest.writeString(serDoc);
        dest.writeString(filtroOrdini);
        dest.writeString(preparatoDa);
        dest.writeString(annotazioni);
        dest.writeString(posizione);
        dest.writeString(codDtipProvv);
        dest.writeString(serDocProvv);
        dest.writeString(codJfas);
        dest.writeString(dataOrd);
        dest.writeString(dataDoc);
        dest.writeString(oraInizPrep);
        dest.writeString(oraFinePrep);
        dest.writeString(dataDocProvv);
        dest.writeString(dataVers);
        if (segno == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeInt(segno);
        }
        if (numOrd == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeInt(numOrd);
        }
        if (numDoc == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeInt(numDoc);
        }
        if (numDocProvv == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeInt(numDocProvv);
        }



        if (pesoKg == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeFloat(pesoKg.floatValue());
        }
        if (lunghezzaCm == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeFloat(lunghezzaCm.floatValue());
        }
        if (larghezzaCm == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeFloat(larghezzaCm.floatValue());
        }
        if (altezzaCm == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeFloat(altezzaCm.floatValue());
        }

        dest.writeList(mtbColr);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<MtbColt> CREATOR = new Creator<MtbColt>() {
        @Override
        public MtbColt createFromParcel(Parcel in) {
            return new MtbColt(in);
        }

        @Override
        public MtbColt[] newArray(int size) {
            return new MtbColt[size];
        }
    };

    public void generaFiltroOrdine() throws Exception {

        if (this.gestione == null) {
            throw new Exception("Impossibile creare il filtro dell'ordine se la gestione non è valorizzata");
        }

        if (this.dataOrd == null) {
            throw new Exception("Impossibile creare il filtro dell'ordine se la data dell'ordine non è valorizzata");
        }

        if (this.numOrd == null) {
            throw new Exception("Impossibile creare il filtro dell'ordine se il numero dell'ordine non è valorizzato");
        }


        Date dateOrd = UtilityDate.recognizeDate(this.dataOrd);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        String dateYMD = sdf.format(dateOrd);

        this.filtroOrdini = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><FILTER><DTB_ORDT><GESTIONE type=\"V\">" + this.gestione + "</GESTIONE><DATA_ORD type=\"D\">" + dateYMD + "</DATA_ORD><NUM_ORD type=\"N\">" + this.numOrd + "</NUM_ORD></DTB_ORDT></FILTER></ROOT>";
    }



    private ObservableArrayList<MtbColr> mtbColr = new ObservableArrayList<>();

    public ObservableArrayList<MtbColr> getMtbColr() {
        return mtbColr;
    }

    public MtbColt setMtbColr(ObservableArrayList<MtbColr> mtbColr) {
        this.mtbColr = mtbColr;
        return this;
    }

    public MtbColt(){
        type = "mtb_colt";
        setDataCollo(new Date());
        setSerCollo("/");
        setCodMdep(SettingsManager.i().userSession.depo.getCodMdep());
        setPreparatoDa(SettingsManager.i().user.fullname);
        setOraInizPrep(new Date());
        setCodAnag(SettingsManager.iDB().getDefaultCodAnag());
    }


    public String getGestione() {
        return gestione;
    }

    public GestioneEnum getGestioneEnum() {
        return GestioneEnum.fromString(gestione);
    }

    public MtbColt setGestione(String gestione) {
        this.gestione = gestione;
        return this;
    }

    public MtbColt setGestione(GestioneEnum gestione) {
        this.gestione = gestione.getText();
        return this;
    }

    public String getDataColloHumanLong() {
        Date dataColloD = null;
        try {
            dataColloD = getDataColloD();
        } catch (Exception ex){
            UtilityLogger.errorMe(ex);
        }

        if(dataColloD != null){
            return UtilityDate.formatDate(dataColloD, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN_LONG);
        } else return null;
    }

    public String getDataColloS() {
        return dataCollo;
    }

    public Date getDataColloD() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        try {
            return sdf.parse(getDataColloS());
        } catch (ParseException e) {
            UtilityLogger.errorMe(e);
            return null;
        }
    }

    public MtbColt setDataCollo(String dataCollo) {
        this.dataCollo = dataCollo;
        return this;
    }

    public MtbColt setDataCollo(Date dataCollo) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        this.dataCollo = sdf.format(dataCollo);
        return this;
    }

    public String getSerCollo() {
        return serCollo;
    }

    public MtbColt setSerCollo(String serCollo) {
        this.serCollo = serCollo;
        return this;
    }

    public Integer getNumCollo() {
        return numCollo;
    }

    public MtbColt setNumCollo(Integer numCollo) {
        this.numCollo = numCollo;
        return this;
    }

    public String getRifOrd() {
        return rifOrd;
    }

    public MtbColt setRifOrd(String rifOrd) {
        this.rifOrd = rifOrd;
        return this;
    }

    public String getCodAnag() {
        return codAnag;
    }

    public MtbColt setCodAnag(String codAnag) {
        this.codAnag = codAnag;
        return this;
    }

    public String getCodVdes() {
        return codVdes;
    }

    public MtbColt setCodVdes(String codVdes) {
        this.codVdes = codVdes;
        return this;
    }

    public String getCodMdep() {
        return codMdep;
    }

    public MtbColt setCodMdep(String codMdep) {
        this.codMdep = codMdep;
        return this;
    }

    public String getCodVlis() {
        return codVlis;
    }

    public MtbColt setCodVlis(String codVlis) {
        this.codVlis = codVlis;
        return this;
    }

    public String getCodDtip() {
        return codDtip;
    }

    public MtbColt setCodDtip(String codDtip) {
        this.codDtip = codDtip;
        return this;
    }

    public String getCodTcol() {
        return codTcol;
    }

    public MtbColt setCodTcol(String codTcol) {
        this.codTcol = codTcol;
        return this;
    }

    public String getSerDoc() {
        return serDoc;
    }

    public MtbColt setSerDoc(String serDoc) {
        this.serDoc = serDoc;
        return this;
    }

    public String getFiltroOrdini() {
        return filtroOrdini;
    }

    public MtbColt setFiltroOrdini(String filtroOrdini) {
        this.filtroOrdini = filtroOrdini;
        return this;
    }

    public String getPreparatoDa() {
        return preparatoDa;
    }

    public MtbColt setPreparatoDa(String preparatoDa) {
        this.preparatoDa = preparatoDa;
        return this;
    }

    public String getAnnotazioni() {
        return annotazioni;
    }

    public MtbColt setAnnotazioni(String annotazioni) {
        this.annotazioni = annotazioni;
        return this;
    }

    public String getPosizione() {
        return posizione;
    }

    public MtbColt setPosizione(String posizione) {
        this.posizione = posizione;
        return this;
    }

    public String getCodDtipProvv() {
        return codDtipProvv;
    }

    public MtbColt setCodDtipProvv(String codDtipProvv) {
        this.codDtipProvv = codDtipProvv;
        return this;
    }

    public String getSerDocProvv() {
        return serDocProvv;
    }

    public MtbColt setSerDocProvv(String serDocProvv) {
        this.serDocProvv = serDocProvv;
        return this;
    }

    public String getCodJfas() {
        return codJfas;
    }

    public MtbColt setCodJfas(String codJfas) {
        this.codJfas = codJfas;
        return this;
    }

    public String getDataOrd() {
        return dataOrd;
    }

    public MtbColt setDataOrd(String dataOrd) {
        this.dataOrd = dataOrd;
        return this;
    }

    public MtbColt setDataOrdD(Date dataOrd) {
        if(dataOrd != null) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
            this.dataOrd = sdf.format(dataOrd);
        } else this.dataOrd = null;
        return this;
    }

    public String getDataDoc() {
        return dataDoc;
    }

    public MtbColt setDataDoc(String dataDoc) {
        this.dataDoc = dataDoc;
        return this;
    }

    public String getOraInizPrep() {
        return oraInizPrep;
    }

    public MtbColt setOraInizPrep(String oraInizPrep) {
        this.oraInizPrep = oraInizPrep;
        return this;
    }

    public MtbColt setOraInizPrep(Date oraInizPrep) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        this.oraInizPrep = sdf.format(oraInizPrep);
        return this;
    }

    public String getOraFinePrep() {
        return oraFinePrep;
    }

    public MtbColt setOraFinePrep(String oraFinePrep) {
        this.oraFinePrep = oraFinePrep;
        return this;
    }

    public MtbColt setOraFinePrep(Date oraFinePrep) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        this.oraFinePrep = sdf.format(oraFinePrep);
        return this;
    }

    public String getDataDocProvv() {
        return dataDocProvv;
    }

    public MtbColt setDataDocProvv(String dataDocProvv) {
        this.dataDocProvv = dataDocProvv;
        return this;
    }

    public String getDataVers() {
        return dataVers;
    }

    public MtbColt setDataVers(String dataVers) {
        this.dataVers = dataVers;
        return this;
    }

    public Integer getSegno() {
        return segno;
    }

    public MtbColt setSegno(Integer segno) {
        this.segno = segno;
        return this;
    }

    public Integer getNumOrd() {
        return numOrd;
    }

    public MtbColt setNumOrd(Integer numOrd) {
        this.numOrd = numOrd;
        return this;
    }

    public Integer getNumDoc() {
        return numDoc;
    }

    public MtbColt setNumDoc(Integer numDoc) {
        this.numDoc = numDoc;
        return this;
    }

    public Integer getNumDocProvv() {
        return numDocProvv;
    }

    public MtbColt setNumDocProvv(Integer numDocProvv) {
        this.numDocProvv = numDocProvv;
        return this;
    }

    public BigDecimal getPesoKg() {
        return pesoKg;
    }

    public MtbColt setPesoKg(BigDecimal pesoKg) {
        this.pesoKg = pesoKg;
        return this;
    }

    public BigDecimal getLunghezzaCm() {
        return lunghezzaCm;
    }

    public MtbColt setLunghezzaCm(BigDecimal lunghezzaCm) {
        this.lunghezzaCm = lunghezzaCm;
        return this;
    }

    public BigDecimal getLarghezzaCm() {
        return larghezzaCm;
    }

    public MtbColt setLarghezzaCm(BigDecimal larghezzaCm) {
        this.larghezzaCm = larghezzaCm;
        return this;
    }

    public BigDecimal getAltezzaCm() {
        return altezzaCm;
    }

    public MtbColt setAltezzaCm(BigDecimal altezzaCm) {
        this.altezzaCm = altezzaCm;
        return this;
    }


    public List<MtbCols> getMtbCols() {
        return mtbCols;
    }

    public MtbColt setMtbCols(List<MtbCols> mtbCols) {
        this.mtbCols = mtbCols;
        return this;
    }

    public Boolean getDisablePrint() {
        return disablePrint == null ? false : disablePrint;
    }

    public MtbColt setDisablePrint(Boolean disablePrint) {
        this.disablePrint = disablePrint;
        return this;
    }

    public void generaFiltroOrdineFromDTO(List<FiltroOrdineDTO> filtroOrdineDtos) {

        String xmlPrefix = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><FILTER>";
        String xmlSuffix = "</FILTER></ROOT>";

        StringBuilder xmlContent = new StringBuilder();

        if(filtroOrdineDtos != null && filtroOrdineDtos.size() > 0) {

            for(int i = 0; i < filtroOrdineDtos.size(); i++){
                FiltroOrdineDTO x = filtroOrdineDtos.get(i);

                try {
                    xmlContent.append("<DTB_ORDT COND=\"OR\"><GESTIONE type=\"V\">" + x.getGestioneOrd() + "</GESTIONE><DATA_ORD type=\"D\">" + UtilityDate.formatDate(x.getDataOrdD(), UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH) + "</DATA_ORD><NUM_ORD type=\"N\">" + x.getNumOrd() + "</NUM_ORD></DTB_ORDT>");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }

        this.filtroOrdini = xmlPrefix + xmlContent + xmlSuffix;
    }



}
