/**
 * Created by zulupero on 20/06/16.
 */
public class Bug extends Buggle {
    public Bug(int posx, int posy, int dir) {
        super(posx, posy, dir);
    }

    public void enRoute() {
        setVitesse(1000);
        setCouleur(StdDraw.GRAY); // la couleur de la brosse après passage
        setX(8); setY(0);         // position initale
        baisseBrosse();
        String motBinaire = "";

        while(hasNextSnake()) {
            avance();
            if (isSurBiscuit())
                motBinaire = motBinaire.concat("1");
            else
                motBinaire = motBinaire.concat("0");
        }
        message("J'ai lu "+motBinaire);
        message("   soit "+binaryString2IntNatural(motBinaire)+" en décimal.");
        message("   ou "+binaryString2IntC2(motBinaire)+" en C2.");
    }

    /**
     * Retourne la représentation décimale du paramètre sBin
     * considéré comme du binaire naturel.
     * @param sBin
     * @return
     */
    public int binaryString2IntNatural(String sBin){
        int rang = 0;
        int poids = 1 ;
        int decimalValue = 0;
        char chiffreCourant ;
        while (rang< sBin.length()){
            if (sBin.charAt(sBin.length()-rang-1) == '1') {
                decimalValue += poids;
            }
            rang++;
            poids *=2 ;
        }
        return decimalValue;
    }

    /**
     * Retourne la représentation décimale du paramètre sBin
     * considéré comme du complément à 2 sur 16 bits.
     * @param sBin
     * @return
     */
    public int binaryString2IntC2(String sBin){
        int result = 0 ;
        if (sBin.charAt(0) == '0'){
            result = binaryString2IntNatural(sBin);
        } else {
            String sC1 ="" ;
            int rang = 0;
            while(rang < sBin.length()){
                if(sBin.charAt(rang) == '1')
                    sC1 = sC1.concat("0");
                else
                    sC1 = sC1.concat("1");

                rang++;
            }
            result = -(binaryString2IntNatural(sC1)+1);
        }
        return result;
    }

    /**
     * hasNextSnake
     * @return true si une case autour appartient au serpent
     */
    public boolean hasNextSnake(){
        boolean result = false;
        int xInit = getX();
        int yInit = getY();
        String nextDir = getDirection();
        int cpt = 0;
        boolean brosseON = isBrosseBaisse();

        if (brosseON == true) leveBrosse();
        while(result!=true && cpt<4){
            if(!isFaceMur()){
                avance();
                if(getCouleurSol().equals(StdDraw.GREEN)){
                    result = true;
                    nextDir = getDirection();
                }
                retourne(); // retour en position initiale
                avance();   // direction opposée
                retourne();
            }
            cpt++;
            droite();
        }
        setDirection(nextDir);
        if (brosseON == true) baisseBrosse();
        return result;
    }
}
