package com.softgraf.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JOptionPane;

import com.softgraf.model.abstrato.AbstractGenericDAO;
import com.softgraf.model.vo.Cheque;

// 19
public class ChequeDAO extends AbstractGenericDAO<Cheque>{

	private Connection conexao;
	private PreparedStatement pst; // executor de comandos
	private String sql;

	public ChequeDAO(Connection conexao) {	this.conexao = conexao; }
	
	@Override
	public boolean inserir(Cheque cheque) {
		int retorno = 0;
		sql = "INSERT INTO cheque (id_agencia, numConta, numCheque, valor, id_cliente, dataDesde, " +
			          "dataEmissao, dataBomPara, historico, totalFolhas, numFolha, uso, id_finalidade) " +
				      " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setInt(1, cheque.getIdAgencia()); 
			pst.setInt(2, cheque.getNumConta());
			pst.setInt(3, cheque.getNumCheque());
			pst.setFloat(4, cheque.getValor());
			pst.setInt(5, cheque.getIdCliente());
			// conversão de datas
			pst.setDate(6, new java.sql.Date(cheque.getDataDesde().getTime()));
			pst.setDate(7, new java.sql.Date(cheque.getDataEmissao().getTime()));
			pst.setDate(8, new java.sql.Date(cheque.getDataBomPara().getTime()));
			pst.setInt(9, cheque.getHistorico());
			pst.setInt(10, cheque.getTotalFolhas());
			pst.setInt(11, cheque.getNumFolha());
			pst.setBoolean(12, cheque.isUso());
			pst.setInt(13, cheque.getIdFinalidade());
			retorno = pst.executeUpdate();
			pst.close();

		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,	"Erro de sentença SQL ao inserir cheque.");
		}

		return retorno > 0;
	}

	@Override
	public boolean remover(int pk) {
		int retorno = 0;
		sql = "DELETE FROM cheque WHERE id_cheque=?";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setInt(1, pk);
			retorno = pst.executeUpdate();
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Erro de sentença SQL ao remover cheque.");
		}
		
		return retorno > 0;
	}

	@Override
	public boolean atualizar(int pk, Cheque cheque) {
		int retorno = 0;
		//(agencia, banco, nomeAgencia, endereco, bairro, cidade, uf, fone)
		sql = "UPDATE cheque SET id_agencia=?, numConta=?, numCheque=?, valor=?, id_cliente=?, dataDesde=?, " +
		          "dataEmissao=?, dataBomPara=?, historico=?, totalFolhas=?, numFolha=?, uso=?, id_finalidade=? " +
				  "WHERE id_cheque=?";
				
		try {
			pst = conexao.prepareStatement(sql); 
			pst.setInt(1, cheque.getIdAgencia()); 
			pst.setInt(2, cheque.getNumConta());
			pst.setInt(3, cheque.getNumCheque());
			pst.setFloat(4, cheque.getValor());
			pst.setInt(5, cheque.getIdCliente());
			// conversão de datas
			pst.setDate(6, new java.sql.Date(cheque.getDataDesde().getTime()));
			pst.setDate(7, new java.sql.Date(cheque.getDataEmissao().getTime()));
			pst.setDate(8, new java.sql.Date(cheque.getDataBomPara().getTime()));
			pst.setInt(9, cheque.getHistorico());
			pst.setInt(10, cheque.getTotalFolhas());
			pst.setInt(11, cheque.getNumFolha());
			pst.setBoolean(12, cheque.isUso());
			pst.setInt(13, cheque.getIdFinalidade());
			pst.setInt(14, pk);
			retorno = pst.executeUpdate();
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Erro de sentença SQL ao atualizar agencia.");
		}
		
		return retorno > 0;
	}

	@Override
	public ArrayList<Cheque> listar() {
		ArrayList<Cheque> listaCheque = new ArrayList<Cheque>();
		Cheque cheque;
		Integer idCheque, idAgencia, numConta, numCheque, idCliente,
		 		historico, totalFolhas, numFolha, idFinalidade;
		Float valor;
		// pacote java.util.Date
		Date dataDesde, dataEmissao, dataBomPara;
		boolean uso;
		sql = "SELECT * FROM cheque";
		
		try {
			pst = conexao.prepareStatement(sql);
			ResultSet rs = pst.executeQuery();
			
			while (rs.next()) {
				idCheque = rs.getInt("id_cheque");
				idAgencia = rs.getInt("id_agencia"); 
				numConta = rs.getInt("numConta");
				numCheque = rs.getInt("numCheque");
				valor = rs.getFloat("valor");
				idCliente = rs.getInt("id_cliente");
				// pacote java.util.Date
				dataDesde = new Date(rs.getDate("dataDesde").getTime());
				dataEmissao = new Date(rs.getDate("dataEmissao").getTime());
				dataBomPara = new Date(rs.getDate("dataBomPara").getTime());
				historico = rs.getInt("historico");
				totalFolhas = rs.getInt("totalFolhas");
				numFolha = rs.getInt("numFolha");
				uso = rs.getBoolean("uso");
				idFinalidade = rs.getInt("id_finalidade");
				
				cheque = new Cheque(idAgencia, numConta, numCheque, idCliente, historico, totalFolhas, 
									  numFolha, idFinalidade, valor, dataDesde, dataEmissao, dataBomPara, uso);
				cheque.setIdCheque(idCheque);
				listaCheque.add(cheque);
			}
			
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"Erro de sentença SQL ao listar cheque.");
		}
			
		return !listaCheque.isEmpty() ? listaCheque : null;			
	}

	@Override
	public Cheque buscar(int pk) {
		Cheque cheque = null;
		sql = "SELECT * FROM cheque WHERE id_cheque=?";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setInt(1, pk);
			ResultSet rs = pst.executeQuery();

			if (rs.next()) {
				Integer idAgencia = rs.getInt("id_agencia"); 
				Integer numConta = rs.getInt("numConta");
				Integer numCheque = rs.getInt("numCheque");
				Float valor = rs.getFloat("valor");
				Integer idCliente = rs.getInt("id_cliente");
				// pacote java.util.Date
				Date dataDesde = new Date (rs.getDate("dataDesde").getTime());
				Date dataEmissao = new Date (rs.getDate("dataEmissao").getTime());
				Date dataBomPara = new Date(rs.getDate("dataBomPara").getTime());
				Integer historico = rs.getInt("historico");
				Integer totalFolhas = rs.getInt("totalFolhas");
				Integer numFolha = rs.getInt("numFolha");
				boolean uso = rs.getBoolean("uso");
				Integer idFinalidade = rs.getInt("id_finalidade");
				
				cheque = new Cheque(idAgencia, numConta, numCheque, idCliente, historico, totalFolhas, 
						  numFolha, idFinalidade, valor, dataDesde, dataEmissao, dataBomPara, uso);
				cheque.setIdCheque(pk);
			}
			
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Erro na sentença SQL ao buscar cheque");
		}
		
		return cheque;
	}
}
