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

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

import cz.vutbr.feec.utko.fojtoval.krypto.funkce.Constant;

/**
 * Jednoducha substituce klicem.
 * @author fojtoval
 */
public class SubstituceKlic extends Substituce {

    private char[] abecedasifr = null;
    private char[] abecedalus = null;

    /**
     * Sifrovani substituci s klicem.
     * @param zdroj otevreny text
     * @return zasifrovany text
     */
    @Override
    public String sifruj(String zdroj) {
        return Utils.zmenaTextuSubs (zdroj, this.abecedasifr, true);
    }


    /**
     * Nastaveni a kontrola parametru sifry.
     * @param parametr
     */
    @Override
    public void setParametr(Object parametr) {

        if (parametr == null) {
            throw (new NullPointerException ("Parametr je null!"));
        } else if (!(parametr instanceof String)) {
                   throw (new IllegalArgumentException ("Parametr neni String! (" + parametr + ")"));
               }

          String klic = (String)parametr;

          if (klic.length() < 1 || klic.length() > 26) {
              throw (new IllegalArgumentException ("Rozsah klice je 1-26 znaku. Bylo zadano " + klic.length() + "."));
		  }

          if (!klic.matches ("^[a-z]+$")) {
              throw (new IllegalArgumentException ("Klic obsahuje nepovolene znaky."));
          }

          char[] poleklice = klic.toCharArray();
          this.abecedasifr = Utils.monoalfaKlic(Constant.abcd, poleklice);
          this.abecedalus = Utils.monoalfaKlicLus(Constant.abcd, poleklice);

	}


    /**
     * Desifrovani substituce s klicem.
     * @param zdroj zasifrovany text
     * @return otevreny text
     */
    @Override
    public String lusti(String zdroj) {
        return Utils.zmenaTextuSubs (zdroj, this.abecedalus, true);
    }

    /**
     * Prevod desirovaci abecedy na String.
     * @return nova abeceda
     */
    @Override
    public String abecedaLusToString() {
        return String.valueOf (this.abecedalus);
    }

    /**
     * Prevod sifrovaci abecedy na String.
     * @return nova abeceda
     */
    @Override
    public String abecedaSifToString() {
        return String.valueOf (this.abecedasifr);
    }

}
