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 javax.swing.JOptionPane;
import com.softgraf.model.abstrato.AbstractGenericDAO;
import com.softgraf.model.vo.Agencia;

// 16
public class AgenciaDAO extends AbstractGenericDAO<Agencia> {

	private Connection conexao;
	private PreparedStatement pst; // executor de comandos
	private String sql;

	public AgenciaDAO(Connection conexao) {
		this.conexao = conexao;
	}

	@Override
	public boolean inserir(Agencia agencia) {
		int retorno = 0;
		sql = "INSERT INTO agencia (agencia, banco, nomeAgencia, endereco, bairro, cidade, uf, fone) " +
				      " VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setInt(1, agencia.getAgencia()); 
			pst.setInt(2, agencia.getBanco());
			pst.setString(3, agencia.getNomeAgencia());
			pst.setString(4, agencia.getEndereco());
			pst.setString(5, agencia.getBairro());
			pst.setString(6, agencia.getCidade());
			pst.setString(7, agencia.getUf());
			pst.setString(8, agencia.getFone());
			retorno = pst.executeUpdate();
			pst.close();

		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,	"Erro de sentença SQL ao inserir agencia.");
		}

		return retorno > 0;
	}

	@Override
	public boolean remover(int pk) {
		int retorno = 0;
		sql = "DELETE FROM agencia WHERE id_agencia=?";
		
		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 agencia.");
		}
		
		return retorno > 0;
	}

	@Override
	public boolean atualizar(int pk, Agencia agencia) {
		int retorno = 0;
		//(agencia, banco, nomeAgencia, endereco, bairro, cidade, uf, fone)
		sql = "UPDATE agencia SET agencia=?, banco=?, nomeAgencia=?, endereco=?, bairro=?, cidade=?, uf=?, fone=? " +
		                     "WHERE id_agencia=?";
		
		try {
			pst = conexao.prepareStatement(sql); 
			pst.setInt(1, agencia.getAgencia());
			pst.setInt(2, agencia.getBanco());
			pst.setString(3, agencia.getNomeAgencia());
			pst.setString(4, agencia.getEndereco());
			pst.setString(5, agencia.getBairro());
			pst.setString(6, agencia.getCidade());
			pst.setString(7, agencia.getUf());
			pst.setString(8, agencia.getFone());
			pst.setInt(9, 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<Agencia> listar() {
		ArrayList<Agencia> listaAgencias = new ArrayList<Agencia>();
		Agencia agencia;
		int idAgencia, numAgencia, banco;
		String nomeAgencia, endereco, bairro, cidade, uf, fone;
		sql = "SELECT * FROM agencia";
		
		try {
			pst = conexao.prepareStatement(sql);
			ResultSet rs = pst.executeQuery();
			
			while (rs.next()) {
				idAgencia = rs.getInt("id_agencia");
				numAgencia = rs.getInt("agencia"); 
				banco = rs.getInt("banco");
				nomeAgencia = rs.getString("nomeAgencia");
				endereco = rs.getString("endereco");
				bairro = rs.getString("bairro");
				cidade = rs.getString("cidade");
				uf = rs.getString("uf");
				fone = rs.getString("fone");
				
				agencia = new Agencia(numAgencia, banco);
				agencia.setIdAgencia(idAgencia);
				agencia.setNomeAgencia(nomeAgencia);
				agencia.setEndereco(endereco);
				agencia.setBairro(bairro);
				agencia.setCidade(cidade);
				agencia.setUf(uf);
				agencia.setFone(fone);
				
				listaAgencias.add(agencia);
			}
			
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"Erro de sentença SQL ao listar agencia.");
		}
			
		return !listaAgencias.isEmpty() ? listaAgencias : null;			
	}

	@Override
	public Agencia buscar(int pk) {
		Agencia agencia = null;
		sql = "SELECT * FROM agencia WHERE id_agencia=?";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setInt(1, pk);
			ResultSet rs = pst.executeQuery();

			if (rs.next()) {
				int banco = rs.getInt("banco");
				int numAgencia = rs.getInt("agencia");
				String nomeAgencia = rs.getString("nomeAgencia");
				String endereco = rs.getString("endereco");
				String bairro = rs.getString("bairro");
				String cidade = rs.getString("cidade");
				String uf = rs.getString("uf");
				String fone = rs.getString("fone");
				
				agencia = new Agencia(numAgencia, banco);
				agencia.setIdAgencia(pk);
				agencia.setNomeAgencia(nomeAgencia);
				agencia.setEndereco(endereco);
				agencia.setBairro(bairro);
				agencia.setCidade(cidade);
				agencia.setUf(uf);
				agencia.setFone(fone);
			}
			
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Erro na sentença SQL ao buscar agencia");
		}
		
		return agencia;
	}

}
