#include <iostream>
#include "Clases_cpp/Aeropuerto/PilaEnteros.h"
#include "Clases_h/Utilidades.h"

// Función para mostrar el menú
void mostrarMenu() {
    std::cout << "\nMenu de simulacion de pasajeros en el aeropuerto:\n";
    std::cout << "1. Crear pila de pasajeros\n";
    std::cout << "2. Mostrar pila de pasajeros\n";
    std::cout << "3. Borrar pila de pasajeros\n";
    std::cout << "4. Mostrar cola de espera\n";
    std::cout << "5. Mostrar estado de boxes\n";
    std::cout << "6. Simular N minutos\n";
    std::cout << "7. Simular hasta que todos sean atendidos\n";
    std::cout << "8. Salir\n";
    std::cout << "Seleccione una opcion: ";
}

int main() {
    Cola colaPasajeros;
    Pila pilaPasajeros;
    PilaEnteros aeropuerto;
    Box b1 = Box(1);
    Box b2 = Box(2);
    Box b3 = Box(3);

    int opcion = 0;
    int tiempo = -1;/*Para comenzar la simulación,
    desde el menú del terminal primero se simula N minutos (siendo N=1) para volver a empezar desde t=0 
    y después ya se puede realizar la simulación hasta el final-*/
    while (opcion != 8) {
        mostrarMenu();
        std::cin >> opcion;

        switch (opcion) {
            case 1: { // Crear pila de pasajeros

                Pasajero p1(1, 0, 20, 6);
                Pasajero p2(2, 0, 15, 1);
                Pasajero p3(3, 5, 39, 7);
                Pasajero p4(4, 7, 23, 5);
                Pasajero p5(1, 9, 16, 6);
                Pasajero p6(2, 11, 23, 4);
                Pasajero p7(3, 14, 31, 7);
                Pasajero p8(4, 18, 14, 2);
                Pasajero p9(1, 21, 20, 3);
                pilaPasajeros.apilar(p9);
                pilaPasajeros.apilar(p8);
                pilaPasajeros.apilar(p7);
                pilaPasajeros.apilar(p6);
                pilaPasajeros.apilar(p5);
                pilaPasajeros.apilar(p4);
                pilaPasajeros.apilar(p3);
                pilaPasajeros.apilar(p2);
                pilaPasajeros.apilar(p1);

                std::cout << "Pila de pasajeros creada con exito.\n";
                break;
            }
            case 2: // Mostrar pila de pasajeros
                pilaPasajeros.mostrarPila();
                break;
            case 3: // Borrar la pila de pasajeros
                while (!pilaPasajeros.esVacia()) pilaPasajeros.desapilar();
                std::cout << "Pila de pasajeros borrada.\n";
                break;
            case 4: // Mostrar cola de espera
                colaPasajeros.mostrarCola();
                break;
            case 5: // Mostrar estado de los boxes
                std::cout << "Estado de los boxes:\n";
                std:: cout << "Box 1: " << b1.isOcupado()  << std::endl;
                std::cout<< "Box 2: " << b2.isOcupado() << std::endl;
                std::cout<< "Box 3: " << b3.isOcupado() << std::endl;
                break;
            case 6: { // Simula el paso de N minutos
                int minutos;
                std::cout << "Ingrese el numero de minutos a simular: ";
                std::cin >> minutos;
                for (int i = 0; i < minutos; ++i) {
                    simular_min(colaPasajeros, pilaPasajeros, tiempo, aeropuerto, b1, b2, b3);
                }
                break;
            }
            case 7: { // Simula todo el paso del tiempo hasta que todos son atendidos
                simular_hasta_final(colaPasajeros, pilaPasajeros, aeropuerto, b1, b2, b3);
                double tiempoMedio = calcularMediaPila(aeropuerto);
                std::cout << "Simulacion completa. Tiempo medio por pasajero: " << tiempoMedio << " minutos.\n";
                break;
            }
            case 8: // Sale del menú
                std::cout << "Saliendo del programa...\n";
                break;
            default:
                std::cout << "Opcion no valida. Intente de nuevo.\n";
        }
    }

    return 0;
}
