/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cz.vutbr.feec.utko.fojtoval.krypto.funkce;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;

/**
 *
 * @author fojtoval
 */
public class DelejNtice {

    /**
     * Metoda vraci pole - jde o seznam n-tic (n=nt) v zadanem textu.
     * @param text analyzovany text
     * @param nt urcuje jak dlouhe ntice se maji vytvaret
     * @return pole n-tic
     */
    @SuppressWarnings("element-type-mismatch")
    public static String[] poleNtic(String text, int nt) {

        int delka = text.length();
        int i, j = 0;
        int posledni =0;
        boolean zapocitat;
        String test, srovnej;
        HashMap<String, Integer> cetnosti = new HashMap();

        for (i = 0; i <= delka - nt; i++) {

            test = text.substring(i, i+nt);
            zapocitat = true;

            for (j = 1; j < nt ; j++) {

                if ((i - j) < 0) {
                    continue;
                }

                srovnej = text.substring(i-j,i-j+nt);

                if (srovnej.equals(test)) {
                    if ( (i - j) <= posledni ) {
                        zapocitat = false;
                    }
                }

            }

            if (zapocitat) {

                if (cetnosti.containsKey(test)) {

                    int pomoc1 = cetnosti.get(test);
                    pomoc1++;
                    cetnosti.put(test,pomoc1);

                } else {
                    cetnosti.put(test,1);
                }

                posledni = i;

            }

        }

        List cetnostiKeys = new ArrayList(cetnosti.keySet());
        List cetnostiValues = new ArrayList(cetnosti.values());
        Collections.sort(cetnostiKeys);
        Collections.sort(cetnostiValues);
        Collections.reverse(cetnostiValues);
        LinkedHashMap sortedCetnosti = new LinkedHashMap();

        Iterator valueIt = cetnostiValues.iterator();

        while (valueIt.hasNext()) {

            Object val = valueIt.next();
            Iterator keyIt = cetnostiKeys.iterator();

            while (keyIt.hasNext()) {

                Object key = keyIt.next();
                @SuppressWarnings("element-type-mismatch")
                String comp1 = cetnosti.get(key).toString();
                String comp2 = val.toString();

                if (comp1.equals(comp2)){
                    cetnosti.remove(key);
                    cetnostiKeys.remove(key);
                    sortedCetnosti.put((String)key, (Integer)val);
                    break;
                }

            }

        }

        List jList1;
        List jList2;
        String [] cetnostiPole = new String [20];
        jList1 = Arrays.asList(sortedCetnosti.keySet().toArray());
        jList2 = Arrays.asList(sortedCetnosti.values().toArray());
        int lSize;

        if (jList1.size() > 20) {
            lSize=20;
        } else {
            lSize=jList1.size();
        }

        for (i = 0; i < lSize; i++) {
            cetnostiPole[i] = jList1.get(i).toString()+ " - " + jList2.get(i).toString();
        }

        return(cetnostiPole);

    }

    /**
     * Testuje, zda se ve vstupnim textu vyskytuje libovolny String o delce nt alespon dvakrat.
     * V pripade ze ano => vraci true, jinak false.
     * @param text vstupni text
     * @param nt delka n-tice
     * @return true nebo false
     */
    public static Boolean testNtic(String text, int nt){

        int delka = text.length();
        int i, j = 0;
        int posledni =0;
        boolean zapocitat;
        String test, srovnej;
        HashMap<String, Integer> cetnosti = new HashMap();

        for (i = 0; i <= delka - nt; i++) {

            test = text.substring(i, i+nt);
            zapocitat = true;

            for (j = 1; j < nt ; j++) {

                if ((i - j) < 0) {
                    continue;
                }

                srovnej = text.substring(i-j,i-j+nt);

                if (srovnej.equals(test)) {
                    if ( (i - j) <= posledni ) {
                        zapocitat = false;
                    }
                }

            }

            if (zapocitat) {

                if (cetnosti.containsKey(test)) {
                    return(true);
                } else {
                    cetnosti.put(test,1);
                }

                posledni = i;

            }

        }

        return(false);

    }
}
