package com.thundergemios10.survivalgames.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Logger;


import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.Plugin;
import com.thundergemios10.survivalgames.SettingsManager;




public class DatabaseManager {
    private  Connection conn;
    private  Logger log;
    private  static DatabaseManager instance = new DatabaseManager();

    private DatabaseManager(){

    }

    public static DatabaseManager getInstance(){
        return instance;
    }


    public void setup(Plugin p){
        log = p.getLogger();
        connect();
    }


    public  Connection getMysqlConnection()
    {
        return conn;
    }

    public boolean connectToDB(String host, int port, String db, String user, String pass)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + db, user, pass);
            return true;
        }
        catch (ClassNotFoundException e)
        {
            log.warning("Couldn't start MySQL Driver. Stopping...\n" + e.getMessage());

            return false;
        }
        catch (SQLException e)
        {
            log.warning("Couldn't connect to MySQL database. Stopping...\n" + e.getMessage());
            return false;
        }
    }

    public PreparedStatement createStatement(String query)
    {
        int times = 0;
        PreparedStatement p = null;
            try
            {
                times ++;
                p =  conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
            }
            catch (SQLException e)
            {
                if (times == 5){
                   // System.out.println("[SurvivalGames][SQL ERROR] ATTEMPTED TO CONNECT TO DATABASE 5 TIMES AND FAILED! CONNECTION LOST.");
                    return null;
                }
                connect();
            }
        


        return p;


    }

    public Statement createStatement()
    {
        try
        {
            return conn.createStatement();
        }
        catch (SQLException e)
        {
            return null;
        }
    }


    public boolean connect()
    {
        //log.info("Connecting to database...");
        FileConfiguration c = SettingsManager.getInstance().getConfig();
        String host =  c.getString("sql.host", "localhost");
        int port    =  c.getInt("sql.port",  3306);
        String db   =  c.getString("sql.database", "SurvivalGames");
        String user =  c.getString("sql.user", "root");
        String pass =  c.getString("sql.pass",  "");
        return this.connectToDB(host, port, db, user,pass);
    }

}