/**
 *  This file is part of miniCDx benchmark of oSCJ.
 *
 *   miniCDx is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU Lesser General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   miniCDx is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with miniCDx.  If not, see <http://www.gnu.org/licenses/>.
 *
 *
 *   Copyright 2009, 2010 
 *   @authors  Daniel Tang, Ales Plsek
 *
 *   See: http://sss.cs.purdue.edu/projects/oscj/
 */
package cdx;

import collision.Vector3d;

/**
 * Represents a definite collision that has occured.
 * 
 * @author Filip Pizlo
 */
/*@javax.safetycritical.annotate.Scope("cdx.CollisionDetectorHandler")*/
class Collision {
    /** The aircraft that were involved. */
    // private ArrayList aircraft;

    private Aircraft _one, _two;

    /** The location where the collision happened. */
    private Vector3d location;

    /** Construct a Collision with a given set of aircraft and a location. */
    /*	public Collision(List aircraft, Vector3d location) {
    		this.aircraft = new ArrayList(aircraft);
    		Collections.sort(this.aircraft);
    		this.location = location;
    	} */

    /** Construct a Coollision with two aircraft an a location. */
    public Collision(Aircraft one, Aircraft two, Vector3d location) {
        /*	aircraft = new ArrayList();
        	aircraft.add(one);
        	aircraft.add(two); 
        	Collections.sort(aircraft); */
        this.location = location;
        _one = one;
        _two = two;
    }

    public boolean hasAircraft(Aircraft a) {
        if (_one.equals(a)) return true;
        if (_two.equals(a)) return true;
        return false;
    }

    public Aircraft first() {
        return _one;
    }

    public Aircraft second() {
        return _two;
    }

    /*public int aircrafts() {
      return aircraft.size();
    } */

    /** Returns the list of aircraft involved. You are not to modify this list. */
    // public ArrayList getAircraftInvolved() { return aircraft; }

    /** Returns the location of the collision. You are not to modify this location. */
    public Vector3d getLocation() {
        return location;
    }

    /** Returns a hash code for this object. It is based on the hash codes of the aircraft. */

    public int hashCode() {
        int ret = 0;
        /*for (Iterator iter = aircraft.iterator(); iter.hasNext();) 
        	ret += ((Aircraft) iter.next()).hashCode(); */
        ret += _one.hashCode();
        ret += _two.hashCode();
        return ret;
    }

    /** Determines collision equality. Two collisions are equal if they have the same aircraft. */

    public boolean equals(Object _other) {
        if (_other == this) return true;
        if (!(_other instanceof Collision)) return false;
        Collision other = (Collision) _other;
        /*ArrayList a = getAircraftInvolved();
        ArrayList b = other.getAircraftInvolved();
        if (a.size() != b.size()) return false;
        Iterator ai = a.iterator();
        Iterator bi = b.iterator();
        while (ai.hasNext()) 
        	if (!ai.next().equals(bi.next())) return false; */
        // if ((other.hasAircraft(_one)) && (other.hasAircraft(_two))) return true;
        if (_one != other._one) return false;
        if (_two != other._two) return false;
        return true;
    }

    /** Returns a helpful description of this object. */

    public String toString() {
        StringBuffer buf = new StringBuffer("Collision between ");
        boolean first = true;
        /*for (Iterator iter = getAircraftInvolved().iterator(); iter.hasNext();) {
        	if (first) first = false;
        	else buf.append(", ");	    
        	buf.append(iter.next().toString());
        }  */
        buf.append(_one.toString() + ", " + _two.toString());
        buf.append(" at ");
        buf.append(location.toString());
        return buf.toString();
    }
}
