package com.softgraf.vendas.model.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.List;

import com.softgraf.vendas.model.dao.abstrato.AbstractGenericDAO;
import com.softgraf.vendas.model.pojo.Cliente;
import com.softgraf.vendas.model.pojo.Pedido;

public class PedidoDAO extends AbstractGenericDAO<Pedido> {

	final private ClienteDAO clienteDAO;
	final private ItemDAO itemDAO;

	public PedidoDAO(Conexao conexao, ClienteDAO clienteDAO, ItemDAO itemDAO) {
		super(conexao);
		this.clienteDAO = clienteDAO;
		this.itemDAO = itemDAO;
	}
	
	@Override
	public void criarTabela() {
		String sql = "CREATE TABLE IF NOT EXISTS Pedido (" +
					  "id INT PRIMARY KEY AUTO_INCREMENT, " +
					  "data DATE NOT NULL, " +
					  "Cliente_id INT NOT NULL, " +
					  "FOREIGN KEY(Cliente_id) REFERENCES Cliente(id))";
		
		try {
			Statement cmd = dbConnection.createStatement();
			cmd.executeUpdate(sql);
			cmd.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public boolean inserir(Pedido pedido) {
		String sql = "INSERT INTO Pedido (data, Cliente_id) VALUES (?, ?)";
		
		try {
			PreparedStatement cmd = dbConnection.prepareStatement(sql);
			java.sql.Date sqlData = new java.sql.Date(pedido.getData().getTime());
			cmd.setDate(1, sqlData);
			cmd.setInt(2, pedido.getCliente().getId());
			int retorno = cmd.executeUpdate();
			cmd.close();			
			
			if (retorno > 0){
				// salva o id gerado pelo banco no próprio objeto
				pedido.setId(ultimoID("Cliente"));	
			}
			
			return retorno > 0;

		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public boolean apagar(Pedido pedido) {
		// melhor usar ON DELETE CASCADE durante a criação da tabela no
		// constraint
		String sqlItem = "DELETE FROM Item WHERE Pedido_id=?";
		String sqlPedido = "DELETE FROM Pedido WHERE id=?";

		try {
			PreparedStatement cmdItem = dbConnection.prepareStatement(sqlItem);
			cmdItem.setInt(1, pedido.getId());
			cmdItem.executeUpdate();
			cmdItem.close();

			PreparedStatement cmdPedido = dbConnection.prepareStatement(sqlPedido);
			cmdPedido.setInt(1, pedido.getId());
			int retorno = cmdPedido.executeUpdate();
			cmdPedido.close();
			return retorno > 0;

		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}

	}

	@Override
	public boolean atualizar(Pedido pedido) {
		String sql = "UPDATE Pedido SET data=?, Cliente_id=? WHERE id=?";
		
		try {
			PreparedStatement cmd = dbConnection.prepareStatement(sql);
			java.sql.Date sqlData = new java.sql.Date(pedido.getData().getTime());
			cmd.setDate(1, sqlData);
			cmd.setInt(2, pedido.getCliente().getId());
			cmd.setInt(3, pedido.getId());
			int retorno = cmd.executeUpdate();
			cmd.close();
			return retorno > 0;
				
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public Pedido buscar(Integer id) {
		String sql = "SELECT * FROM Pedido WHERE id=?";
		Pedido pedido = null;

		try {
			PreparedStatement cmd = dbConnection.prepareStatement(sql);
			cmd.setInt(1, id);
			ResultSet rs = cmd.executeQuery();
			if (rs.next()) {
				Date data = rs.getDate("data");
				Integer cliente_id = rs.getInt("Cliente_id");
				Cliente cliente = clienteDAO.buscar(cliente_id);
				pedido = new Pedido(id, data, cliente);
			}

			cmd.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return pedido;
	}
	
	
	@Override
	public Pedido buscar(Pedido pojo) {
		return null;
	}

	@Override
	public Pedido buscar(String campo) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Pedido> listar() {
		// TODO Auto-generated method stub
		return null;
	}

	public ClienteDAO getClienteDAO() {
		return clienteDAO;
	}

	public ItemDAO getItemDAO() {
		return itemDAO;
	}

	public Float getTotalPedido(Integer id) {
		Float total = 0f;
		String sql = "SELECT REPLACE(FORMAT(SUM(p.preco * i.quantidade), 2), ',', '') AS Total FROM Item i, Produto p WHERE p.id=i.Produto_id AND i.Pedido_id=?";
		
		try {
			PreparedStatement cmd = dbConnection.prepareStatement(sql);
			cmd.setInt(1, id);
			ResultSet rs = cmd.executeQuery();
			if (rs.next()) {
				total = rs.getFloat("Total");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return total;
	}
}
