
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Modelo {
	private Connection connection;
	private static final String crearDB = "create database if not exists gestionGastos;\n";
	private static final String crearTranasccion = "create table if not exists transacciones (\n" + 
			"	id int primary key auto_increment,\n" + 
			"   nombre varchar(30),\n"+
			"	dinero float,\n" + 
			"   fecha date\n" + 
			");";
	/**
	 * Inicia la conexion de la base de datos que usara el modelo
	 */
	Modelo(){
		try {
			String configuracion = null;
			try {
				configuracion = Configuracion.cargarConfiguracion();
			}catch (Exception e) {
				Configuracion.guardarConfiguracion("1234");
				try {
					configuracion = Configuracion.cargarConfiguracion();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			connection = DriverManager.getConnection(configuracion);
			Statement crearDB = connection.createStatement();
			crearDB.executeQuery(Modelo.crearDB);
			crearDB.executeUpdate(Modelo.crearTranasccion);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Inserta una transaccion
	 * 
	 * @param nombre	nombre de la transaccion
	 * @param dinero	cantidad de efectivo de la transaccion
	 * @param fecha		fecha de la transaccion
	 */
	public void insertarTransaccion(String nombre, float dinero, String fecha) {
		 String query = "insert into transacciones(nombre, dinero, fecha) values(?, ?, ?);";
		 try {
			PreparedStatement stmt = this.connection.prepareStatement(query);
			stmt.setString(1, nombre);
			stmt.setFloat(2, dinero);
			stmt.setString(3, fecha);
			stmt.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Obtiene las transaciones
	 * 
	 * @return	Devuelve el result set de la consulta
	 */
	public ResultSet obtenerTransacciones() {
		String query = "select * " + 
				"from transacciones;";
		ResultSet ret = null; 
		try {
			PreparedStatement stmt = this.connection.prepareStatement(query);
			ret = stmt.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return ret;
	}
	
	/**
	 * Elimina una transaccion del id pasado
	 * 
	 * @param id	id de la transaccion a eliminar
	 */
	public void eliminartransaccion(int id) {
		String query ="delete from transacciones " + 
				"where id=?;"; 
		try {
			PreparedStatement stmt = this.connection.prepareStatement(query);
			stmt.setInt(1, id);
			stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Modifica una transaccion por todos sus datos, por id
	 * 
	 * @param id		id de la transaccion a cambiar
	 * @param nombre	nuevo nombre
	 * @param dinero	nueva cantidad de la transaccion
	 * @param fecha		nueva fecha de la transaccion
	 */
	public void modificarTransaccion(int id, String nombre, float dinero, String fecha) {
		String query ="update transacciones " + 
				"set nombre=?, dinero=?, fecha=? "+
				"where id=?;";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(query);
			stmt.setString(1, nombre);
			stmt.setFloat(2, dinero);
			stmt.setString(3, fecha);
			stmt.setInt(4, id);
			stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Busca las transacciones con ese id
	 * 
	 * @param id	id de la transaccion a buscar
	 * @return		resultado de la consulta
	 */
	public ResultSet buscarTransaccion(int id) {
		String query = "select * " + 
				"from transacciones " + 
				"where id=?;";
		ResultSet ret = null; 
		try {
			PreparedStatement stmt = this.connection.prepareStatement(query);
			stmt.setInt(1, id);
			ret = stmt.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return ret;
	}
	
}
