package tmrechnungstool.dto.h2;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import tmrechnungstool.dto.XxxDto;
import tmrechnungstool.tmUtils.TmLog;
import tmrechnungstool.tmUtils.TmUtils;

/**
 *
 * @author VRomanov
 */
public class H2_Artikel {

    private static final String TAB_NAME = "artikel";

    public static List<XxxDto> load() {
        List<XxxDto> res = new ArrayList<XxxDto>();

        if (!H2.tabVorhanden(TAB_NAME)) {
            createTabelle(); //Tabelle anlegen

        } else {
            //Spalten hinzufügen?
            if (!notVorhanden("abrNeueZahlstatus")) {
                addColumn("abrNeueZahlstatus VARCHAR");
            }

            //Tabelle auslesen
            res = selectFromDb();
        }

        return res;
    }

    private static boolean notVorhanden(String columnName) {
        Statement select;
        try {
            select = H2.getConnection().createStatement();
            ResultSet result = select.executeQuery("SELECT " + columnName + " FROM " + TAB_NAME);

            while (result.next()) {
            }
        } catch (SQLException ex) {
            return false;
        }
        return true;
    }

    private static void addColumn(String colTyp) {
        try {
            Statement stmt = H2.getConnection().createStatement();
            String createTabelle = "ALTER TABLE " + TAB_NAME + " ADD " + colTyp;
            stmt.executeUpdate(createTabelle);
            H2.addTabName(TAB_NAME);

        } catch (SQLException ex) {
            TmLog.log("Error in addColumn: (" + TAB_NAME + ")\n" + ex);
        }
    }

    private static void createTabelle() {
        try {
            Statement stmt = H2.getConnection().createStatement();
            String createTabelle = "CREATE TABLE IF NOT EXISTS "
                    + TAB_NAME
                    + "(ID_H2 INT PRIMARY KEY AUTO_INCREMENT(1,1) NOT NULL,"
                    + "id VARCHAR,"
                    + "vertragsart VARCHAR,"
                    + "nummer VARCHAR,"
                    + "dtBeginn VARCHAR,"
                    + "dtEnde VARCHAR,"
                    + "dtLast VARCHAR,"
                    + "dtNext VARCHAR,"
                    + "abrVorbeginn VARCHAR,"
                    + "abrFreq VARCHAR,"
                    + "abrNeueRechnung VARCHAR,"
                    + "abrNeueRart VARCHAR,"
                    + "abrNeueMail VARCHAR,"
                    + "abrNeueLastschrift VARCHAR,"
                    + "dauerAnz VARCHAR,"
                    + "dauerEinheit VARCHAR,"
                    + "autoVerl VARCHAR,"
                    + "status VARCHAR,"
                    + "kuendVormerken VARCHAR,"
                    + "dtKuendZum VARCHAR,"
                    + "kuendGrund VARCHAR,"
                    + "betragNetto VARCHAR,"
                    + "betragSatz VARCHAR,"
                    + "betragUst VARCHAR,"
                    + "betragBrutto VARCHAR,"
                    + "kundenNr VARCHAR,"
                    + "kundenEmp1 VARCHAR,"
                    + "kundenEmp2 VARCHAR,"
                    + "kundenStr VARCHAR,"
                    + "kundenPlz VARCHAR,"
                    + "kundenOrt VARCHAR,"
                    + "kundenLand VARCHAR,"
                    + "kundenAnrede VARCHAR,"
                    + "kundenAnsprechpartner VARCHAR,"
                    + "kundenMail VARCHAR,"
                    + "kundenTel VARCHAR,"
                    + "kundenKontoinhaber VARCHAR,"
                    + "kundenIban VARCHAR,"
                    + "kundenBic VARCHAR,"
                    + "kundenBank VARCHAR,"
                    + "kundenMandant VARCHAR,"
                    + "kundenUnterschrift VARCHAR,"
                    + "abrNeueZahlstatus VARCHAR)";
            stmt.executeUpdate(createTabelle);
            H2.addTabName(TAB_NAME);

            if (H2.H2_DEBUG) {
                System.out.println("H2 createTabelleIfNotExists, neue Tabelle=" + TAB_NAME);
            }
        } catch (SQLException ex) {
            TmLog.log("Error in createTabelleIfNotExists: (" + TAB_NAME + ")\n" + ex);
        }
    }

