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

import data.*;

/**
 *
 * @author chislim
 */
public class MechanickyPrepis
{

    char[] abeceda = new char[]{'f', 'g', 'h', 'i', 'j', 'k'};
    int abe_poz = 0;
    String finalPredikat = Utils.finalPredikat;
    String answer = Utils.answer;
    int bez_operacie = Utils.bezOperacie;
    

    public MechanickyPrepis()
    {
           Uzol.f.vypis3("\n\nMECHANICKY PREPIS \n"); 

    }
        
    public boolean nizsieNieJeOr(Uzol u) 
    {
        
        if (u instanceof UzolOperacia) 
        {
           
            if (((UzolOperacia) u).getSign() == Utils.or) 
            {
                return false;
            }
        }
       
        if (u.lavy != null)
        {
            nizsieNieJeOr(u.lavy);
        }
        
        if (u.pravy != null)
        {
            nizsieNieJeOr(u.pravy);
        }
      
        return true;
    }

    public void runMechanickyPrepis(Uzol u) 
    {
        
        int iba_negacia = 0;
        Uzol dalsia_pozicia_negacie = null;
        String predikaty = "";
        String predikaty2 = "";
        
        //    String _predikat="";

        //if (u instanceof UzolUnarny) if ((((UzolUnarny)u).getUnarna()==maly) || (((UzolUnarny)u).getUnarna()=='R') ||  (((UzolUnarny)u).getUnarna()==velky))
     
        while (!(u instanceof UzolOperacia))
        {
            
            if (u instanceof UzolOperand)
            {
                break;
            }
            u = u.lavy;
        }
        //     f.vypis("dnu"+abeceda[abe_poz]);
        Uzol v = u.otec;
        int koniec = 0;
        
        while (koniec == 0)
        {
           
            if (v instanceof UzolUnarny)
            {
                
                if (((UzolUnarny) v).getUnarna() == 'R') 
                {
                    koniec = 2;
                }
            }
          
            if (v instanceof UzolUnarny)
            {
               
                if (((UzolUnarny) v).getUnarna() == Utils.negacia)
                {
                    koniec = 1;
                } 
                else 
                {
                    v = v.otec;
                }
            }
        //if (v instanceof UzolUnarny) f.vypis("je to "+((UzolUnarny)v).getUnarna()+((UzolUnarny)v).getOperand());
        //if (v instanceof UzolOperacia) f.vypis("op");            
        //     f.vypis(""+koniec);
        }

        if (koniec == 2)
        {

            //mechanickyPrepisStromu(u,finalPredikat+","+predikaty,answer);
            //???????????????????????????? 
            mechanickyPrepisStromu(u, "", answer);
            koniec = 3;

        }
        else 
        {

            v = v.otec;
            if (v instanceof UzolUnarny)
            {
                
                if (((UzolUnarny) v).getUnarna() == 'R') 
                {
                    iba_negacia = 1;
                } 
                else 
                {
                   
                    while (koniec == 1) 
                    {
                        
                        if (v instanceof UzolUnarny)
                        {
                            
                            if ((((UzolUnarny) v).getUnarna() == Utils.maly) || (((UzolUnarny) v).getUnarna() == Utils.velky)) 
                            {
                                
                                if (predikaty == "") 
                                {
                                    predikaty = ((UzolUnarny) v).getOperand();
                                } 
                                else 
                                {
                                    predikaty = ((UzolUnarny) v).getOperand() + "," + predikaty;
                                }
                            }
                            
                            if (((UzolUnarny) v).getUnarna() == Utils.negacia)
                            {
                               
                                if (dalsia_pozicia_negacie == null) 
                                {
                                    dalsia_pozicia_negacie = v;
                                }
                            }
                           
                            if (((UzolUnarny) v).getUnarna() == 'R') 
                            {
                                koniec = 2;
                            }
                        }
                        
                        if (koniec != 2) 
                        {
                            v = v.otec;
                        }
                    }
                }
            }
        //if (iba_negacia==1) f.vypis("answer2(finalne) <12- G("+predikaty2+")");

        }
        if (koniec != 3) 
        {
            mechanickyPrepisStromu(u, finalPredikat + "," + predikaty, "" + abeceda[abe_poz]);
            //zmena, povodne tu bolo
            //            if (iba_negacia==1) { f.vypis(answer+" <11- "+abeceda[abe_poz]+"("+predikaty+")"); koniec=3; }
          
            if (iba_negacia == 1) 
            {
                
                if (predikaty == "")
                {
                    Uzol.f._vypis (answer + " :- " + Utils.negacia + abeceda[abe_poz] + "(" + finalPredikat + ")");
                }
                else 
                {
                    Uzol.f._vypis(answer + " :- " + Utils.negacia + abeceda[abe_poz] + "(" + finalPredikat + "," + predikaty + ")");
                }
               
                koniec = 3;
            }
           
            abe_poz++;
            predikaty2 = predikaty;
        }
        
        while (dalsia_pozicia_negacie != null) 
        {

            v = dalsia_pozicia_negacie.otec;
            dalsia_pozicia_negacie = null;
            koniec = 1;
            predikaty = "";
            
            if (((UzolUnarny) v).getUnarna() == 'R') 
            {
                iba_negacia = 1;
            } 
            else
            {
                while (koniec == 1)
                {

                    if (v instanceof UzolUnarny) 
                    {
                        
                        if ((((UzolUnarny) v).getUnarna() == Utils.maly) || (((UzolUnarny) v).getUnarna() == Utils.velky)) 
                        {
                            
                            if (predikaty == "")
                            {
                                predikaty = ((UzolUnarny) v).getOperand();
                            } 
                            else 
                            {
                                predikaty = ((UzolUnarny) v).getOperand() + "," + predikaty;
                            }
                        }
                        
                        if (((UzolUnarny) v).getUnarna() == Utils.negacia)
                        {
                            
                            if (dalsia_pozicia_negacie == null)
                            {
                                dalsia_pozicia_negacie = v;
                            }
                        }
                        
                        if (((UzolUnarny) v).getUnarna() == 'R') 
                        {
                           koniec = 2;
                        }
                    }
                    if (koniec != 2) 
                    {
                        v = v.otec;
                    }
                }
                //if (dalsia_pozicia_negacie==null) f.vypis("answer(final Iba) :- "+negacia+abeceda[abe_poz-1]+"("+predikaty2+")"); else 
                
                if (predikaty2 == "")
                {
                    Uzol.f._vypis(abeceda[abe_poz] + "(" + finalPredikat + ") :- " + Utils.negacia + abeceda[abe_poz - 1] + "(" + finalPredikat + ")");
                } 
                else
                {
                    Uzol.f._vypis(abeceda[abe_poz] + "(" + finalPredikat + "," + predikaty + ") :- " + Utils.negacia + abeceda[abe_poz - 1] + "(" + finalPredikat + "," + predikaty2 + ")");
                }
                abe_poz++;
            }
           
            if (iba_negacia == 1)
            {
               
                if (predikaty2 == "")
                {
                    Uzol.f._vypis(abeceda[abe_poz] + "(" + finalPredikat + ") :- " + Utils.negacia + abeceda[abe_poz - 1] + "(" + finalPredikat + ")");
                } 
                else 
                {
                    Uzol.f._vypis(abeceda[abe_poz] + "(" + finalPredikat + ") :- " + Utils.negacia + abeceda[abe_poz - 1] + "(" + finalPredikat + "," + predikaty2 + ")");
                }
               
                koniec = 3;
                Uzol.f._vypis(answer + " :- " + Utils.negacia + abeceda[abe_poz] + "(" + finalPredikat + ")");
            }
          
            predikaty2 = predikaty;
        }
        // ak je to null tak to znamena ze raz negovat a koniec
       
        if (koniec != 3)
        {
            
            if (predikaty == "") {
                Uzol.f._vypis(answer + " :- " + Utils.negacia + abeceda[abe_poz - 1] + "(" + finalPredikat + ")");
            } 
            else 
            {
                Uzol.f._vypis(answer + " :- " + Utils.negacia + abeceda[abe_poz - 1] + "(" + finalPredikat + "," + predikaty + ")");
            }
        }
    }

