/**
 * 
 */
package system;

import java.util.ArrayList;
import java.util.List;

/**
 * Negozio è la classe in cui sono contenute la lista dei prodotti e la lista dei clienti, e svolge le funzioni di base del controllo del login
 * e di aggiunta (registrazione) di clienti, e di prodotto(specifico per Admin)
 * 
 * @author Andrea Zinelli, 241192
 * 
 *
 */


public class Negozio {
	
	public List<Prodotto> products;
	public List<Cliente> clients;
	public int clientNumber;
	public int productNumber;	
	
/**
 * Class Constructor. 
 * 
 */
	public Negozio(){
		this.products = new ArrayList<Prodotto>();
		this.clients = new ArrayList<Cliente>();
		clientNumber = 0;
		productNumber = 0;		
	}
	/**
	 * Aggiunge un Cliente alla lista di clienti. L'ID attribuito a ciascun cliente è progressivo (clientNumber+1), e ciò è gestito dal listener del submt button nella classe GUI.java.
	 * 
	 * @param cliente : il cliente da aggiungere
	 * @return Boolean che simboleggia se l'operazione di aggiunta è andata a buon fine(true), oppure se lo username è già utilizzato(false).
	 */
	public final boolean AddClient(Cliente cliente){		
		
		boolean usedUsername = false;
		for(int i = 0; i < clients.size(); i++){
			if(clients.get(i).username.equals(cliente.username)){
				usedUsername = true;
				break;
			}
		}
		if(!usedUsername){
			clients.add(clientNumber, cliente);
			clientNumber++;
		}
		return !usedUsername;
	}
	/**
	 * Funzione chiamabile da Admin per l'aggiunta di un nuovo prodotto nel "database", e quindi dal catalogo del negozio. Il controllo sullo username 'Admin' è a carico di GUI.java
	 *
	 * @param prodotto : il prodotto da aggiungere
	 * @return Boolean che simboleggia se l'operazione è andata a buon fine(true), oppure se l'item è già presente in Negozio(false).
	 */
	public final boolean AddProduct(Prodotto prodotto){
		
		boolean existingProduct = false;
		
		for(int i =0 ; i < products.size(); i++){
			if(products.get(i).category.equals(prodotto.category) && products.get(i).model.equals(prodotto.model) && products.get(i).brand.equals(prodotto.brand)){
				existingProduct = true;
				break;
			}			
		}
		if(!existingProduct){
			products.add(prodotto);
			productNumber++;
		}
		
		return !existingProduct;
	}
	/**
	 * Funzione chiamabile da Admin per la rimozione di un prodotto dal "database", e quindi dal catalogo del negozio.
	 * @param prodotto : il prodotto da rimuovere
	 */
	public final void RemoveProduct(Prodotto prodotto){				
		
		for(int i = 0; i < products.size(); i++){
			if(products.get(i).ID == prodotto.ID){				
				products.remove(i);
				break;
			}
		}		
	}
	/**
	 * Utilizzata per debug.
	 * @deprecated
	 */
	
	public final void PrintClientsInfo(){
		for(int i = 0; i < clientNumber; i++){
			System.out.println(clients.get(i).username);
			System.out.println(clients.get(i).password);
		}		
	}
	/**
	 * Utilizzata per debug.
	 * @deprecated
	 */
	public final void PrintProductsInfo(){
		for(int i = 0; i < productNumber; i++){
			System.out.println(products.get(i).price);
		}
	}
	/**
	 * Getter per il numero di clienti nel negozio. Utile per la creazione dell'ID progressivo
	 * 
	 * @return Il numero di clienti registrati
	 */
	public final int getClientNumber(){		
		return clients.size();
	}
	/**
	 * Getter per il numero di prodotti nel negozio
	 * 
	 * @return il numero di Prodotti a catalogo
	 */
	public final int getProductNumber(){		
		return products.size();
	}
	
	/**
	 * Funzione che ritorna l'ID massimo tra tutti i prodotti, cosicchè non si corra il rischio, nell'aggiunta di nuovi prodotti, che vi siano più prodotti con il medesimo ID
	 * 
	 * @return l'ID massimo tra tutti i prodotti
	 */
	public final int getHighestProductID(){
		int i = 0;
		for(int j = 0; j < products.size(); j++){
			if(i < products.get(j).ID) i = products.get(j).ID;			
		}
		return i;
	}
	
	/**
	 * Funzione che valida il login di un utente. Se username e password coincidono con una coppia nel "database", il cliente che ha tentato il login
	 * viene ritornato. Altrimenti viene ritornato null
	 * @param username : lo username dell'utente che tenta il login.
	 * @param password : la password dell'utente che tenta il login.
	 * 
	 * @return Il cliente se il login è andato a buon fine, null altrimenti.
	 */
	
	public final Cliente LoginCheck(String username, String password){  //add a check for existing username
				
		System.out.println(getClientNumber());
		for(int i = 0; i < getClientNumber(); i++){
			if(clients.get(i).username.equals(username) && clients.get(i).password.equals(password)) return clients.get(i);
		}
		return null;
	}

}
