/*
Nome: Mario
Cognome: Montanari
Classe: 3AIN
Data: 30/01/2025

Esercizio: Gestione di un Magazzino

Scrivere un programma che gestisce un piccolo magazzino.
Il programma deve:

  1. Definire una struct Prodotto con i seguenti campi:
    - int codice → Codice identificativo;
    - int quantita → Quantità disponibile;
    - float prezzo → Prezzo unitario;
    - bool disponibile → true se la quantità è maggiore di 0, false altrimenti.
    
  2. Implementare una funzione:
    - void aggiornaDisponibilita(struct Prodotto prodotti[], int n);
    
  La funzione riceve un array di struct Prodotto e aggiorna il campo disponibile in base alla quantità.
  
Nel main, dichiarare un array di almeno 3 prodotti, chiamare la funzione e stampare l'elenco dei prodotti con il loro stato di disponibilità.
*/

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>

#define NPRODOTTI 10

#define CMIN 10000
#define CMAX 99999

#define QMIN 0
#define QMAX 9

#define PMIN 10
#define PMAX 99

#define PDMIN 10
#define PDMAX 100

using namespace std;

typedef struct {
	int codice;
	int quantita;
	float prezzo;
	bool disponibile;
} Prodotto;

void riempiProdotti(Prodotto prodotti[], int nprodotti);
void aggiornaDisponibilita(Prodotto prodotti[], int nprodotti);

int main(void) {
	Prodotto prodotti[NPRODOTTI];
	int nprodotti = NPRODOTTI;
	
	srand(time(NULL));
	
	riempiProdotti(prodotti, nprodotti);
	aggiornaDisponibilita(prodotti, nprodotti);
	
	return 0;
}

void riempiProdotti(Prodotto prodotti[], int nprodotti) {
	float parteDecimale = 0;
	
	for (int i = 0; i < nprodotti; i++) {
		prodotti[i].codice = rand() % (CMAX - CMIN + 1) + CMIN;
		prodotti[i].quantita = rand() % (QMAX - QMIN + 1) + QMIN;
		
			prodotti[i].prezzo = rand() % (PMAX - PMIN + 1) + PMIN;
			parteDecimale = rand() % (PDMAX - PDMIN + 1) + PDMIN;
			
		for (int j = 0; j < nprodotti; j++) {
			if (parteDecimale == 10 || parteDecimale == 20 || parteDecimale == 30 ||parteDecimale == 40 ||parteDecimale == 50 ||parteDecimale == 60 ||parteDecimale == 70 || parteDecimale == 80 || parteDecimale == 90 || parteDecimale == 100) {
				parteDecimale = rand() % (PDMAX - PDMIN + 1) + PDMIN;
			}
		}
		
		prodotti[i].prezzo = prodotti[i].prezzo + (parteDecimale / 100);
		
		if (prodotti[i].quantita > 0) {
			prodotti[i].disponibile = true;
		} else {
			prodotti[i].disponibile = false;
		}
	}
}

void aggiornaDisponibilita(Prodotto prodotti[], int nprodotti) {
	cout << " -------------------------------------------------------------" << endl;
	cout << " | Codice:" << setw(18) << "| Quantita':   " << setw(13) << "| Prezzo:   " << setw(10) << "| Disponibilita':   |" << endl;
	cout << " -------------------------------------------------------------" << endl;
	for (int i = 0; i < nprodotti; i++) {
		cout << " | " << prodotti[i].codice << setw(7)
			<< " | " << prodotti[i].quantita << setw(15)
			<< " | " << prodotti[i].prezzo << setw(7)
			<< " | " << prodotti[i].disponibile << setw(18) << "|"
			<< endl;
	}
	cout << " -------------------------------------------------------------" << endl;
}