package versao3.persistencia.impl.xml;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import versao3.dominio.Cliente;
import versao3.dominio.Pedido;
import versao3.persistencia.DAO;
import versao3.persistencia.PedidoDAO;
import versao3.persistencia.PersistanceException;

/**
 * Implementacao do objeto de acesso a dados de pedidos para base XML.
 *
 * @see versao3.persistencia.PedidoDAO
 */
public final class XMLPedidoDAOImpl
    implements PedidoDAO {
  private static long currentId = 0;

  private static XMLPedidoDAOImpl instance;

  static {
    instance = new XMLPedidoDAOImpl();
  }

  protected static XMLPedidoDAOImpl getInstance() {
    return instance;
  }

  private XMLPedidoDAOImpl(){}

  public List buscarPorCliente(Cliente cliente) throws PersistanceException {
    List result = new ArrayList();
    try {
      List fileNames = XMLUtil.findByClassName(Pedido.class.getName());
      for (Iterator iter = fileNames.iterator(); iter.hasNext(); ) {
        String file = (String) iter.next();
        Pedido pedido = (Pedido) XMLUtil.load(file);
        if(pedido.getCliente().getClienteId() == cliente.getClienteId()){
          result.add(pedido);
        }
      }
    }
    catch (FileNotFoundException ex) {
      throw new PersistanceException(ex);
    }
    return result;
  }

  public void save(Pedido pedido) throws PersistanceException {
    try {
      if(pedido.getPedidoId() == UNSAVED){
          pedido.setPedidoId(XMLPedidoDAOImpl.currentId++);
      }
      XMLUtil.save(pedido);
    }
    catch (FileNotFoundException ex) {
      throw new PersistanceException(ex);
    }
  }

  public void removerPorCliente(Cliente cliente) throws PersistanceException {
      List fileNames = XMLUtil.findByClassName(Pedido.class.getName());
      for (Iterator iter = fileNames.iterator(); iter.hasNext(); ) {
        String file = (String) iter.next();
        Pedido pedido = null;
        try {
          pedido = (Pedido) XMLUtil.load(file);
        }
        catch (FileNotFoundException ex) {
          throw new PersistanceException(ex);
        }
        if(pedido.getCliente().getClienteId() == cliente.getClienteId()){
          pedido.setPedidoId(UNSAVED);
          XMLUtil.remove(pedido);
        }
  }
  }
}
