package es.dalocar.facturamas.swt.handlers;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;

import es.dalocar.appskeleton.handlers.AbstractHandler;
import es.dalocar.appskeleton.swt.SWTUtils;
import es.dalocar.facturamas.swt.edit.ClienteEditComposite;
import es.dalocar.facturamas.swt.list.ClienteListComposite;
import es.dalocar.software.ApplicationManager;
import es.dalocar.software.ClienteSearch;
import es.dalocar.software.Messages;
import es.dalocar.software.beans.Cliente;
import es.dalocar.software.delegates.ClienteDelegate;

/**
 * Handler para la lista Cliente
 * 
 * @author aytoValencia
 */
public class ClienteListHandler extends AbstractHandler {

	private static Logger log = Logger.getLogger(ClienteListHandler.class.getName());
	private static boolean DEBUG = log.isDebugEnabled();
	
	
	private ClienteListComposite listaComposite;
	
	private ApplicationManager manager;
	private ClienteDelegate delegate;
	private ClienteSearch searchBean;

	private List lista;
	private Boolean esSeleccion;

	/**
	 * Constructor por defecto
	 */
	public ClienteListHandler() {
		// $hide>>$
		manager = ApplicationManager.getManager();
		delegate = (ClienteDelegate) manager.getClienteDelegate();
		lista = new ArrayList();
		esSeleccion = Boolean.FALSE;
		searchBean = new ClienteSearch();
		// $hide<<$
	}

	/**
	 * @see es.dalocar.appskeleton.handlers.Handler#run(org.eclipse.swt.widgets.Widget)
	 */
	public void run(Widget parent, Object data) {
		esSeleccion = (Boolean) data;
		this.run(parent);
	}

	/**
	 * @see es.dalocar.appskeleton.handlers.Handler#run(org.eclipse.swt.widgets.Widget)
	 */
	public void run(Widget parent) {

		Shell shell = new Shell(parent.getDisplay().getActiveShell(),
				SWT.APPLICATION_MODAL | SWT.SHELL_TRIM);

		shell.setText("Mantenimiento de Cliente"); //$NON-NLS-1$
		listaComposite = new ClienteListComposite(shell, SWT.NONE);

		customize();
		addListeners();
		// $hide>>$
		search();
		refresh();
		// $hide<<$
		SWTUtils.openCentered(listaComposite, shell);
	}

/**
 * Metodo que aplica los cadenas de texto correctas para la lista
 */
private void customize() {

Table tabla = listaComposite.getBrowseComposite().getCenter()
		.getTabla();

listaComposite.getBrowseComposite().getCenter().getGrupoTabla()
		.setText("Lista de Clientes");
tabla.getColumn(0).setText("Identificador");
tabla.getColumn(0).setWidth(25);
tabla.getColumn(1).setText("Cif");
tabla.getColumn(1).setWidth(65);

TableColumn column;
column = new TableColumn(listaComposite.getBrowseComposite().getCenter().getTabla(), 0, 2);
column.setText("Nombre");
tabla.getColumn(2).setWidth(500);
if (esSeleccion.booleanValue()) {
	listaComposite.getBrowseComposite().getCenter().getAmb1()
			.setVisible(false);
}
}

	/**
	 * Listeners
	 * 
	 */
	private void addListeners() {

		// Añadir
		listaComposite.getBrowseComposite().getCenter().getAmb1()
				.getButtonAñadir().addSelectionListener(new SelectionAdapter() {
					/**
					 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
					 */
					public void widgetSelected(SelectionEvent evt) {
						if (DEBUG) {
							log.debug("buttonAñadir.widgetSelected, event="
									+ evt);
						}

						// Obtener un Cliente nuevo
						Cliente bean = new Cliente();
						manager.getContext().setAttribute(
								Cliente.class.getName(), bean);

						// Abrir formulario en altas
						Shell shell = new Shell(listaComposite.getShell(),
								SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
						Composite comp = new ClienteEditComposite(shell,
								SWT.NONE, true);
						SWTUtils.openCentered(comp, shell);

						// $hide>>$
						search();
						refresh();
						// $hide<<$
					}
				});

		// Modificar
		listaComposite.getBrowseComposite().getCenter().getAmb1()
				.getButtonModif().addSelectionListener(new SelectionAdapter() {

					/**
					 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
					 */
					public void widgetSelected(SelectionEvent evt) {
						if (DEBUG) {
							log.debug("ButtonModif.widgetSelected, event="
									+ evt);
						}
						selectRow();
					}
				});

		// DobleClick
		listaComposite.getBrowseComposite().getCenter().getTabla()
				.addMouseListener(new MouseAdapter() {
					public void mouseDoubleClick(MouseEvent evt) {
						if (DEBUG) {
							log.debug("tabla.mouseDoubleClick, event=" + evt);
						}
						selectRow();
					}
				});

		// Borrar
		listaComposite.getBrowseComposite().getCenter().getAmb1()
				.getButtonBorrar().addSelectionListener(new SelectionAdapter() {

					/**
					 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
					 */
					public void widgetSelected(SelectionEvent evt) {
						if (DEBUG) {
							log.debug("buttonBorrar.widgetSelected, event="
									+ evt);
						}

						// Comprobar que el usuario ha seleccionado un registro
						Table tabla = listaComposite.getBrowseComposite()
								.getCenter().getTabla();
						if (tabla.getSelection().length == 0) {
							MessageBox msgBox = new MessageBox(listaComposite
									.getShell(), SWT.ICON_WARNING);
							msgBox.setMessage(Messages
									.getString("General.select"));
							msgBox.open();
						} else {
							MessageBox msgBox = new MessageBox(listaComposite
									.getShell(), SWT.ICON_QUESTION | SWT.YES
									| SWT.NO);
							msgBox.setMessage(Messages
									.getString("General.delete"));
							if (msgBox.open() == SWT.YES) {
								if (DEBUG) {
									log.debug("Elemento seleccionado "
											+ tabla.getSelectionIndex());
									log.debug("ZnacionDelegate: " + delegate);
									log.debug("Tabla: " + tabla);
									log.debug("Datos de tabla: "
											+ tabla.getData());
								}
								List lista = (List) tabla.getData();
								if (DEBUG) {
									log.debug("La lista está vacía: "
											+ lista.isEmpty());
								}
								int[] seleccion = tabla.getSelectionIndices();

								for (int i = 0; i < tabla.getSelectionCount(); i++) {
									Cliente n = (Cliente) lista.get(tabla
											.getSelectionIndex());
									delegate.delete(n);
									tabla.remove(seleccion[i]);
									lista.remove(seleccion[i]);
								}
								// $hide>>$
								refresh();
								// $hide<<$
							}
						}
					}
				});

		// Salir
		listaComposite.getBrowseComposite().getBottomx().getBtnSalir()
				.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(SelectionEvent evt) {
						if (DEBUG) {
							log.debug("btnSalir.widgetSelected, event=" + evt); //$NON-NLS-1$
						}
						Display.getDefault().getActiveShell().dispose();
					}
				});