    //insert new dto in db
    public static void insertInDb(XxxDto obj) {

        try {

            PreparedStatement stmt = H2.getConnection().prepareStatement("INSERT INTO " + TAB_NAME + " ("
                    + "id,"
                    + "vertragsart,"
                    + "nummer,"
                    + "dtBeginn,"
                    + "dtEnde,"
                    + "dtLast,"
                    + "dtNext,"
                    + "abrVorbeginn,"
                    + "abrFreq,"
                    + "abrNeueRechnung,"
                    + "abrNeueRart,"
                    + "abrNeueMail,"
                    + "abrNeueLastschrift,"
                    + "dauerAnz,"
                    + "dauerEinheit,"
                    + "autoVerl,"
                    + "status,"
                    + "kuendVormerken,"
                    + "dtKuendZum,"
                    + "kuendGrund,"
                    + "betragNetto,"
                    + "betragSatz,"
                    + "betragUst,"
                    + "betragBrutto,"
                    + "kundenNr,"
                    + "kundenEmp1,"
                    + "kundenEmp2,"
                    + "kundenStr,"
                    + "kundenPlz,"
                    + "kundenOrt,"
                    + "kundenLand,"
                    + "kundenAnrede,"
                    + "kundenAnsprechpartner,"
                    + "kundenMail,"
                    + "kundenTel,"
                    + "kundenKontoinhaber,"
                    + "kundenIban,"
                    + "kundenBic,"
                    + "kundenBank,"
                    + "kundenMandant,"
                    + "kundenUnterschrift,"
                    + "abrNeueZahlstatus"
                    + ") values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
                    Statement.RETURN_GENERATED_KEYS);

            stmt.setString(1, obj.getId());
            stmt.setString(2, obj.getVertragsart());
            stmt.setString(3, obj.getNummer());
            stmt.setString(4, obj.getDtBeginn());
            stmt.setString(5, obj.getDtEnde());
            stmt.setString(6, obj.getDtLast());
            stmt.setString(7, obj.getDtNext());
            if (obj.isAbrVorbeginn()) {
                stmt.setString(8, "1");
            } else {
                stmt.setString(8, "0");
            }
            stmt.setString(9, "" + obj.getAbrFreq());
            if (obj.isAbrNeueRechnung()) {
                stmt.setString(10, "1");
            } else {
                stmt.setString(10, "0");
            }
            stmt.setString(11, obj.getAbrNeueRart());
            if (obj.isAbrNeueMail()) {
                stmt.setString(12, "1");
            } else {
                stmt.setString(12, "0");
            }
            if (obj.isAbrNeueLastschrift()) {
                stmt.setString(13, "1");
            } else {
                stmt.setString(13, "0");
            }
            stmt.setString(14, obj.getDauerAnz());
            stmt.setString(15, "" + obj.getDauerEinheit());
            if (obj.isAutoVerl()) {
                stmt.setString(16, "1");
            } else {
                stmt.setString(16, "0");
            }
            stmt.setString(17, "" + obj.getStatus());
            if (obj.isKuendVormerken()) {
                stmt.setString(18, "1");
            } else {
                stmt.setString(18, "0");
            }
            stmt.setString(19, obj.getDtKuendZum());
            stmt.setString(20, obj.getKuendGrund());
            stmt.setString(21, obj.getBetragNetto());
            stmt.setString(22, obj.getBetragSatz());
            stmt.setString(23, obj.getBetragUst());
            stmt.setString(24, obj.getBetragBrutto());
            stmt.setString(25, obj.getKundenNr());
            stmt.setString(26, obj.getKundenEmp1());
            stmt.setString(27, obj.getKundenEmp2());
            stmt.setString(28, obj.getKundenStr());
            stmt.setString(29, obj.getKundenPlz());
            stmt.setString(30, obj.getKundenOrt());
            stmt.setString(31, obj.getKundenLand());
            stmt.setString(32, obj.getKundenAnrede());
            stmt.setString(33, obj.getKundenAnsprechpartner());
            stmt.setString(34, obj.getKundenMail());
            stmt.setString(35, obj.getKundenTel());
            stmt.setString(36, obj.getKundenKontoinhaber());
            stmt.setString(37, obj.getKundenIban());
            stmt.setString(38, obj.getKundenBic());
            stmt.setString(39, obj.getKundenBank());
            stmt.setString(40, obj.getKundenMandant());
            stmt.setString(41, obj.getKundenUnterschrift());
            stmt.setString(42, obj.getAbrNeueZahlstatus());

            stmt.executeUpdate();

            //Return last id
            ResultSet rs = stmt.getGeneratedKeys();
            rs.next();
            int idObj = rs.getInt(1);
            obj.setIdVertrag(idObj);

        } catch (SQLException ex) {
            TmLog.log("Error in insertInDb: " + ex);
            System.out.println("Error in insertInDb: " + ex);
        }
        if (H2.H2_DEBUG) {
            System.out.println("H2 insert: tab=" + TAB_NAME + "; Object=" + obj.getNummer());
        }
    }

