/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package de.nplusc.izc.InstallPak;
import de.nplusc.izc.tools.IOtools.FileTK;
import de.nplusc.izc.tools.IOtools.registryReader;
import de.nplusc.izc.tools.WinToolz.Commands;
import de.nplusc.izc.tools.baseTools.Detectors;
import de.nplusc.izc.tools.baseTools.Messagers;
import de.nplusc.izc.tools.baseTools.Tools;
import de.nplusc.izc.tools.baseTools.arraytools;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

/**
 *
 * @author LH
 */
public class izsetupReader
{
    private static HashMap<String,ArrayList<String>> groupsplitted = new HashMap<>();
    
    /**
     * Verarbeitet iZsetup-Daten
     * @param content der String mit dem SetupFile
     * @param packagesOnly ob packagefiles als einzigesdurch dürfen
     * @param dbgenab debugmode (gint content auf err-stream aus)?
     * @param baseDir baasedir für #basedir#-ersetzung
     * @return konvertiertes file
     */
    public static String[][] ConvertToSysSpezSetupFile(String content, boolean packagesOnly, boolean dbgenab, String baseDir)
    {
        groupsplitted = new HashMap<>();
        String[] rawFile = content.split("\\n");
        if(!rawFile[0].startsWith("000|izsetup|"))
        {
            Messagers.SingleLineMsg("Das war leider keine gültige datei...", "Okay");
            System.exit(0);
        }
        //12
        //000|izsetup|1.0.0|
        String versCode = rawFile[0].substring(12);
        validateVersion(versCode);
        ArrayList<String> SubGroup = new ArrayList<>();
        String previousGRPID="000";
        String groupID="000";
        boolean isPak = true;
        if(packagesOnly)
        {
            isPak=false;
        }
        for (String line : rawFile)
        {
            if(dbgenab)
            {
                System.err.println("RAW>>>"+line);
            }
            
            if(!(line.length()<6))
            {
                String[] splittedLine = line.split("\\|");
                //DBG_START
                // System.err.println(splittedLine[0]+"|GRP");
                // System.err.println(splittedLine[1]+"|KEY");
                // System.err.println(splittedLine[2]+"|VAL");
                // System.err.println(splittedLine[3]+"|CMNT");
                //DBG_STOP
                
                boolean _999 = false;
                if(packagesOnly)
                {
                    
                    if(splittedLine[0].equals("999"))
                        _999=true;
                }
                if(!splittedLine[0].equals("000")&&!_999&&isPak)
                {
                    groupID=splittedLine[0];
                    if(!splittedLine[0].equalsIgnoreCase("CMM"))
                    {
                        if(!previousGRPID.equals(groupID)&&!previousGRPID.equals("000"))
                        {
                            groupsplitted.put(previousGRPID, SubGroup);//Einlagern der abgeschlossenen gruppe
                            SubGroup = new ArrayList<>();//resetten für neue daten;
                        }
                        
                        line = Tools.processEnvVarsinLine(line);
                        line = Tools.replaceHashmarkedVars(line, "basedir", baseDir);
                        //Detectfor envvars
                        
                        //FileTK.
                        //line = line.re
                        //#basedir# durch pfad von izSetup-file ersetzen
                        //userprofile-variable und appdata-variable unterstützt
                        SubGroup.add(line);
                        if(dbgenab)
                            System.err.println(line);
                        previousGRPID=groupID;
                    }

                }
                else
                {
                    //000|privileges|elevated
                    if (splittedLine[1].equalsIgnoreCase("privileges"))
                    {
                        Tools.DebugHelperPrint("COnvert_Privilegienkram....", true, "iZsetup.enableCoreDebug");
                        System.err.println(splittedLine[2]+"|elevated");
                        if(splittedLine[2].equalsIgnoreCase("elevated"))
                        {
                            Tools.DebugHelperPrint("AdminRechte her! aber dalli", true, "iZsetup.enableCoreDebug");

                            String basecmd = Tools.processEnvVarsinLine("-jar %appdata%/izsetup/izsetupLauncher.jar");
                            if(!Detectors.detectisAdmin())
                            {
                                  Tools.DebugHelperPrint(">((((((((()°> nix gfunden", true, "iZsetup.enableCoreDebug");
                                
                                System.err.println("noAdmin");
                                String cmd = basecmd;
                                String[] args = ModeSel.getArgs();
                                for (String arg : args)
                                {
                                    cmd +=" "+arg;
                                }
                                Commands.executeAsAdministrator("java"  , cmd.trim());
                                System.exit(0);
                            }
                        }
                    }
                    //000|type|script|
                    if(splittedLine[1].equalsIgnoreCase("type")
                            &&packagesOnly
                            &&!isPak
                            &&((!splittedLine[2].equalsIgnoreCase("packages"))||(!splittedLine[2].equalsIgnoreCase("package")))
                            )
                    {
                        isPak=true;//errort aus wenn nur packagefiles erlaubt aber ein normales file kommt
                    }
                }
            }
        }
        groupsplitted.put(previousGRPID, SubGroup);
        
        return finalizeSessi0n();
    }
    
    
    
