#region Licence

/*
 * Copyright © 2002-2005 the original author or authors.
 *
 * 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.
 */

#endregion

#region Imports

using System;
using System.Collections;

#endregion

namespace SpringAir.Domain
{
    /// <summary>
    /// A flight reservation for a single <see cref="SpringAir.Domain.Passenger"/>.
    /// </summary>
    /// <author>Keith Donald</author>
    /// <author>Rick Evans (.NET)</author>
    /// <version>$Id: Reservation.cs,v 1.5 2005/10/09 06:18:45 aseovic Exp $</version>
    [Serializable]
    public class Reservation : Entity
    {
        /// <summary>
        /// Holds information about a flight reservation, such as the legs and the cost.
        /// </summary>
        private Itinerary itinerary;

        /// <summary>
        /// The <see cref="SpringAir.Domain.Passenger"/> for whom this reservation
        /// is made.
        /// </summary>
        private Passenger passenger;

        /// <summary>
        /// The mapping between the <see cref="SpringAir.Domain.Flight"/> of a journey
        /// to the seat (number, a <see cref="System.String"/>) that is reserved for
        /// that particular <see cref="SpringAir.Domain.Flight"/>.
        /// </summary>
        /// <remarks>
        /// <p>
        /// More clearly, which seat a passenger is going to plonk their bum into for
        /// each leg of a journey.
        /// </p>
        /// </remarks>
        //private IDictionary flightSeats;

        /// <summary>
        /// Creates a new instance of the
        /// <see cref="SpringAir.Domain.Reservation"/> class.
        /// </summary>
        public Reservation()
        {
        }

        public Reservation(Passenger passenger, Itinerary itinerary)//, IDictionary flightSeats)
        {
            this.passenger = passenger;
            this.itinerary = itinerary;
            //this.flightSeats = flightSeats;
        }

        public Itinerary Itinerary
        {
            get { return this.itinerary; }
            set { this.itinerary = value; }
        }

//        public IDictionary FlightSeats
//        {
//            get { return this.flightSeats; }
//            set { this.flightSeats = value; }
//        }

        public Passenger Passenger
        {
            get { return passenger; }
            set { passenger = value; }
        }

        public override bool Equals(object obj)
        {
            Reservation rhs = obj as Reservation;
            return rhs != null
                   && this.passenger.Id.Equals(rhs.passenger.Id)
                   && this.itinerary == rhs.itinerary;
        }

        public override int GetHashCode()
        {
            return this.passenger.Id.GetHashCode() + this.itinerary.GetHashCode();
        }
    }
}