/*
 * File:   main.cc
 * Author: Filip Niksic, fniksic@gmail.com
 *
 * Created on January 23, 2008, 10:50 PM
 */

#include <cstdlib>
#include <cstddef>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <ctime>

#include "commands.h"
#include "airports.h"

using namespace std;

int main(const int argc, const char * const argv[]) {
    int exitStatus(EXIT_SUCCESS);
    bool success(true);
    
    string line, command, temp;
    vector<string> cmdArgs;
    size_t count(0);
    
    Airports myAirports;
    ifstream file;
    
    srand(time(0));
    initCommands();
    
    cout << "* PMF-MO, Racunarski praktikum 4, 2007./2008." << endl;
    cout << "* Domaca zadaca 2" << endl;
    cout << "* Filip Niksic, fniksic@gmail.com" << endl;
    cout << "*********************************************" << endl;
    printSyntax(CMD_UNKNOWN);
    
    cout << "> ";
    while (getline(cin, line)) {
        istringstream stream(line);
        command.clear();
        cmdArgs.clear();
        
        stream >> command;
        while (stream >> temp)
            cmdArgs.push_back(temp);
        
        try {
            switch (getCommand(command)) {
                case CMD_LOAD_AIRPORTS :
                    if (cmdArgs.size() < 1) {
                        printSyntax(CMD_LOAD_AIRPORTS);
                        break;
                    }
                    file.open(cmdArgs[0].c_str());
                    if (!file) {
                        cout << "Greska pri otvaranju datoteke." << endl;
                        file.close();
                        file.clear();
                        break;
                    }
                    count = myAirports.loadAirports(file);
                    cout << "Ucitano " << count << " aerodroma." << endl;
                    file.close();
                    file.clear();
                    break;
                case CMD_SET_FLIGHTS :
                    if (cmdArgs.size() < 1 || (cmdArgs[0] == "file" && cmdArgs.size() < 2)) {
                        printSyntax(CMD_SET_FLIGHTS);
                        break;
                    }
                    if (cmdArgs[0] == "file") {
                        file.open(cmdArgs[1].c_str());
                        if (!file) {
                            cout << "Greska pri otvaranju datoteke." << endl;
                            file.close();
                            file.clear();
                            break;
                        }
                        count = myAirports.loadFlights(file);
                        cout << "Postavljeno " << count << " letova." << endl;
                        file.close();
                        file.clear();
                    }
                    else if (cmdArgs[0] == "random") {
                        count = myAirports.setRandomFlights();
                        cout << "Postavljeno " << count << " letova." << endl;
                    }
                    else if (cmdArgs[0] == "all") {
                        count = myAirports.setAllFlights();
                        cout << "Postavljeno " << count << " letova." << endl;
                    }
                    else if (cmdArgs[0] == "none") {
                        count = myAirports.resetFlights();
                        cout << "Obrisano " << count << " letova." << endl;
                    }
                    else
                        printSyntax(CMD_SET_FLIGHTS);
                    break;
                case CMD_ADD_FLIGHT :
                    if (cmdArgs.size() < 2) {
                        printSyntax(CMD_ADD_FLIGHT);
                        break;
                    }
                    myAirports.addFlight(cmdArgs[0], cmdArgs[1]);
                    break;
                case CMD_REMOVE_FLIGHT :
                    if (cmdArgs.size() < 2) {
                        printSyntax(CMD_REMOVE_FLIGHT);
                        break;
                    }
                    myAirports.delFlight(cmdArgs[0], cmdArgs[1]);
                    break;
                case CMD_GET_FLIGHT :
                    if (cmdArgs.size() < 2) {
                        printSyntax(CMD_GET_FLIGHT);
                        break;
                    }
                    myAirports.printFlights(cmdArgs[0], cmdArgs[1]);
                    break;
                case CMD_SHORT_CONNECTION :
                    if (cmdArgs.size() < 2) {
                        printSyntax(CMD_SHORT_CONNECTION);
                        break;
                    }
                    myAirports.printShortest(cmdArgs[0], cmdArgs[1]);
                    break;
                case CMD_SHORT_ROUNDTRIP :
                    if (cmdArgs.size() < 1) {
                        printSyntax(CMD_SHORT_ROUNDTRIP);
                        break;
                    }
                    myAirports.printRoundtrip(cmdArgs);
                    break;
                case CMD_EXIT :
                    goto onExit;
                    break;
                default:
                    printSyntax(CMD_UNKNOWN);
            }
        }
        catch (runtime_error &e) {
            cout << e.what() << endl;
        }
        catch (logic_error &e) {
            cout << e.what() << endl;
        }
        cout << "> ";
    }
    
onExit:
    cout << endl;
    exitStatus = (success ? EXIT_SUCCESS : EXIT_FAILURE);
    return exitStatus;
}

