/*
 * 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.i18n.client.Constants;
import com.google.gwt.user.client.Random;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * The data source for contact information used in the sample.
 */
public class ContactDatabase {

  /**
   * A contact category.
   */
  public static class Category {

    private final String displayName;

    private Category(String displayName) {
      this.displayName = displayName;
    }

    public String getDisplayName() {
      return displayName;
    }
  }

  /**
   * Information about a contact.
   */
  public static class ContactInfo implements Comparable<ContactInfo> {

    /**
     * The key provider that provides the unique ID of a contact.
     */
    public static final ProvidesKey<ContactInfo> KEY_PROVIDER = new ProvidesKey<ContactInfo>() {
      public Object getKey(ContactInfo item) {
        return item == null ? null : item.getId();
      }
    };

    private static int nextId = 0;

    private String address;
    private Date birthday;
    private Category category;
    private String firstName;
    private final int id;
    private String lastName;

    public ContactInfo(Category category) {
      this.id = nextId;
      nextId++;
      setCategory(category);
    }

    public int compareTo(ContactInfo o) {
      return (o == null || o.firstName == null) ? -1
          : -o.firstName.compareTo(firstName);
    }

    @Override
    public boolean equals(Object o) {
      if (o instanceof ContactInfo) {
        return id == ((ContactInfo) o).id;
      }
      return false;
    }

    /**
     * @return the contact's address
     */
    public String getAddress() {
      return address;
    }

    /**
     * @return the contact's age
     */
    @SuppressWarnings("deprecation")
    public int getAge() {
      Date today = new Date();
      int age = today.getYear() - birthday.getYear();
      if (today.getMonth() > birthday.getMonth()
          || (today.getMonth() == birthday.getMonth() && today.getDate() > birthday.getDate())) {
        age--;
      }
      return age;
    }

    /**
     * @return the contact's birthday
     */
    public Date getBirthday() {
      return birthday;
    }

    /**
     * @return the category of the conteact
     */
    public Category getCategory() {
      return category;
    }

    /**
     * @return the contact's firstName
     */
    public String getFirstName() {
      return firstName;
    }

    /**
     * @return the contact's full name
     */
    public final String getFullName() {
      return firstName + " " + lastName;
    }

    /**
     * @return the unique ID of the contact
     */
    public int getId() {
      return this.id;
    }

    /**
     * @return the contact's lastName
     */
    public String getLastName() {
      return lastName;
    }

    @Override
    public int hashCode() {
      return id;
    }

    /**
     * Set the contact's address.
     *
     * @param address the address
     */
    public void setAddress(String address) {
      this.address = address;
    }

    /**
     * Set the contact's birthday.
     *
     * @param birthday the birthday
     */
    public void setBirthday(Date birthday) {
      this.birthday = birthday;
    }

    /**
     * Set the contact's category.
     *
     * @param category the category to set
     */
    public void setCategory(Category category) {
      assert category != null : "category cannot be null";
      this.category = category;
    }

    /**
     * Set the contact's first name.
     *
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
      this.firstName = firstName;
    }

    /**
     * Set the contact's last name.
     *
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
      this.lastName = lastName;
    }
  }

  /**
   * The constants used in this Content Widget.
   */
  static interface DatabaseConstants extends Constants {
    String[] contactDatabaseCategories();
  }

