/*
 * Copyright 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.sample.showcase.client.content.cell;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.sample.showcase.client.content.cell.ContactDatabase.Category;
import com.google.gwt.sample.showcase.client.content.cell.ContactDatabase.ContactInfo;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;

/**
 * A form used for editing contacts.
 */
public class ContactInfoForm extends Composite {

  private static Binder uiBinder = GWT.create(Binder.class);

  interface Binder extends UiBinder<Widget, ContactInfoForm> {
  }

  @UiField
  TextArea addressBox;
  @UiField
  DateBox birthdayBox;
  @UiField
  ListBox categoryBox;
  @UiField
  Button createButton;
  @UiField
  TextBox firstNameBox;
  @UiField
  TextBox lastNameBox;
  @UiField
  Button updateButton;

  private ContactInfo contactInfo;

  public ContactInfoForm() {
    initWidget(uiBinder.createAndBindUi(this));
    DateTimeFormat dateFormat = DateTimeFormat.getFormat(
        PredefinedFormat.DATE_LONG);
    birthdayBox.setFormat(new DateBox.DefaultFormat(dateFormat));

    // Add the categories to the category box.
    final Category[] categories = ContactDatabase.get().queryCategories();
    for (Category category : categories) {
      categoryBox.addItem(category.getDisplayName());
    }

    // Initialize the contact to null.
    setContact(null);

    // Handle events.
    updateButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        if (contactInfo == null) {
          return;
        }

        // Update the contact.
        contactInfo.setFirstName(firstNameBox.getText());
        contactInfo.setLastName(lastNameBox.getText());
        contactInfo.setAddress(addressBox.getText());
        contactInfo.setBirthday(birthdayBox.getValue());
        int categoryIndex = categoryBox.getSelectedIndex();
        contactInfo.setCategory(categories[categoryIndex]);

        // Update the views.
        ContactDatabase.get().refreshDisplays();
      }
    });
    createButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        int categoryIndex = categoryBox.getSelectedIndex();
        Category category = categories[categoryIndex];
        contactInfo = new ContactInfo(category);
        contactInfo.setFirstName(firstNameBox.getText());
        contactInfo.setLastName(lastNameBox.getText());
        contactInfo.setAddress(addressBox.getText());
        contactInfo.setBirthday(birthdayBox.getValue());
        ContactDatabase.get().addContact(contactInfo);
        setContact(contactInfo);
      }
    });
  }

  public void setContact(ContactInfo contact) {
    this.contactInfo = contact;
    updateButton.setEnabled(contact != null);
    if (contact != null) {
      firstNameBox.setText(contact.getFirstName());
      lastNameBox.setText(contact.getLastName());
      addressBox.setText(contact.getAddress());
      birthdayBox.setValue(contact.getBirthday());
      Category category = contact.getCategory();
      Category[] categories = ContactDatabase.get().queryCategories();
      for (int i = 0; i < categories.length; i++) {
        if (category == categories[i]) {
          categoryBox.setSelectedIndex(i);
          break;
        }
      }
    }
  }
}