    //Tabelle lesen
    public static List<XxxDto> selectFromDb() {
        List<XxxDto> res = new ArrayList<XxxDto>();

        Statement select;
        try {
            select = H2.getConnection().createStatement();
            ResultSet result = select.executeQuery("SELECT "
                    + "ID_H2,"
                    + "id,"
                    + "vertragsart,"
                    + "nummer,"
                    + "dtBeginn,"
                    + "dtEnde,"
                    + "dtLast,"
                    + "dtNext,"
                    + "abrVorbeginn,"
                    + "abrFreq,"
                    + "abrNeueRechnung,"
                    + "abrNeueRart,"
                    + "abrNeueMail,"
                    + "abrNeueLastschrift,"
                    + "dauerAnz,"
                    + "dauerEinheit,"
                    + "autoVerl,"
                    + "status,"
                    + "kuendVormerken,"
                    + "dtKuendZum,"
                    + "kuendGrund,"
                    + "betragNetto,"
                    + "betragSatz,"
                    + "betragUst,"
                    + "betragBrutto,"
                    + "kundenNr,"
                    + "kundenEmp1,"
                    + "kundenEmp2,"
                    + "kundenStr,"
                    + "kundenPlz,"
                    + "kundenOrt,"
                    + "kundenLand,"
                    + "kundenAnrede,"
                    + "kundenAnsprechpartner,"
                    + "kundenMail,"
                    + "kundenTel,"
                    + "kundenKontoinhaber,"
                    + "kundenIban,"
                    + "kundenBic,"
                    + "kundenBank,"
                    + "kundenMandant,"
                    + "kundenUnterschrift,"
                    + "abrNeueZahlstatus"
                    + " FROM " + TAB_NAME);

            while (result.next()) {
                XxxDto obj = new XxxDto();
                int idVertrag = result.getInt(1);
                obj.setIdVertrag(idVertrag);
                obj.setId(result.getString(2));
                obj.setVertragsart(result.getString(3));
                obj.setNummer(result.getString(4));
                obj.setDtBeginn(result.getString(5));
                obj.setDtEnde(result.getString(6));
                obj.setDtLast(result.getString(7));
                obj.setDtNext(result.getString(8));
                if (result.getString(9).equals("1")) {
                    obj.setAbrVorbeginn(true);
                } else {
                    obj.setAbrVorbeginn(false);
                }
                obj.setAbrFreq(TmUtils.pars(result.getString(10), 0));
                if (result.getString(11).equals("1")) {
                    obj.setAbrNeueRechnung(true);
                } else {
                    obj.setAbrNeueRechnung(false);
                }
                obj.setAbrNeueRart(result.getString(12));
                if (result.getString(13).equals("1")) {
                    obj.setAbrNeueMail(true);
                } else {
                    obj.setAbrNeueMail(false);
                }
                if (result.getString(14).equals("1")) {
                    obj.setAbrNeueLastschrift(true);
                } else {
                    obj.setAbrNeueLastschrift(false);
                }
                obj.setDauerAnz(result.getString(15));
                obj.setDauerEinheit(TmUtils.pars(result.getString(16), 0));
                if (result.getString(17).equals("1")) {
                    obj.setAutoVerl(true);
                } else {
                    obj.setAutoVerl(false);
                }
                obj.setStatus(TmUtils.pars(result.getString(18), 0));
                if (result.getString(19).equals("1")) {
                    obj.setKuendVormerken(true);
                } else {
                    obj.setKuendVormerken(false);
                }
                obj.setDtKuendZum(result.getString(20));
                obj.setKuendGrund(result.getString(21));
                obj.setBetragNetto(result.getString(22));
                obj.setBetragSatz(result.getString(23));
                obj.setBetragUst(result.getString(24));
                obj.setBetragBrutto(result.getString(25));
                obj.setKundenNr(result.getString(26));
                obj.setKundenEmp1(result.getString(27));
                obj.setKundenEmp2(result.getString(28));
                obj.setKundenStr(result.getString(29));
                obj.setKundenPlz(result.getString(30));
                obj.setKundenOrt(result.getString(31));
                obj.setKundenLand(result.getString(32));
                obj.setKundenAnrede(result.getString(33));
                obj.setKundenAnsprechpartner(result.getString(34));
                obj.setKundenMail(result.getString(35));
                obj.setKundenTel(result.getString(36));
                obj.setKundenKontoinhaber(result.getString(37));
                obj.setKundenIban(result.getString(38));
                obj.setKundenBic(result.getString(39));
                obj.setKundenBank(result.getString(40));
                obj.setKundenMandant(result.getString(41));
                obj.setKundenUnterschrift(result.getString(42));
                obj.setAbrNeueZahlstatus(result.getString(43));

                res.add(obj);

            }
        } catch (SQLException ex) {
            String er = "Error in selectFromDb: " + ex + " tabNummer: " + TAB_NAME;
            TmLog.log(er);
            System.out.println(er);
        }

        if (H2.H2_DEBUG) {
            System.out.println("h2 select: tab=" + TAB_NAME + "; ");
        }
        return res;
    }