  private static final String[] FEMALE_FIRST_NAMES = {
      "Mary", "Patricia", "Linda", "Barbara", "Elizabeth", "Jennifer", "Maria",
      "Susan", "Margaret", "Dorothy", "Lisa", "Nancy", "Karen", "Betty",
      "Helen", "Sandra", "Donna", "Carol", "Ruth", "Sharon", "Michelle",
      "Laura", "Sarah", "Kimberly", "Deborah", "Jessica", "Shirley", "Cynthia",
      "Angela", "Melissa", "Brenda", "Amy", "Anna", "Rebecca", "Virginia",
      "Kathleen", "Pamela", "Martha", "Debra", "Amanda", "Stephanie", "Carolyn",
      "Christine", "Marie", "Janet", "Catherine", "Frances", "Ann", "Joyce",
      "Diane", "Alice", "Julie", "Heather", "Teresa", "Doris", "Gloria",
      "Evelyn", "Jean", "Cheryl", "Mildred", "Katherine", "Joan", "Ashley",
      "Judith", "Rose", "Janice", "Kelly", "Nicole", "Judy", "Christina",
      "Kathy", "Theresa", "Beverly", "Denise", "Tammy", "Irene", "Jane", "Lori",
      "Rachel", "Marilyn", "Andrea", "Kathryn", "Louise", "Sara", "Anne",
      "Jacqueline", "Wanda", "Bonnie", "Julia", "Ruby", "Lois", "Tina",
      "Phyllis", "Norma", "Paula", "Diana", "Annie", "Lillian", "Emily",
      "Robin", "Peggy", "Crystal", "Gladys", "Rita", "Dawn", "Connie",
      "Florence", "Tracy", "Edna", "Tiffany", "Carmen", "Rosa", "Cindy",
      "Grace", "Wendy", "Victoria", "Edith", "Kim", "Sherry", "Sylvia",
      "Josephine", "Thelma", "Shannon", "Sheila", "Ethel", "Ellen", "Elaine",
      "Marjorie", "Carrie", "Charlotte", "Monica", "Esther", "Pauline", "Emma",
      "Juanita", "Anita", "Rhonda", "Hazel", "Amber", "Eva", "Debbie", "April",
      "Leslie", "Clara", "Lucille", "Jamie", "Joanne", "Eleanor", "Valerie",
      "Danielle", "Megan", "Alicia", "Suzanne", "Michele", "Gail", "Bertha",
      "Darlene", "Veronica", "Jill", "Erin", "Geraldine", "Lauren", "Cathy",
      "Joann", "Lorraine", "Lynn", "Sally", "Regina", "Erica", "Beatrice",
      "Dolores", "Bernice", "Audrey", "Yvonne", "Annette", "June", "Samantha",
      "Marion", "Dana", "Stacy", "Ana", "Renee", "Ida", "Vivian", "Roberta",
      "Holly", "Brittany", "Melanie", "Loretta", "Yolanda", "Jeanette",
      "Laurie", "Katie", "Kristen", "Vanessa", "Alma", "Sue", "Elsie", "Beth",
      "Jeanne"};
  private static final String[] MALE_FIRST_NAMES = {
      "James", "John", "Robert", "Michael", "William", "David", "Richard",
      "Charles", "Joseph", "Thomas", "Christopher", "Daniel", "Paul", "Mark",
      "Donald", "George", "Kenneth", "Steven", "Edward", "Brian", "Ronald",
      "Anthony", "Kevin", "Jason", "Matthew", "Gary", "Timothy", "Jose",
      "Larry", "Jeffrey", "Frank", "Scott", "Eric", "Stephen", "Andrew",
      "Raymond", "Gregory", "Joshua", "Jerry", "Dennis", "Walter", "Patrick",
      "Peter", "Harold", "Douglas", "Henry", "Carl", "Arthur", "Ryan", "Roger",
      "Joe", "Juan", "Jack", "Albert", "Jonathan", "Justin", "Terry", "Gerald",
      "Keith", "Samuel", "Willie", "Ralph", "Lawrence", "Nicholas", "Roy",
      "Benjamin", "Bruce", "Brandon", "Adam", "Harry", "Fred", "Wayne", "Billy",
      "Steve", "Louis", "Jeremy", "Aaron", "Randy", "Howard", "Eugene",
      "Carlos", "Russell", "Bobby", "Victor", "Martin", "Ernest", "Phillip",
      "Todd", "Jesse", "Craig", "Alan", "Shawn", "Clarence", "Sean", "Philip",
      "Chris", "Johnny", "Earl", "Jimmy", "Antonio", "Danny", "Bryan", "Tony",
      "Luis", "Mike", "Stanley", "Leonard", "Nathan", "Dale", "Manuel",
      "Rodney", "Curtis", "Norman", "Allen", "Marvin", "Vincent", "Glenn",
      "Jeffery", "Travis", "Jeff", "Chad", "Jacob", "Lee", "Melvin", "Alfred",
      "Kyle", "Francis", "Bradley", "Jesus", "Herbert", "Frederick", "Ray",
      "Joel", "Edwin", "Don", "Eddie", "Ricky", "Troy", "Randall", "Barry",
      "Alexander", "Bernard", "Mario", "Leroy", "Francisco", "Marcus",
      "Micheal", "Theodore", "Clifford", "Miguel", "Oscar", "Jay", "Jim", "Tom",
      "Calvin", "Alex", "Jon", "Ronnie", "Bill", "Lloyd", "Tommy", "Leon",
      "Derek", "Warren", "Darrell", "Jerome", "Floyd", "Leo", "Alvin", "Tim",
      "Wesley", "Gordon", "Dean", "Greg", "Jorge", "Dustin", "Pedro", "Derrick",
      "Dan", "Lewis", "Zachary", "Corey", "Herman", "Maurice", "Vernon",
      "Roberto", "Clyde", "Glen", "Hector", "Shane", "Ricardo", "Sam", "Rick",
      "Lester", "Brent", "Ramon", "Charlie", "Tyler", "Gilbert", "Gene"};
  private static final String[] LAST_NAMES = {
      "Smith", "Johnson", "Williams", "Jones", "Brown", "Davis", "Miller",
      "Wilson", "Moore", "Taylor", "Anderson", "Thomas", "Jackson", "White",
      "Harris", "Martin", "Thompson", "Garcia", "Martinez", "Robinson", "Clark",
      "Rodriguez", "Lewis", "Lee", "Walker", "Hall", "Allen", "Young",
      "Hernandez", "King", "Wright", "Lopez", "Hill", "Scott", "Green", "Adams",
      "Baker", "Gonzalez", "Nelson", "Carter", "Mitchell", "Perez", "Roberts",
      "Turner", "Phillips", "Campbell", "Parker", "Evans", "Edwards", "Collins",
      "Stewart", "Sanchez", "Morris", "Rogers", "Reed", "Cook", "Morgan",
      "Bell", "Murphy", "Bailey", "Rivera", "Cooper", "Richardson", "Cox",
      "Howard", "Ward", "Torres", "Peterson", "Gray", "Ramirez", "James",
      "Watson", "Brooks", "Kelly", "Sanders", "Price", "Bennett", "Wood",
      "Barnes", "Ross", "Henderson", "Coleman", "Jenkins", "Perry", "Powell",
      "Long", "Patterson", "Hughes", "Flores", "Washington", "Butler",
      "Simmons", "Foster", "Gonzales", "Bryant", "Alexander", "Russell",
      "Griffin", "Diaz", "Hayes", "Myers", "Ford", "Hamilton", "Graham",
      "Sullivan", "Wallace", "Woods", "Cole", "West", "Jordan", "Owens",
      "Reynolds", "Fisher", "Ellis", "Harrison", "Gibson", "Mcdonald", "Cruz",
      "Marshall", "Ortiz", "Gomez", "Murray", "Freeman", "Wells", "Webb",
      "Simpson", "Stevens", "Tucker", "Porter", "Hunter", "Hicks", "Crawford",
      "Henry", "Boyd", "Mason", "Morales", "Kennedy", "Warren", "Dixon",
      "Ramos", "Reyes", "Burns", "Gordon", "Shaw", "Holmes", "Rice",
      "Robertson", "Hunt", "Black", "Daniels", "Palmer", "Mills", "Nichols",
      "Grant", "Knight", "Ferguson", "Rose", "Stone", "Hawkins", "Dunn",
      "Perkins", "Hudson", "Spencer", "Gardner", "Stephens", "Payne", "Pierce",
      "Berry", "Matthews", "Arnold", "Wagner", "Willis", "Ray", "Watkins",
      "Olson", "Carroll", "Duncan", "Snyder", "Hart", "Cunningham", "Bradley",
      "Lane", "Andrews", "Ruiz", "Harper", "Fox", "Riley", "Armstrong",
      "Carpenter", "Weaver", "Greene", "Lawrence", "Elliott", "Chavez", "Sims",
      "Austin", "Peters", "Kelley", "Franklin", "Lawson"};
  private static final String[] STREET_NAMES = {
      "Peachtree", "First", "Second", "Third", "Fourth", "Fifth", "Sixth",
      "Tenth", "Fourteenth", "Spring", "Techwood", "West Peachtree", "Juniper",
      "Cypress", "Fowler", "Piedmont", "Juniper", "Main", "Central", "Currier",
      "Courtland", "Williams", "Centennial", "Olympic", "Baker", "Highland",
      "Pryor", "Decatur", "Bell", "Edgewood", "Mitchell", "Forsyth", "Capital"};
  private static final String[] STREET_SUFFIX = {
      "St", "Rd", "Ln", "Blvd", "Way", "Pkwy", "Cir", "Ave"};

