//==============================================================================//
// Programa de cotización del servicio de transporte de mercadería en C++       //             
// Autores:                                                                     //
//    -Julio Rodrigo Huamán Guerrero     (U202012908)                           //
//    -Quispe Pumayalli Angel Anthony    (U20231A692)                           //             
//    -Orizano Salvador Diego Elias      (U20191E833)                           //             
//    -Noriega Suárez, María Alejandra   (U202321787)                           //         
//==============================================================================//
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;


int CalcularCantidadVehiculos(int peso) {
    int cantidadVehiculos = 0;
    double pesoRestante=0.0;
    if (peso >= 0 && peso < 4) {
        cantidadVehiculos = 1;
    } else if (peso >= 4 && peso <= 5) {
        cantidadVehiculos = 1;
    } else if (peso >= 6 && peso <= 8) {
        cantidadVehiculos = 1;
    } else if (peso > 8) {
        cantidadVehiculos = peso / 8;
        pesoRestante = peso - (cantidadVehiculos * 8);
        if (peso % 8 != 0) {
            cantidadVehiculos++;
        }
    }
    return cantidadVehiculos;
}

int main() {
    // Declaración de variables
    double distancia, costoAdicional, costoFinalVehiculo, costoTotal = 0.0;
    double pesoRestante=0.0, costoAuxiliares;
    string tipoCarga, tipo_vehiculo;
    char desea_auxiliares, agregar_vehiculo;
    int  peso,auxiliares, cantidadVehiculos;

    // Costo del servicio por el vehículo pequeño
    const double costo_vehiculo_pequeno = 100.0;
    // Costo del servicio por el vehículo mediano
    const double costo_vehiculo_mediano = 150.0;
    // Costo del servicio por el vehículo pesado
    const double costo_vehiculo_pesado = 200.0;
    // Cada vehículo siempre tendrá un chofer y un auxiliar y costo del servicio por estos es:
    const double chofer_y_auxiliar = 150.0;

    // Iniciamos el bucle do-while
    do {
        // Iniciamos el costo final del vehículo actual en 0.
        costoFinalVehiculo = 0.0;
        costoAdicional = 0.0;  // Aseguramos que costoAdicional se inicialice en cada iteración

        // Datos de entrada
        cout << "Ingrese el peso de la carga en toneladas: ";
        cin >> peso;

        cout << "Ingrese el tipo de carga (MATPEL, IQBF o REFRIGERADO): ";
        cin >> tipoCarga;

        cout << "Ingrese la distancia del viaje en kilómetros: ";
        cin >> distancia;

        cout << "¿Desea que el servicio tenga auxiliares? (s/n): ";
        cin >> desea_auxiliares;

        if (desea_auxiliares == 's' || desea_auxiliares == 'S') {
            cout << "Ingrese la cantidad de auxiliares adicionales deseados: ";
            cin >> auxiliares;
            // Calcular costo adicional por auxiliares
            costoAuxiliares = auxiliares * 50.0;
        } else {
            auxiliares = 0;
            costoAuxiliares = 0.0;
        }

        // Validar el tipo de vehículo y cantidad de vehículos necesarios según el peso
        // Vehículo pequeño (3 toneladas máximo)
        if (peso < 4) {
            tipo_vehiculo = "Pequeno";
            cantidadVehiculos = CalcularCantidadVehiculos (peso);
            costoFinalVehiculo = costo_vehiculo_pequeno + (distancia * 1.20) + peso * 1.1;
            cout << "\nTipo de vehículo: " << tipo_vehiculo << endl;
            cout << "Cantidad de vehículos: " << cantidadVehiculos << endl;

        } else if (peso >= 4 && peso <= 5) { // Vehículo mediano (de 4 a 5 toneladas)
            tipo_vehiculo = "Mediano";
            cantidadVehiculos = CalcularCantidadVehiculos (peso);
            costoFinalVehiculo = costo_vehiculo_mediano + distancia * 1.50 + peso * 1.3;
            cout << "\nTipo de vehículo: " << tipo_vehiculo << endl;
            cout << "Cantidad de vehículos: " << cantidadVehiculos << endl;

        } else if (peso >= 6 && peso <= 8) { // Vehículo pesado (de 6 a 8 toneladas)
            tipo_vehiculo = "Pesado";
            cantidadVehiculos =CalcularCantidadVehiculos (peso) ;
            costoFinalVehiculo = costo_vehiculo_pesado + distancia * 1.70 + peso * 1.5;
            cout << "\nTipo de vehículo: " << tipo_vehiculo << endl;
            cout << "Cantidad de vehículos: " << cantidadVehiculos << endl;

        } else if (peso > 8) { // Si se necesita más de un vehículo
            tipo_vehiculo = "Pesado";
            cantidadVehiculos =CalcularCantidadVehiculos (peso); 
            costoFinalVehiculo = costo_vehiculo_pesado + (cantidadVehiculos * (distancia * 1.70)) + 
             (pesoRestante * 1.5) + peso * 1.5;
            cout << "\nTipo de vehículo: " << tipo_vehiculo << endl;
            cout << "Cantidad de vehículos: " << cantidadVehiculos << endl;
        }

        // Calcular costo adicional según el tipo de carga
        if (tipoCarga == "MATPEL") {
            // Costo adicional del 10% del costo final si la carga es MATPEL
            costoAdicional = 0.10 * costoFinalVehiculo;
        } else if (tipoCarga == "IQBF") {
            // Costo adicional del 15% del costo final si la carga es IQBF
            costoAdicional = 0.15 * costoFinalVehiculo;
        } else if (tipoCarga == "REFRIGERADO") {
            // Costo adicional del 20% del costo final si la carga es REFRIGERADO
            costoAdicional = 0.20 * costoFinalVehiculo;
        }

        // Calcular costo total del vehículo actual
        costoFinalVehiculo += costoAdicional + chofer_y_auxiliar + costoAuxiliares;
        // Sumar al costo total general
        costoTotal += costoFinalVehiculo;

        // Preguntar si se desea agregar otro vehículo
        cout << "\n¿Desea agregar otro tipo de vehículo? (s/n): ";
        cin >> agregar_vehiculo;

    } while (agregar_vehiculo == 's' || agregar_vehiculo == 'S');

    // Mostrar el costo total del servicio
    cout << "\n--------------------------------------------------" << endl;
    cout << "El costo total del servicio es: " << costoTotal << " soles" << endl;

    // Numero de compra (aleatorio)
    const int N = 1;   // Cantidad de terminos a generar
    const int d = 6;   // Numero de digitos de c/d termino
    const int TOT = 5000; // Capacidad maxima del vector 
    int lista[TOT];    // Vector (arreglo unidimensional)
    int i;        // Controla el indice (posicion) de un elem
    int vmax, vmin;    // Valores maximo y minimo del rango
  
     vmin = pow(10, (d-1));
     vmax = pow(10, d) - 1;
     i = 0 ;

     while ( i < N ) {
      lista[i] = rand() % (vmax - vmin + 1) + vmin ;
      i = i + 1;
     }
     // Proceso Principal
     cout << "\nNUMERO DE COMPRA:" << endl;
     for ( i = 0 ; i < N ; i = i + 1){

      if ( (i) % 5 == 0 ) {
       cout << endl;
      }
      cout << lista[i] << "\t";
     } 

    return 0;
}