package org.jboss.errai.demo.jpa.client.local;

import java.util.List;

import org.jboss.errai.demo.jpa.client.shared.Album;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.shared.DateTimeFormat;
import com.google.gwt.i18n.shared.DateTimeFormat.PredefinedFormat;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;

/**
 * A tabular display of a list of albums, supporting delete and edit callbacks
 * for each row.
 *
 * @author Jonathan Fuerth <jfuerth@gmail.com>
 */
public class AlbumTable extends FlexTable {

  private RowOperationHandler<Album> deleteHandler;
  private RowOperationHandler<Album> editHandler;

  public AlbumTable() {
    addStyleName("albumTable");

    ColumnFormatter cf = getColumnFormatter();
    cf.setStyleName(0, "albumName");
    cf.setStyleName(1, "artistName");
    cf.setStyleName(2, "format");
    cf.setStyleName(3, "releaseDate");
    cf.setStyleName(4, "deleteButton");
  }

  public void addAll(List<Album> entries) {
    for (Album a : entries) {
      add(a);
    }
  }

  public void add(final Album a) {

    Button editButton = new Button("Edit...");
    editButton.addClickHandler(new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        if (editHandler != null) {
          editHandler.handle(a);
        }
      }
    });

    Button deleteButton = new Button("Delete");
    deleteButton.addClickHandler(new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        if (deleteHandler != null) {
          deleteHandler.handle(a);
        }
      }
    });

    int row = getRowCount();
    insertRow(row);
    insertCells(row, 0, 5);
    setText(row, 0, a.getName());
    setText(row, 1, a.getArtist() == null ? "" : a.getArtist().getName());
    setText(row, 2, a.getFormat() == null ? "" : a.getFormat().name());
    setText(row, 3, a.getReleaseDate() == null ? "" :
      DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT).format(a.getReleaseDate()));
    setWidget(row, 5, editButton);
    setWidget(row, 6, deleteButton);
  }

  public void setDeleteHandler(RowOperationHandler<Album> handler) {
    deleteHandler = handler;
  }

  public void setEditHandler(RowOperationHandler<Album> handler) {
    editHandler = handler;
  }
}
