package agilpizza.modelo;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import agilpizza.Constantes;

public class Pedido {

	private static int contador = 0;

	private int idPedido;

	private String estadoPedido;

	private Date data;

	private List<PedidoItemPizza> pizzas;

	private Map<Bebida, Integer> bebidas;

	private Cliente cliente;

	public Pedido() {

		idPedido = contador++;
		estadoPedido = Constantes.ESTADO_NA_SESSAO;
		pizzas = new ArrayList<PedidoItemPizza>();
		bebidas = new HashMap<Bebida, Integer>();

		data = new Date();
	}

	public String getEstadoPedido() {
		return estadoPedido;
	}

	public void setEstadoPedido(String estadoPedido) {
		this.estadoPedido = estadoPedido;
		if (estadoPedido.equals(Constantes.ESTADO_PEDIDO_PEDIDO)) {
			for (PedidoItemPizza pedidoDePizza : pizzas) {
				pedidoDePizza.setEstadoDoItem(Constantes.ESTADO_PIZZA_PEDIDA);
			}
		}
	}

	public int getIdPedido() {
		return idPedido;
	}

	public String getHora() {

		Format formatter = new SimpleDateFormat("HH:mm");
		return formatter.format(this.data);
	}

	public String getEnderecoCliente() {
		if (getCliente() == null)
			return "";
		return getCliente().getEndereco().toString();
	}

	public String getNomeCliente() {
		if (getCliente() == null)
			return "";
		return getCliente().getNome();
	}

	public List<PedidoItemPizza> getPizzas() {
		return pizzas;
	}

	public PedidoItemPizza getPizza(int id) {
		PedidoItemPizza pizzaEncontrada = null;

		for (PedidoItemPizza pizza : pizzas) {
			if (pizza.getId() == id) {
				pizzaEncontrada = pizza;
			}
		}

		return pizzaEncontrada;
	}

	public void adicionaPizza(PedidoItemPizza pizza) {
		pizzas.add(pizza);
	}

	public Map<Bebida, Integer> getBebidas() {
		return bebidas;
	}

	public void alteraQuantidadeDeBebida(Bebida bebida, int quantidade) {

		if (quantidade < 0)
			throw new IllegalArgumentException();

		if (quantidade == 0) {
			bebidas.remove(bebida);
		} else {
			bebidas.put(bebida, quantidade);
		}
	}

	public void alteraQuantidadeDePizza(Pizza pizza, int quantidade) {
		if (quantidade < 0) {
			throw new IllegalArgumentException();
		}

		List<PedidoItemPizza> pizzasEstatico = copiaDasPizzas();
		for (PedidoItemPizza pedidoDeItem : pizzasEstatico) {
			if (pedidoDeItem.getPizza().equals(pizza)) {
				if (quantidade > 0)
					quantidade--;
				else if (quantidade == 0) {
					pizzas.remove(pedidoDeItem);
				}
			}
		}

		if (quantidade > 0) {
			for (int i = 0; i < quantidade; i++) {
				int id = pizzas.size();
				PedidoItemPizza pedidoDeItem = new PedidoItemPizza(id, pizza);
				pizzas.add(pedidoDeItem);
			}
		}
	}

	private List<PedidoItemPizza> copiaDasPizzas() {
		List<PedidoItemPizza> pizzasEstatico = new ArrayList<PedidoItemPizza>();
		for (PedidoItemPizza pedidoDeItem : pizzas) {
			pizzasEstatico.add(pedidoDeItem);
		}
		return pizzasEstatico;
	}

	public Map<Pizza, Integer> getPizzasQuantidade() {

		Map<Pizza, Integer> quantidadeDasPizzas = new HashMap<Pizza, Integer>();

		for (PedidoItemPizza pedidoDeItem : pizzas) {
			Pizza pizza = pedidoDeItem.getPizza();
			Integer quantidade = quantidadeDasPizzas.get(pizza);
			if (quantidade == null) {
				quantidade = 0;
			}
			quantidadeDasPizzas.put(pizza, quantidade + 1);
		}

		return quantidadeDasPizzas;
	}

	public double getPreco() {
		double resultado = precoTotalDasPizzas();
		resultado += precoTotalDasBebidas();

		return resultado;
	}

	public double precoTotalDasBebidas() {
		double resultado = 0.0;
		for (Bebida bebida : bebidas.keySet()) {
			Integer quantidade = bebidas.get(bebida);
			resultado += quantidade * bebida.getPreco();
		}
		return resultado;
	}

	public double precoTotalDasPizzas() {
		double resultado = 0.0;
		for (PedidoItemPizza pedidoDePizza : pizzas) {
			resultado += pedidoDePizza.getPreco();
		}
		return resultado;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
}
