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.Cliente;

// 18
public class ClienteDAO extends AbstractGenericDAO<Cliente>{
	
	private Connection conexao;
	private PreparedStatement pst; // executor de comandos
	private String sql;

	public ClienteDAO(Connection conexao) {
		this.conexao = conexao;
	}
	
	@Override
	public boolean inserir(Cliente cliente) {
		int retorno = 0;
		sql = "INSERT INTO cliente (pessoa, nome, assinatura, cpf_cnpj, rg, fone1, fone2, fone3, " +
				"email, endereco, bairro, cidade, uf) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setBoolean(1, cliente.isPessoa());
			pst.setString(2, cliente.getNome());
			pst.setString(3, cliente.getAssinatura());
			pst.setString(4, cliente.getCpf_cnpj());
			pst.setString(5, cliente.getRg());
			pst.setString(6, cliente.getFone1());
			pst.setString(7, cliente.getFone2());
			pst.setString(8, cliente.getFone3());
			pst.setString(9, cliente.getEmail());
			pst.setString(10, cliente.getEndereco());
			pst.setString(11, cliente.getBairro());
			pst.setString(12, cliente.getCidade());
			pst.setString(13, cliente.getUf());
			retorno = pst.executeUpdate();
			pst.close();

		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,	"Erro de sentença SQL ao inserir cliente.");
		}

		return retorno > 0;
	}

	@Override
	public boolean remover(int pk) {
		int retorno = 0;
		sql = "DELETE FROM cliente WHERE id_cliente=?";
		
		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 cliente.");
		}
		
		return retorno > 0;
	}

	@Override
	public boolean atualizar(int pk, Cliente cliente) {
		int retorno = 0;
		sql = "UPDATE cliente SET pessoa=?, nome=?, assinatura=?, cpf_cnpj=?, rg=?, fone1=?, fone2=?, fone3=?, " + 
			         "email=?, endereco=?, bairro=?, cidade=?, uf=? WHERE id_cliente=?";
		
		try {
			pst = conexao.prepareStatement(sql); 
			pst.setBoolean(1, cliente.isPessoa());
			pst.setString(2, cliente.getNome());
			pst.setString(3, cliente.getAssinatura());
			pst.setString(4, cliente.getCpf_cnpj());
			pst.setString(5, cliente.getRg());
			pst.setString(6, cliente.getFone1());
			pst.setString(7, cliente.getFone2());
			pst.setString(8, cliente.getFone3());
			pst.setString(9, cliente.getEmail());
			pst.setString(10, cliente.getEndereco());
			pst.setString(11, cliente.getBairro());
			pst.setString(12, cliente.getCidade());
			pst.setString(13, cliente.getUf());
			pst.setInt(14, pk);
			retorno = pst.executeUpdate();
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Erro de sentença SQL ao atualizar cliente.");
		}
		
		return retorno > 0;
	}

	@Override
	public ArrayList<Cliente> listar() {
		ArrayList<Cliente> listaClientes = new ArrayList<Cliente>();
		Cliente cliente;
		Integer idCliente;
		Boolean pessoa;
		String nome, assinatura, cpf_cnpj, rg, email, endereco, bairro, cidade, uf, fone1, fone2, fone3;
		sql = "SELECT * FROM cliente";
		
		try {
			pst = conexao.prepareStatement(sql);
			ResultSet rs = pst.executeQuery();
			
			while (rs.next()) {
				
				idCliente = rs.getInt("id_cliente");
				pessoa = rs.getBoolean("pessoa");
				nome = rs.getString("nome");
				assinatura = rs.getString("assinatura");
				cpf_cnpj = rs.getString("cpf_cnpj");
				rg = rs.getString("rg");
				fone1 = rs.getString("fone1");
				fone2 = rs.getString("fone2");
				fone3 = rs.getString("fone3");
				email = rs.getString("email");
				endereco = rs.getString("endereco");
				bairro = rs.getString("bairro");
				cidade = rs.getString("cidade");
				uf = rs.getString("uf");
				
				cliente = new Cliente(pessoa, nome, cpf_cnpj, fone1);
				cliente.setIdCliente(idCliente);
				cliente.setAssinatura(assinatura);
				cliente.setRg(rg);
				cliente.setFone2(fone2);
				cliente.setFone3(fone3);
				cliente.setEmail(email);
				cliente.setEndereco(endereco);
				cliente.setBairro(bairro);
				cliente.setCidade(cidade);
				cliente.setUf(uf);
				listaClientes.add(cliente);
			}
			
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"Erro de sentença SQL ao listar clientes.");
		}
			
		return !listaClientes.isEmpty() ? listaClientes : null;	
	}

	@Override
	public Cliente buscar(int pk) {
		Cliente cliente = null;
		Boolean pessoa;
		String nome, assinatura, cpf_cnpj, rg, email, endereco, bairro, cidade, uf, fone1, fone2, fone3;
		sql = "SELECT * FROM cliente WHERE id_cliente=?";
		
		try {
			pst = conexao.prepareStatement(sql);
			pst.setInt(1, pk);
			ResultSet rs = pst.executeQuery();

			if (rs.next()) {
	
				pessoa = rs.getBoolean("pessoa");
				nome = rs.getString("nome");
				assinatura = rs.getString("assinatura");
				cpf_cnpj = rs.getString("cpf_cnpj");
				rg = rs.getString("rg");
				fone1 = rs.getString("fone1");
				fone2 = rs.getString("fone2");
				fone3 = rs.getString("fone3");
				email = rs.getString("email");
				endereco = rs.getString("endereco");
				bairro = rs.getString("bairro");
				cidade = rs.getString("cidade");
				uf = rs.getString("uf");
				
				cliente = new Cliente(pessoa, nome, cpf_cnpj, fone1);
				cliente.setIdCliente(pk);
				cliente.setAssinatura(assinatura);
				cliente.setRg(rg);
				cliente.setFone2(fone2);
				cliente.setFone3(fone3);
				cliente.setEmail(email);
				cliente.setEndereco(endereco);
				cliente.setBairro(bairro);
				cliente.setCidade(cidade);
				cliente.setUf(uf);
			}
			
			pst.close();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Erro na sentença SQL ao buscar cliente.");
		}
		
		return cliente;
	}
	

}