  /**
   * The singleton instance of the database.
   */
  private static ContactDatabase instance;

  /**
   * Get the singleton instance of the contact database.
   *
   * @return the singleton instance
   */
  public static ContactDatabase get() {
    if (instance == null) {
      instance = new ContactDatabase();
    }
    return instance;
  }

  /**
   * The provider that holds the list of contacts in the database.
   */
  private ListDataProvider<ContactInfo> dataProvider = new ListDataProvider<ContactInfo>();

  private final Category[] categories;

  /**
   * Construct a new contact database.
   */
  private ContactDatabase() {
    // Initialize the categories.
    DatabaseConstants constants = GWT.create(DatabaseConstants.class);
    String[] catNames = constants.contactDatabaseCategories();
    categories = new Category[catNames.length];
    for (int i = 0; i < catNames.length; i++) {
      categories[i] = new Category(catNames[i]);
    }

    // Generate initial data.
    generateContacts(250);
  }

  /**
   * Add a new contact.
   *
   * @param contact the contact to add.
   */
  public void addContact(ContactInfo contact) {
    List<ContactInfo> contacts = dataProvider.getList();
    // Remove the contact first so we don't add a duplicate.
    contacts.remove(contact);
    contacts.add(contact);
  }

  /**
   * Add a display to the database. The current range of interest of the display
   * will be populated with data.
   *
   * @param display a {@Link HasData}.
   */
  public void addDataDisplay(HasData<ContactInfo> display) {
    dataProvider.addDataDisplay(display);
  }

