import java.lang.*;

/**
 * PersonName.java
 *
 *
 * Created: Wed Jan 22 09:10:45 2003
 * <p>
 * A class representing a person's name.
 * Every PersonName has a first name, a middle name, and a last name.
 *
 * @author <a href="mailto:shapiro@cse.buffalo.edu">Stuart C. Shapiro</a>
 * @version
 */

public class PersonName implements Comparable {
    private String first; // The first (given) name of this PersonName.
    private String middle; // The middle name of this PersonName.
    private String last; // The last (family) name of this PersonName.

    /**
     * Creates a new <code>PersonName</code> instance
     * with a first, middle, and last name.
     *
     * @param f the first (given) name of this PersonName.
     * @param m the middle name of this PersonName.
     * @param l the last (family) name of this PersonName.
     */
    public PersonName (String f, String m, String l){
	first = f;
	middle = m;
	last = l;
    }

    /**
     * Creates a new <code>PersonName</code> instance
     * with a first and last name, but no middle name.
     *
     * @param f the first (given) name of this PersonName.
     * @param l the last (family) name of this PersonName.
     */
    public PersonName(String f, String l) {
	this(f,"",l);
    }

    /**
     * Get the value of first.
     * @return value of first.
     */
    public String getFirst() {
	return first;
    }
    
    /**
     * Set the value of first.
     * @param v  Value to assign to first.
     */
    public void setFirst(String  v) {
	this.first = v;
    }
    
    /**
     * Get the value of middle.
     * @return value of middle.
     */
    public String getMiddle() {
	return middle;
    }
    
    /**
     * Set the value of middle.
     * @param v  Value to assign to middle.
     */
    public void setMiddle(String  v) {
	this.middle = v;
    }
    
    /**
     * Get the value of last.
     * @return value of last.
     */
    public String getLast() {
	return last;
    }
    
    /**
     * Set the value of last.
     * @param v  Value to assign to last.
     */
    public void setLast(String  v) {
	this.last = v;
    }
    
    /**
     * Returns a string representation of this PersonName.
     *
     * @return a <code>String</code> representation of this PersonName.
     */
    public String toString() {
	return first 
	    + (middle.equals("")?" ":" " + middle + " ")
	    + last;
    }

    /**
     * Compares this PersonName with another for content equality.
     *
     * @param n the other <code>PersonName</code>
     * @return true if this PersonName and the other are content equal,
     * false otherwise.
     */
    public boolean equals(PersonName n) {
	return last.equals(n.getLast())
	    && middle.equals(n.getMiddle())
	    && first.equals(n.getFirst());
    }

    /**
     * Compares this PersonName with another
     * to determine which should come first in an ordering.
     *
     * @param obj the <code>Object</code>
     * this PersonName is to be compared with
     * @return -1 if this PersonName should come before the other,
     * 0 if they compare the same,
     * 1 if this PersonName should come after the other.
     * @throws IllegalArgumentException if obj is not a PersonName.
     */
    public int compareTo(Object obj) {
	if (!(obj instanceof PersonName)) {
	    throw new IllegalArgumentException("Not a PersonName.");
	}
	PersonName n = (PersonName)obj;
	if (last.compareTo(n.getLast()) < 0) {return -1;}
	if (last.compareTo(n.getLast()) > 0) {return 1;}
	if (first.compareTo(n.getFirst()) < 0) {return -1;}
	if (first.compareTo(n.getFirst()) > 0) {return 1;}
	if (middle.compareTo(n.getMiddle()) < 0) {return -1;}
	if (middle.compareTo(n.getMiddle()) > 0) {return 1;}
	return 0;
    }	
	

}// PersonName