   /**
    * Verarbeitet iZsetup-Daten
    * @param filepath datei des files
    * @return konvertiertes setuoFile
    */
    public static String[][] getSysSpezSetupFile(String filepath)
    {
        return getSysSpezSetupFile(filepath,false);
    }
    
    
    /**
     * Verarbeitet iZsetup-Daten
     * @param filepath dateipfad des files
     * @param packagesOnly ob nur packfiles gelesenwerden dürfen
     * @return konvertiertes file
     */
            
    public static String[][] getSysSpezSetupFile(String filepath, boolean packagesOnly)
    {
        return getSysSpezSetupFile(filepath, packagesOnly,false);
    }
    
    /**
     * 
     * Verarbeitet iZsetup-Daten
     * @param filepath dateipfad des files
     * @param packagesOnly ob nur packfiles gelesenwerden dürfen
     * @param dbgenab debugmode (gint content auf err-stream aus)?
     * @return konvertiertes file
     */
    public static String[][] getSysSpezSetupFile(String filepath, boolean packagesOnly,boolean dbgenab)
    {
        groupsplitted = new HashMap<>();
        String[] rawFile = FileTK.fileload(filepath, false);
        if(!rawFile[0].startsWith("000|izsetup|"))
        {
            System.err.println(filepath);
            Messagers.SingleLineMsg("Das war leider keine gültige datei...", "Okay");
            System.exit(0);
        }
        //12
        //000|izsetup|1.0.0|
        String versCode = rawFile[0].substring(12);
        validateVersion(versCode);
        ArrayList<String> SubGroup = new ArrayList<>();
        String previousGRPID="000";
        String groupID="000";
        boolean isPak = true;
        if(packagesOnly)
        {
            isPak=false;
        }
        for (String line : rawFile)
        {
            if(!(line.length()<6))
            {
                String[] splittedLine = line.split("\\|");
                //DBG_START
               // System.err.println(splittedLine[0]+"|GRP");
               // System.err.println(splittedLine[1]+"|KEY");
               // System.err.println(splittedLine[2]+"|VAL");
               // System.err.println(splittedLine[3]+"|CMNT");
                //DBG_STOP
                
                boolean _999 = false;
                if(packagesOnly)
                {
                    
                    if(splittedLine[0].equals("999"))
                        _999=true;
                }
                if(!splittedLine[0].equals("000")&&!_999&&isPak)
                {
                    groupID=splittedLine[0];
                    if(!splittedLine[0].equalsIgnoreCase("CMM"))
                    {
                        if(!previousGRPID.equals(groupID)&&!previousGRPID.equals("000"))
                        {
                            groupsplitted.put(previousGRPID, SubGroup);//Einlagern der abgeschlossenen gruppe
                            SubGroup = new ArrayList<>();//resetten für neue daten;
                        }
                        
                        line = Tools.processEnvVarsinLine(line);
                        String baseDir = FileTK.getFilePath(filepath);
                        line = Tools.replaceHashmarkedVars(line, "basedir", baseDir);
                        //Detectfor envvars
                        
                        //FileTK.
                        //line = line.re
                        //#basedir# durch pfad von izSetup-file ersetzen
                        //userprofile-variable und appdata-variable unterstützt
                        SubGroup.add(line);
                        if(dbgenab)
                            System.err.println(line);
                        previousGRPID=groupID;
                    }

                }
                else
                {
                                        //000|privileges|elevated
                    if (splittedLine[1].equalsIgnoreCase("privileges"))
                    {
                        Tools.DebugHelperPrint("Read_Privilegienkram....", true, "iZsetup.enableCoreDebug");

                        if(splittedLine[2].equalsIgnoreCase("elevated"))
                        {
                            Tools.DebugHelperPrint("AdminRechte her! aber dalli", true, "iZsetup.enableCoreDebug");

                            String basecmd = Tools.processEnvVarsinLine("-jar %appdata%/izsetup/izsetupLauncher.jar");
                            if(!Detectors.detectisAdmin())
                            {
                                Tools.DebugHelperPrint("<°()))))))))< nix gfunden", true, "iZsetup.enableCoreDebug");
                                String cmd = basecmd;
                                String[] args = ModeSel.getArgs();
                                for (String arg : args)
                                {
                                    cmd +=" "+arg;
                                }
                                Commands.executeAsAdministrator("java"  , cmd.trim());
                                System.exit(0);
                                
                            }
                        }
                    }
                    //000|type|script|
                    if(splittedLine[1].equalsIgnoreCase("type")
                            &&packagesOnly
                            &&!isPak
                            &&((!splittedLine[2].equalsIgnoreCase("packages"))||(!splittedLine[2].equalsIgnoreCase("package")))
                            )
                    {
                        isPak=true;//errort aus wenn nur packagefiles erlaubt aber ein normales file kommt
                    }
                }
            }
        }
        groupsplitted.put(previousGRPID, SubGroup);
        
        
        
        return finalizeSessi0n();
    }
    /*
    public static void main(String args[])
    {
        //NOP
    }*/
                    