  /**
   * Generate the specified number of contacts and add them to the data
   * provider.
   *
   * @param count the number of contacts to generate.
   */
  public void generateContacts(int count) {
    List<ContactInfo> contacts = dataProvider.getList();
    for (int i = 0; i < count; i++) {
      contacts.add(createContactInfo());
    }
  }

  public ListDataProvider<ContactInfo> getDataProvider() {
    return dataProvider;
  }

  /**
   * Get the categories in the database.
   *
   * @return the categories in the database
   */
  public Category[] queryCategories() {
    return categories;
  }

  /**
   * Query all contacts for the specified category.
   *
   * @param category the category
   * @return the list of contacts in the category
   */
  public List<ContactInfo> queryContactsByCategory(Category category) {
    List<ContactInfo> matches = new ArrayList<ContactInfo>();
    for (ContactInfo contact : dataProvider.getList()) {
      if (contact.getCategory() == category) {
        matches.add(contact);
      }
    }
    return matches;
  }

  /**
   * Query all contacts for the specified category that begin with the specified
   * first name prefix.
   *
   * @param category the category
   * @param firstNamePrefix the prefix of the first name
   * @return the list of contacts in the category
   */
  public List<ContactInfo> queryContactsByCategoryAndFirstName(
      Category category, String firstNamePrefix) {
    List<ContactInfo> matches = new ArrayList<ContactInfo>();
    for (ContactInfo contact : dataProvider.getList()) {
      if (contact.getCategory() == category
          && contact.getFirstName().startsWith(firstNamePrefix)) {
        matches.add(contact);
      }
    }
    return matches;
  }

  /**
   * Refresh all displays.
   */
  public void refreshDisplays() {
    dataProvider.refresh();
  }

  /**
   * Create a new random {@link ContactInfo}.
   *
   * @return the new {@link ContactInfo}.
   */
  @SuppressWarnings("deprecation")
  private ContactInfo createContactInfo() {
    ContactInfo contact = new ContactInfo(nextValue(categories));
    contact.setLastName(nextValue(LAST_NAMES));
    if (Random.nextBoolean()) {
      // Male.
      contact.setFirstName(nextValue(MALE_FIRST_NAMES));
    } else {
      // Female.
      contact.setFirstName(nextValue(FEMALE_FIRST_NAMES));
    }

    // Create a birthday between 20-80 years ago.
    int year = (new Date()).getYear() - 21 - Random.nextInt(61);
    contact.setBirthday(new Date(year, Random.nextInt(12),
        1 + Random.nextInt(31)));

    // Create an address.
    int addrNum = 1 + Random.nextInt(999);
    String addrStreet = nextValue(STREET_NAMES);
    String addrSuffix = nextValue(STREET_SUFFIX);
    contact.setAddress(addrNum + " " + addrStreet + " " + addrSuffix);
    return contact;
  }

  /**
   * Get the next random value from an array.
   *
   * @param array the array
   * @return a random value in the array
   */
  private <T> T nextValue(T[] array) {
    return array[Random.nextInt(array.length)];
  }

}