    public void mechanickyPrepisStromu(Uzol u, String pred, String pismenko)
    {
        if (u instanceof UzolOperacia)
        {
            
            if (((UzolOperacia) u).getSign() == Utils.and) 
            {
               
                if (pred == "") 
                {
                    Uzol.f._vypis4(pismenko + " :- ");
                } 
                else
                {
                    Uzol.f._vypis4(pismenko + "(" + pred + ") :- ");
                }
                
                u._vypis();
                Uzol.f._vypis("");
            }
           
            if (((UzolOperacia) u).getSign() == Utils.or)
            {
                
                if (nizsieNieJeOr(u.lavy))
                {

                    if (pred == "") 
                    {
                        Uzol.f._vypis4(pismenko + " :- ");
                    } 
                    else 
                    {
                        Uzol.f._vypis4(pismenko + "(" + pred + ") :- ");
                    }
                   
                    u.lavy._vypis();
                    Uzol.f._vypis("");
                } 
                else 
                {
                    mechanickyPrepisStromu(u.lavy, pred, pismenko);
                }


                if (nizsieNieJeOr(u.pravy)) 
                {
                    if (pred == "") 
                    {
                        Uzol.f._vypis4(pismenko + " :- ");
                    } 
                    else 
                    {
                        Uzol.f._vypis4(pismenko + "(" + pred + ") :- ");
                    }
                    u.pravy._vypis();
                    Uzol.f._vypis("");

                } 
                else 
                {
                    mechanickyPrepisStromu(u.pravy, pred, pismenko);
                }
            }
        }
        else 
        {
           
            if ((u instanceof UzolOperand) && (bez_operacie == 1)) 
            {
                //f.vypis(pismenko+"oismenko ");
                //f.vypis(pred+"pred ");                
                // f.vypis("co tu robis");

                if (pred == "") 
                {
                    Uzol.f._vypis4(pismenko + " :- ");
                } 
                else 
                {
                    Uzol.f._vypis4(pismenko + "(" + pred + ") :- ");
                }
               
                u._vypis();
                Uzol.f._vypis("");
            }
        }
    }
}
