package cryptohelper.data;

import java.util.ArrayList;

public class MappaPosizioni {

    private MappaPosCarattere[] mappa;

    public MappaPosizioni(String testoCifrato) {
        inizializza(testoCifrato);
    }

    public String executeMossa(Mossa mossa, String testoLavoro) {
        StringBuilder sb = new StringBuilder(testoLavoro);
        //System.out.println("executeMossa sb " + sb + " Mossa: " + mossa.toString());
        for (int i = 'A'; i <= 'z'; i++) {
            //System.out.println("executeMossa " + (char) i + " mappa[i] " + mappa[i]);
            if (mappa[i] != null && (mappa[i].getCarattere() == mossa.getCharacter())) {
                //System.out.println(" mappa[i].getCarattere() " + mappa[i].getCarattere());
                mappa[i].setCarattere(mossa.getInverseChar());
                ArrayList<Integer> lista = mappa[i].getListaPos();
                for (int j = 0; j < lista.size(); j++) {
                    sb.setCharAt(lista.get(j), mappa[i].getCarattere());
                }
            } else {
                //System.out.println("Mossa non valida");
            }
        }
        return sb.toString();
    }
    
    

    /**
     * metodo final - non e redifinibile in una sottoclase
     *
     * @param testoCifrato
     */
    public final void inizializza(String testoCifrato) {
        mappa = new MappaPosCarattere[256];
        testoCifrato = testoCifrato.toUpperCase(); //trasforma tutti i carratteri in caratteri minuscoli
        for (int i = 0; i < testoCifrato.length(); i++) {
            if (testoCifrato.charAt(i) >= 'A' || testoCifrato.charAt(i) <= 'Z') {
                addPos(testoCifrato.charAt(i), i);
            }
        }
    }

    private void addPos(char ch1, int pos) {
        //controllo se ch1 esiste nella mappa
        boolean exists = false;
        for (int i = 'A'; i <= 'Z'; i++) {
            if (mappa[i] != null && mappa[i].getCarattere() == ch1) {
                //si aggiunge una nuova posizione in un testo per ch1 nella mappa
                mappa[i].addPosizione(pos);
                exists = true;
            }
        }
        if (!exists) { // se il ch1 non esiste ancora nella mappa si crea una nuova calsse MappaPosCarattere e si aggiunge alla mappa
            MappaPosCarattere temp = new MappaPosCarattere(ch1);
            mappa[ch1] = temp;
            mappa[ch1].addPosizione(pos);
        }
    }

    public MappaPosCarattere[] getMappa() {
        return mappa;
    }

    public void setMappa(MappaPosCarattere[] mappa) {
        this.mappa = mappa;
    }

    @Override
    public String toString() {
        StringBuilder a = new StringBuilder();
        for (int i = 'A'; i <= 'Z'; i++) {
            if (this.mappa[i] != null) {
                a.append("Carattere immutabile = ").append((char) i).append(", ").append(mappa[i].toString()).append("\n");
            }
        }
        return a.toString();
    }

}

@@ -216,32 +216,326 @@
 ato);%0D%0A    %7D%0D%0A%0D%0A
+    /**%0D%0A     * Il metodo cambia il testoLavoro e aggiorna la mappa con parametri forniti%0D%0A     * dalla mossa%0D%0A     *%0D%0A     * @param mossa Una nuova assunzione%0D%0A     * @param testoLavoro testo su quale si sta lavornado%0D%0A     * @return testoLavoro cambiato dopo aver eseguito la mossa%0D%0A     */%0D%0A
     public Strin
@@ -795,81 +795,82 @@
   //
-System.out.println(%22executeMossa %22 + (char) i + %22 mappa%5Bi%5D %22 + mappa%5Bi%5D);
+cerca nella mappa dove risiede il carattere cifrato che si vuole scambiare
 %0D%0A  
@@ -979,146 +979,196 @@
   //
-System.out.println(%22 mappa%5Bi%5D.getCarattere() %22 + mappa%5Bi%5D.getCarattere());%0D%0A                mappa%5Bi%5D.setCarattere(mossa.getInverseChar());
+cambia il carrattere cifrato con quello presunto%0D%0A                mappa%5Bi%5D.setCarattere(mossa.getInverseChar());%0D%0A                //cambia il nuovo carattere presunto anche nel testoLavoro
 %0D%0A  
@@ -1388,89 +1388,8 @@
  %7D%0D%0A
-            %7D else %7B%0D%0A                //System.out.println(%22Mossa non valida%22);%0D%0A
     
@@ -1451,20 +1451,8 @@
   %7D%0D
-%0A    %0D%0A    %0D
 %0A%0D%0A 
@@ -1519,16 +1519,86 @@
 oclase%0D%0A
+     * Inizzializa la mappa%0D%0A     * dei caratteri di un testoCifrato%0D%0A
      *%0D%0A
@@ -1615,32 +1615,51 @@
 ram testoCifrato
+ su quale si lavora
 %0D%0A     */%0D%0A    p
@@ -2087,24 +2087,284 @@
 %7D%0D%0A    %7D%0D%0A%0D%0A
+    /**%0D%0A     * Metodo ausiliario per aggiungere un carattere e aggiungere/aggiornare%0D%0A     * posizione nel testo del carattere nella mappa%0D%0A     *%0D%0A     * @param ch1 - nuovo carattere o una occorenza%0D%0A     * @param pos - dove si trova ch1 net testo%0D%0A     */%0D%0A
     private 

Revert "Merge origin/master"