    //Update Rechnung
    public static void updateInDb(XxxDto obj) {

        try {

            PreparedStatement stmt = H2.getConnection().prepareStatement("UPDATE " + TAB_NAME + " SET "
                    + "id=?,"
                    + "vertragsart=?,"
                    + "nummer=?,"
                    + "dtBeginn=?,"
                    + "dtEnde=?,"
                    + "dtLast=?,"
                    + "dtNext=?,"
                    + "abrVorbeginn=?,"
                    + "abrFreq=?,"
                    + "abrNeueRechnung=?,"
                    + "abrNeueRart=?,"
                    + "abrNeueMail=?,"
                    + "abrNeueLastschrift=?,"
                    + "dauerAnz=?,"
                    + "dauerEinheit=?,"
                    + "autoVerl=?,"
                    + "status=?,"
                    + "kuendVormerken=?,"
                    + "dtKuendZum=?,"
                    + "kuendGrund=?,"
                    + "betragNetto=?,"
                    + "betragSatz=?,"
                    + "betragUst=?,"
                    + "betragBrutto=?,"
                    + "kundenNr=?,"
                    + "kundenEmp1=?,"
                    + "kundenEmp2=?,"
                    + "kundenStr=?,"
                    + "kundenPlz=?,"
                    + "kundenOrt=?,"
                    + "kundenLand=?,"
                    + "kundenAnrede=?,"
                    + "kundenAnsprechpartner=?,"
                    + "kundenMail=?,"
                    + "kundenTel=?,"
                    + "kundenKontoinhaber=?,"
                    + "kundenIban=?,"
                    + "kundenBic=?,"
                    + "kundenBank=?,"
                    + "kundenMandant=?,"
                    + "kundenUnterschrift=?,"
                    + "abrNeueZahlstatus=?"
                    + " WHERE ID_H2=?");
            stmt.setString(1, obj.getId());
            stmt.setString(2, obj.getVertragsart());
            stmt.setString(3, obj.getNummer());
            stmt.setString(4, obj.getDtBeginn());
            stmt.setString(5, obj.getDtEnde());
            stmt.setString(6, obj.getDtLast());
            stmt.setString(7, obj.getDtNext());
            if (obj.isAbrVorbeginn()) {
                stmt.setString(8, "1");
            } else {
                stmt.setString(8, "0");
            }
            stmt.setString(9, "" + obj.getAbrFreq());
            if (obj.isAbrNeueRechnung()) {
                stmt.setString(10, "1");
            } else {
                stmt.setString(10, "0");
            }
            stmt.setString(11, obj.getAbrNeueRart());
            if (obj.isAbrNeueMail()) {
                stmt.setString(12, "1");
            } else {
                stmt.setString(12, "0");
            }
            if (obj.isAbrNeueLastschrift()) {
                stmt.setString(13, "1");
            } else {
                stmt.setString(13, "0");
            }
            stmt.setString(14, obj.getDauerAnz());
            stmt.setString(15, "" + obj.getDauerEinheit());
            if (obj.isAutoVerl()) {
                stmt.setString(16, "1");
            } else {
                stmt.setString(16, "0");
            }
            stmt.setString(17, "" + obj.getStatus());
            if (obj.isKuendVormerken()) {
                stmt.setString(18, "1");
            } else {
                stmt.setString(18, "0");
            }
            stmt.setString(19, obj.getDtKuendZum());
            stmt.setString(20, obj.getKuendGrund());
            stmt.setString(21, obj.getBetragNetto());
            stmt.setString(22, obj.getBetragSatz());
            stmt.setString(23, obj.getBetragUst());
            stmt.setString(24, obj.getBetragBrutto());
            stmt.setString(25, obj.getKundenNr());
            stmt.setString(26, obj.getKundenEmp1());
            stmt.setString(27, obj.getKundenEmp2());
            stmt.setString(28, obj.getKundenStr());
            stmt.setString(29, obj.getKundenPlz());
            stmt.setString(30, obj.getKundenOrt());
            stmt.setString(31, obj.getKundenLand());
            stmt.setString(32, obj.getKundenAnrede());
            stmt.setString(33, obj.getKundenAnsprechpartner());
            stmt.setString(34, obj.getKundenMail());
            stmt.setString(35, obj.getKundenTel());
            stmt.setString(36, obj.getKundenKontoinhaber());
            stmt.setString(37, obj.getKundenIban());
            stmt.setString(38, obj.getKundenBic());
            stmt.setString(39, obj.getKundenBank());
            stmt.setString(40, obj.getKundenMandant());
            stmt.setString(41, obj.getKundenUnterschrift());
            stmt.setString(42, obj.getAbrNeueZahlstatus());

            stmt.setInt(43, obj.getIdVertrag());

            stmt.executeUpdate();

        } catch (SQLException ex) {
            TmLog.log("Error in insertInDb: " + ex);
            System.out.println("Error in insertInDb: " + ex);
        }
        if (H2.H2_DEBUG) {
            System.out.println("H2 insert: tab=" + TAB_NAME + "; Object=" + obj.getNummer());
        }
    }

    public static void deleteInDb(XxxDto obj) {

        try {

            PreparedStatement stmt = H2.getConnection().prepareStatement("DELETE FROM " + TAB_NAME + " WHERE ID_H2=?");
            stmt.setInt(1, obj.getIdVertrag());
            stmt.executeUpdate();


        } catch (SQLException ex) {
            TmLog.log("Error in deleteInDb: " + ex);
            System.out.println("Error in deleteInDb: " + ex);
        }
        if (H2.H2_DEBUG) {
            System.out.println("H2 delete: tab=" + TAB_NAME + "; Object=" + obj.getIdVertrag());
        }
    }
}
