/*
 * @topic T02715 Assignment a8 -- Airline Flight Schedule demo Verion 2
 * @brief Flight Schedule which can produce sorted ArrayList of departures
*/
package airlinesV2;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;

public class FlightSchedule {

    ArrayList< Airline > airlines;
    HashMap< String, Flight > flightMap;

    // constructors
    public FlightSchedule()
    {
        airlines = new ArrayList< Airline >();
        flightMap = new HashMap< String, Flight >();
    }

    // operations
    public void addAirline( String airlineCode /*aircraft*/ )
    {
        Airline air = new Airline( airlineCode);
        // Set aircraft info
        // air.setAircraft( aircraftModel );
        airlines.add( air );
    }
    
    public Flight addFlight( String airlineCode, int flightNumber )
    {
        Flight newFlight = null;
        if ( isValidAirlineCode( airlineCode ) ) {
            String externalflightNumber = airlineCode + flightNumber;
            // "DL1234" -> flight:
            newFlight = new Flight( airlineCode, flightNumber);
            flightMap.put(
                    externalflightNumber, //DL1234
                    newFlight // Flight object
                    );
        }
        return newFlight;
    }
    public boolean isValidAirlineCode( String airlineCode )
    {
        for ( Airline airline : airlines ) {
            //if ( 0 == airline.getCode().compareTo( airlineCode ) ) {
            //if ( 0 == airlineCode.compareTo( airline.getCode() ) ) {
            //if ( airlineCode.equals( airline.getCode() ) ) {
            if ( airlineCode.equalsIgnoreCase( airline.getCode() ) ) {
                return true;
            }
        }
        return false;
    }//isValidAirlineCode

    /*
     * Find Airline object or return null if the code is invlaid
     */
    public Airline getAirlineByCode( String airlineCode )
    {
        for ( Airline airline : airlines ) {
            //if ( 0 == airline.getCode().compareTo( airlineCode ) ) {
            //if ( 0 == airlineCode.compareTo( airline.getCode() ) ) {
            //if ( airlineCode.equals( airline.getCode() ) ) {
            if ( airlineCode.equalsIgnoreCase( airline.getCode() ) ) {
                return airline;
            }
        }
        return null;
    }//isValidAirlineCode

    /*
     * Returns true if flight number is already on file
     */
    public boolean isExistingFlightNumber( String airlineCode, int flightNumber )
    {
        String externalflightNumber = airlineCode + flightNumber;
        if ( flightMap.containsKey( externalflightNumber ) ) {
            // the flight is already on file:
            return true;
        }
        return false;
    }

    public void print()
    {
        //System.out.println( flightMap );
        for ( Map.Entry entry : flightMap.entrySet() ) {
            System.out.println( entry.getKey() );
        }
    }

    public void updateFlightStatus( String externalflightNumber, char status )
    {
        Flight flight = flightMap.get( externalflightNumber );
        if ( flight == null ) {
            System.out.println( "Flight " + externalflightNumber + " is not valid!" );
            return;
        }
        flight.updateStatus(status);
    }

    public ArrayList<Flight> getSortedDepartures(/*airport, day-of-week*/)
    {
        ArrayList<Flight> departures = new ArrayList<Flight>();
        for ( Map.Entry<String, Flight> entry : flightMap.entrySet() ) {
            Flight aFlight = entry.getValue();
            // TODO: check the airport code and departure day
            departures.add( aFlight );
        }
        // TODO: Flight.setSortOrder( Flight.SCHEDULE_SORT_ORDER_DEPARTURE_TIME );
        Collections.sort(departures);
        return departures;
    }

    public ArrayList< Airline > getAirlines()
    {
        return airlines;
    }
}//class FlightSchedule