    private static void clearGroupFromCrap(String groupkey)
    {
        ArrayList<String> GroupContentPP = groupsplitted.get(groupkey);//wird später durch ne neue List ersetzt
        String[] Groupcontent  = GroupContentPP.toArray(new String[0]);
        for (int i = 0; i < Groupcontent.length; i++)
        {
            String line = Groupcontent[i];
            if(line.length()>0)
            {
                String[] linesegs = line.split("\\|");
                if(linesegs[1].startsWith("cond"))
                {
                    String condelsemarker="else"+linesegs[1];
                    String condendmarker="end"+linesegs[1];
                    int elseline = 0,endline=0;
                    boolean conditionsClear = false;
                    if(linesegs[2].equalsIgnoreCase("IsWin8"))
                    {
                        conditionsClear =Detectors.detectIsWin8();
                    }
                    if(linesegs[2].equalsIgnoreCase("Is64Bit")&&!conditionsClear)
                    {
                        conditionsClear = Detectors.detect64bitWinon7and8();
                    }
                    if(linesegs[2].equalsIgnoreCase("IsWinXP")&&!conditionsClear)
                    {
                        conditionsClear = Detectors.detectWInXP();
                    }
                    if(linesegs[2].equalsIgnoreCase("IsWin7")&&!conditionsClear)
                    {
                        conditionsClear = Detectors.detectWin7();
                    }
                    if(linesegs[2].startsWith("PathExists:"))
                    {
                        conditionsClear = FileTK.checkDirExist(linesegs[2].substring(11));//kann zum Erkennen beliebiger Programme genutzt werden
                    }
                    if(linesegs[2].startsWith("RegKeyExists:"))
                    {
                        // prüft Registryeinträge//sollte hinter ne CheckWIndows geglemmt werden
                        conditionsClear = registryReader.checkExistenceOfRegKey(linesegs[2].substring(13));
                        if(!conditionsClear)
                        {
                            conditionsClear = registryReader.checkExistenceOfRegKeyEntry(linesegs[2].substring(13));
                        }
                    }
                    Groupcontent[i]="";
                    if(!conditionsClear)
                    //<editor-fold defaultstate="collapsed" desc="BEdingung nicht erfüllt">
                    {
                        boolean elseContained= false;
                        //int endofCond = 0;
                        for (int j = i; j < Groupcontent.length; j++)
                        {
                            
                            String linei = Groupcontent[j];
                            //System.err.println("XXX"+linei);
                            
                            if(linei.length()>0)
                            {
                                String[] linesegsi = linei.split("\\|");
                                if(linesegsi[1].startsWith(condelsemarker))
                                {
                                    elseline=j;
                                    Groupcontent[j]="";
                                    elseContained=true;
                                    for (int k = i; k < j; k++)
                                    {
                                        Groupcontent[k]="";//entfernt die nicht passenden Werte
                                    }
                                }
                                if(linesegsi[1].startsWith(condendmarker))
                                {
                                    endline=j;
                                    Groupcontent[j]="";
                                    if(!elseContained)
                                    {
                                        for (int k = i; k < j; k++)
                                        {
                                            Groupcontent[k]="";//entfernt die nicht passenden Werte
                                            
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //</editor-fold>
                    else
                    //<editor-fold defaultstate="collapsed" desc="BEdingung erfüllt">
                    {
                        boolean elseContained= false;
                        for (int j = i; j < Groupcontent.length; j++)
                        {
                            String linei = Groupcontent[j];
                            //System.err.println("|||"+linei);
                            if(linei.length()>0)
                            {
                                String[] linesegsi = linei.split("\\|");
                                if(linesegsi[1].startsWith(condelsemarker))
                                {
                                    elseline=j;
                                    Groupcontent[j]="";
                                    elseContained=true;
                                }
                                if(linesegsi[1].startsWith(condendmarker))
                                {
                                    endline=j;
                                    Groupcontent[j]="";
                                    if(elseContained)
                                    {
                                        for (int k = elseline; k < j; k++)
                                        {
                                            Groupcontent[k]="";//entfernt die nicht passenden Werte
                                            
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //</editor-fold>
                }
            }
        }
        
        
        
     GroupContentPP = new ArrayList<>();
        for (String string : Groupcontent)
        {
            if(!string.isEmpty())
                GroupContentPP.add(string);
        }
        groupsplitted.put(groupkey, GroupContentPP);
        
    }
    
    
    
    
    private static String[][] finalizeSessi0n()
    {
        ArrayList<String[]> returnValuesTemp = new ArrayList<>();
        
        
        String[] groupids = groupsplitted.keySet().toArray(new String[0]);
        for (String key : groupids)
        {
            clearGroupFromCrap(key);//ausgelagert um Coide zu entwirren
        }
        Arrays.sort(groupids);
        for (String key : groupids)
        {
            ArrayList<String> GC= groupsplitted.get(key);
            String[] splittedLine1,splittedLine2,splittedLine3;
            for (String val : GC)
            {
                if(val.length()>6)
                {
                splittedLine1 = val.split("\\|");
                splittedLine2 = splittedLine1[2].split(";");
                splittedLine3 = arraytools.concatAll(Arrays.copyOf(splittedLine1, 2), splittedLine2);
                
                returnValuesTemp.add(splittedLine3);
                }
                else
                {
                    returnValuesTemp.add(null);
                }
            }
        }
        String[][] ret = new String[returnValuesTemp.size()][];
        for (int i = 0; i < ret.length; i++)
        {
            ret[i] = returnValuesTemp.get(i);
        }
        return ret;
    }
    private static void validateVersion(String versCode)
    {
        versCode = versCode.split("\\|")[0]; //rest abkoppeln
        String[] versCodeSpl = versCode.split("\\.");
        Tools.DebugHelperPrint(">>Version:"+versCode+"\n"+versCodeSpl[0]+"|"+InstallManager.VERSION_MAJOR+
                "\n"+versCodeSpl[1]+"|"+InstallManager.VERSION_MINOR+"\n"+versCodeSpl[2]+"|"+InstallManager.REVISION, true, "iZsetup.enableCoreDebug");
        
        if ((Integer.valueOf(versCodeSpl[0]) > InstallManager.VERSION_MAJOR))
        {
            Messagers.SingleLineMsg("iZsetup ist veraltet. Mindestens " + versCode + " benötigt", "Okay");
            System.exit(0);
        }
        if ((Integer.valueOf(versCodeSpl[1]) > InstallManager.VERSION_MINOR))
        {
            Messagers.SingleLineMsg("iZsetup ist veraltet. Mindestens " + versCode + " benötigt", "Okay");
            System.exit(0);
        }
        if ((Integer.valueOf(versCodeSpl[2]) > InstallManager.REVISION))
        {
            Messagers.SingleLineMsg("iZsetup ist veraltet. Mindestens " + versCode + " benötigt", "Okay");
            System.exit(0);
        }
    }
}
