package net.mc_pandacraft.java.plugin.pandacraftutils.data_model;

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

import org.apache.commons.lang.StringUtils;

import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
import net.mc_pandacraft.java.util.mysql.DBConnection;

public abstract class Table {
	
	DBConnection db = PandacraftUtils.getInstance().databaseConnection;
	
	
	private boolean saved = false;
	
	
	// champ relatif aux données
	private int id = 0;
	
	
	
	public Table() {
		
		
	}
	
	
	
	
	
	public void save() {
		String tableName = this.getClass().getSimpleName();
		
		try {
			Connection conn;
			conn = db.getConnection();

			String[] fields = getFieldsName(), values = getValues();
			
			
			
			if (saved)
			{	// mettre à jour les valeurs dans la base
				String sql = "";
				for (int i=0; i<fields.length && i<values.length; i++)
				{
					sql += fields[i]+" = ? ";
				}
				
				PreparedStatement st = conn.prepareStatement("UPDATE "+tableName+" SET "+sql+" WHERE id="+id);

				for (int i=0; i<fields.length && i<values.length; i++)
				{
					st.setString(i+1, values[i]);
				}
				
				st.executeUpdate();
			}
			else
			{	// ajouter dans la base
				String concat_vals = "";
				String concat_fields = StringUtils.join(fields, ',');
				for (int i=0; i<fields.length && i<values.length; i++)
				{
					if (i!=0) concat_vals += ",";
					concat_vals += " ? ";
				}
				
				
				PreparedStatement st = conn.prepareStatement("INSERT INTO "+tableName+"  ("+concat_fields+") VALUES ("+concat_vals+")", Statement.RETURN_GENERATED_KEYS);

				for (int i=0; i<fields.length && i<values.length; i++)
				{
					st.setString(i+1, values[i]);
				}
				
				id = st.executeUpdate();
				saved = true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
	
	
	public void delete() {
		String tableName = this.getClass().getSimpleName();
		
		try {
			if (saved)
			{	//  supprimer la ligne de la base
				PreparedStatement st = db.getConnection().prepareStatement("DELETE FROM "+tableName+" WHERE id="+id);
				st.executeUpdate();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
	
	/**
	 * Récupère la liste des valeurs des champs de la table correspondante, excepté
	 * le champ <code>id</code>
	 * @return les valeurs des champs sous la forme de chaine de caractères
	 */
	public abstract String[] getValues();
	
	

	/**
	 * Récupère la liste des noms des champs de la table correspondante, excepté
	 * le champ <code>id</code>
	 * @return les noms des champs sous la forme de chaine de caractères
	 */
	public abstract String[] getFieldsName();
}