		// Buscar
		listaComposite.getBotonBusqueda().addSelectionListener(
				new SelectionAdapter() {
					public void widgetSelected(SelectionEvent evt) {
						if (DEBUG) {
							log
									.debug("botonBusqueda.widgetSelected, event=" + evt); //$NON-NLS-1$
						}
						// $hide>>$
						search();
						refresh();
						// $hide<<$
					}
				});
	}

	/**
	 * Ejecuta la búsqueda del listado. Realiza la llamada al Delegate
	 * 
	 */
	private void search() {

		prepareSearch();
		lista = delegate.searchCliente(searchBean);
	}

	/**
	 * Prepara el objeto de criterios de búsqueda a partir de los datos
	 * introducidos en el Composite de lista
	 * 
	 */
	private void prepareSearch() {

		if (listaComposite.getTxtIdentificador().getText().equals(""))
			searchBean.setIdentificador(new Integer(0));
		else
			searchBean.setIdentificador(Integer.valueOf(listaComposite
					.getTxtIdentificador().getText()));

		searchBean.setCif(listaComposite.getTxtCif().getText());
		searchBean.setNombre(listaComposite.getTxtNombre().getText());
	}

	/**
	 * Guarda en el contexto el registro de la fila selecionada
	 * 
	 */
	private void selectRow() {
		// Comprobar que el usuario ha seleccionado un registro
		Table tabla = listaComposite.getBrowseComposite().getCenter()
				.getTabla();
		if (tabla.getSelection().length == 0) {
			MessageBox m = new MessageBox(listaComposite.getShell(),
					SWT.ICON_WARNING);
			m.setMessage("Seleccione un registro de la tabla");
			m.open();
			return;
		}

		// Obtener el registro
		int index = tabla.getSelectionIndex();
		Cliente bean = (Cliente) lista.get(index);
		manager.getContext().setAttribute(Cliente.class.getName(), bean);

		if (!esSeleccion.booleanValue()) {
			// Abrir formulario en edición
			Shell shell = new Shell(listaComposite.getShell(),
					SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
			Composite comp = new ClienteEditComposite(shell, SWT.NONE, false);
			SWTUtils.openCentered(comp, shell);

			// Eliminar titulo del contexto
			manager.getContext().removeAttribute(Cliente.class.getName());

			// $hide>>$
			search();
			refresh();
			// $hide<<$
		} else
			Display.getDefault().getActiveShell().dispose();
	}

	/**
	 * Actualiza la tabla del formulario. Usa el resultado devuelto por el
	 * Delegate
	 * 
	 */
	private void refresh() {
		Table tabla = listaComposite.getBrowseComposite().getCenter()
				.getTabla();
		tabla.setRedraw(false);
		tabla.removeAll(); // Borrar todos los elementos existentes

		listaComposite.getBrowseComposite().getBottomx().getLblNumElementosx()
				.setText(String.valueOf(lista.size()));
		Collections.sort(lista);
		// Salvamos la lista ordenada en la propia tabla
		tabla.setData(lista);
		if (lista.size() == 0) {
			// mensaje a usuario
		} else {
			Iterator it = lista.iterator();
			while (it.hasNext()) {
				Cliente element = (Cliente) it.next();
				TableItem item = new TableItem(tabla, SWT.NONE);

				item.setText(0, element.getIdentificador().toString());
				item.setText(1, element.getCif());
				item.setText(2, element.getNombre());
				item.setText(3, element.getPoblacion());
				// item.setText(4, element.getCp());
				// item.setText(5, element.getDireccion());
				// item.setText(6, element.getProvincia());
				// item.setText(7, element.getTelefono());
				// item.setText(8, element.getFax());
				// item.setText(9, element.getActivo());
			}
		}

		tabla.setRedraw(true);
	}
}