import java.util.Arrays;

/**
 * Classe che simula un borsellino
 * @author radaelli11353
 */
public class Purse {
    private String[] coins;
    private int actualSize;
    
    /**
     * Costruttore
     * @param dim Quantità massima di monete inseribili nel borsellino
     */
    public Purse(int dim) {
        coins = new String[dim];
        actualSize = 0;
    }
    
    /**
     * Metodo che aggiunge una moneta al borsellino
     * @param coinName Nome della moneta
     */
    public void addCoin(String coinName) {
        coins[actualSize] = coinName;
        actualSize++;
    }
    
    /**
     * Metodo che inverte gli elementi presenti nel borsellino
     */
    public void reverse() {
        String[] oldCoins = new String[actualSize];
        oldCoins = Arrays.copyOf(coins, actualSize);
        for(int i = 0; i < actualSize; i++) {
            coins[i] = oldCoins[actualSize - i - 1];
        }
    }
    
    /**
     * Metodo che restituisce il numero di valori presenti nel borsellino
     * @return Numero di valori presenti nel borsellino
     */
    public int getSize() {
        return actualSize;
    }
    
    /**
     * Metodo che restituisce il valore di una moneta alla posizione 'i'
     * @param i Posizione del valore richiesto
     * @return Valore (String) alla posizione 'i'
     */
    public String getCoinValue(int i) {
        if(i >= actualSize || i < 0) throw new IllegalArgumentException("La moneta all'index" + i + "non è presente nel borsellino");
        return coins[i];
    }
    
    /**
     * Metodo che imposta la moneta ad una posizione 'i' ad un valore 'value'
     * @param i Posizione in cui inserire il valore
     * @param value Valore (String) da inserire nel borsellino
     */
    public void setCoinValue(int i, String value) {
        if(i >= actualSize || i < 0) throw new IllegalArgumentException("La moneta all'index" + i + "non è presente nel borsellino");
        coins[i] = value;
    }
    
    /**
     * Metodo che svuota il borsellino
     */
    public void clear() {
        for(int i = 0; i < actualSize; i++) {
            coins[i] = "";
        }
    }
    
    /**
     * Metodo che sposta le monete contenute in un altro borsellino
     * nel borsellino attuale
     * @param other Altro borsellino che viene svuotato
     */
    public void transfer(Purse other) {
        for(int i = 0; i < other.actualSize; i++) {
            coins[actualSize + i] = other.coins[i];
        }
        actualSize += other.actualSize;
        other.clear();
    }
    
    /**
     * Metodo che confronta (per contenuto e posizione del contenuto) due borsellini
     * @param other Altro borsellino con cui viene confrontato l'attuale
     * @return True se i due borsellini contengono le stesse monete nella stessa posizione, false se non soddisfano queste condizioni
     */
    public boolean sameContents(Purse other) {
        if(this.actualSize == other.actualSize) {
            for(int i = 0; i < actualSize; i++) {
                if(coins[i] != other.coins[i]) return false;
            }
            return true;
        }
        return false;
    }

    /**
     * Metodo che confronta (per contenuto) due borsellini
     * @param other Altro borsellino con cui viene confrontato l'attuale
     * @return True se i due borsellini contengono le stesse monete, false se non soddisfa questa condizione
     */
    public boolean sameCoins(Purse other) {
        if(this.actualSize == other.actualSize) {
            String[] copy = new String[actualSize];
            for(int i = 0; i < actualSize; i++) {
                copy[i] = other.coins[i];
            }

            for(String coin : this.coins) {
                for(int i = 0; i < actualSize; i++) {
                    if(coin == other.coins[i]) {
                        copy[i] = "";
                    }
                }
            }
            for(String coin : copy) {
                if(coin != "") return false; 
            }
            return true;
        }
        return false;
    }
    
    /**
     * Metodo toString che restituisce i valori delle monente nel borsellino
     * @return Testo che indica le monete contenute nel borsellino
     */
    @Override
    public String toString() {
        String text = "Purse[";
        
        for(int i = 0; i < actualSize; i++) {
            if(i != 0) text += ",";  
            text += coins[i];
        }

        text += "]";

        return text;
    }
}
