package tourplaner.data;


import tourplaner.business.ConfigHelper;
import tourplaner.business.LogHelper;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Hilfsfunktionen für die verwendung der Postgres DB
 */
public class PostgresHelper {
    /**
     * Verbindet mit der Datenbank
     * @return Das Connection Objekt
     */
    public static Connection con() {
        Connection c = null;
        try {
            Class.forName("org.postgresql.Driver");
            c = DriverManager
                    .getConnection("jdbc:postgresql://" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "url") + ":" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "port") + "/" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "dbname"),
                            ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "user"), ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "pw"));
        } catch (Exception e) {
            LogHelper.error(e.getMessage(), e.getClass().getName());
        }
        return c;
    }

    /**
     * Führt ein Sql statement ohne rückgabe aus, mit message nachricht
     * @param sql Sql command
     * @param message Mesasage die vor dem Durchführen angezeigt wird
     * @return True bei erfolg, sonst false
     */
    public static boolean executeUpdateMessage(String sql, String message){
        LogHelper.info(message, "PostgresHelper");
        return executeUpdate(sql);
    }

    /**
     * Führt ein Sql statement ohne rückgabe aus
     * @param sql Sql command
     * @return True bei erfolg, sonst false
     */
    public static boolean executeUpdate(String sql){
        try {
            exUpdate(sql);
        } catch (SQLException e) {
            LogHelper.error(e.getMessage(), e.getClass().getName());
            return false;
        }
        return true;
    }

    /**
     * Führt ein Sql statement ohne rückgabe aus
     * @param sql Sql command
     * @return True bei erfolg, sonst false
     * @throws SQLException Fehler beim ausführen
     */
    private static boolean exUpdate(String sql) throws SQLException {
        Connection c = con();
        Statement stmt;
        stmt = c.createStatement();
        stmt.executeUpdate(sql);
        stmt.close();
        c.close();
        return true;
    }


    public static boolean executeUpdateNoLog(String sql){
        try {
            exUpdate(sql);
            return true;
        }catch (Exception e){
            return false;
        }
    }
}
