package fr.umlv.dp.exam0;

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

/**
 * A user
 */
public class User {
  private final String firstName;
  private final String lastName;
  private final ArrayList<Message> messages = new ArrayList<>();

  /**
   * Creates a user with a first name and a last name.
   * @param firstName first name of the user.
   * @param lastName last name of the user.
   */
  public User(String firstName, String lastName) {
    this.firstName = Objects.requireNonNull(firstName);
    this.lastName = Objects.requireNonNull(lastName);
  }
  
  @Override
  public int hashCode() {
    return firstName.hashCode() ^ Integer.rotateLeft(lastName.hashCode(), 16);
  }
  
  @Override
  public boolean equals(Object o) {
    if (!(o instanceof User)) {
      return false;
    }
    User user = (User)o;
    return firstName.equals(user.firstName) &&
        lastName.equals(user.lastName);
  }
  
  /**
   * Returns the first name of the user.
   * @return the first name of the user.
   */
  public String getFirstName() {
    return firstName;
  }
  
  /**
   * Returns the last name of the user.
   * @return the last name of the user.
   */
  public String getLastName() {
    return lastName;
  }
  
  /**
   * A list of all messages posted by the user, the last message is at the end of the list.
   * @return a list of all messages.
   */
  public List<Message> messages() {
    return Collections.unmodifiableList(messages);
  }
  
  /**
   * Add a new message at the end of all messages.
   * @param message a message.
   */
  public void post(User sender, String message) {
    messages.add(new Message(sender, message));
  }
  
  @Override
  public String toString() {
    return firstName + ' ' + lastName;
  }
}
