//------------------------------------------AB HIER NICHTS ÄNDERN--------------------------------------------------------
const versionNr = "15102019-1.2"
const warnColor = warnFarbe ;
const format = "<!DOCTYPE html><html lang=\"de\"><head><title>Putzer</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"></head><body>";
const htmlTable="<table style=\"color:"+color_in_table+";text-align:left; font-family:"+schriftart+";background-image: linear-gradient(67deg,transparent,"+color_gradient1+");\">";
const htmlReset="<p style=\"color:red;font-family:"+schriftart+";\"><i>!!! ohne Javascript Instanzen !!! kann enabled werden</i></p>"
const htmlHeaders = "style=\"color:"+colorHeadlines+";\""; 
const htmlHeadersDP = "style=\"color:"+colorHeadlinesDP+";\""; 
//  var htmlOhneAnzahl="<p style=\"color:red;font-family:"+schriftart+";\"><i>!!! ohne DatenpunktZählung !!! kann enabled werden</i></p>"
const htmlError="<p style=\"color:red;font-family:"+schriftart+";\"><i>Script hat Fehler - bitte Log checken !!!</i></p>"
var allInstArr=[];
var  instanzArrHelp=[];
const dpPrefix = "javascript."+ instance +".";
var mylogs=false;
var htmlDP=[];
var htmlMSG=[];
var counterAll=0;
var directSearch=false;
var switchOn=false;
var helplogs=false;
var htmlHelper="";
var htmlHelperFile="";
createState(dpPrefix + "ProofingDatapoints.HTMLTable", { name: 'HTMLTable',  type: 'string', read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.ScriptVersion", versionNr,{ name: 'ScriptVersion',  type: 'string', read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.RunScript",false, { name: 'RunScript',  type: 'boolean', role:"switch", read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.JavaInstanzCheck", true,{ name: 'JavaInstanzCheck',  type: 'boolean', role:"switch", read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.ObjectAnzahlCheck", true,{ name: 'ObjectAnzahlCheck',  type: 'boolean', role:"switch", read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.MonsterSearch", false,{ name: 'MonsterSearch',  type: 'boolean', role:"switch", read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.ohneInstanzAnzeige", false,{ name: 'ohneInstanzAnzeige',  type: 'boolean', role:"switch", read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.OrdnerCheck", "", { name: 'OrdnerCheck',  type: 'string', read:  true,  write: true,});
createState(dpPrefix + "ProofingDatapoints.RunSuccessful", false, { name: 'RunSuccessful',  type: 'boolean', role:"state", read:  true,  write: false,});
//------------------------------------------CHECK INSTANZEN--------------------------------------------------------
function instanzCount(){
  var ohneInstanz = getState(dpPrefix + "ProofingDatapoints.ohneInstanzAnzeige").val;
  
   var counter=0; var counter2=0;var counter3=0; 
$('system.adapter.*.alive').each(function(id, i) {
    var ida = id.split('.');
     allInstArr.push(ida[2]+"."+ida[3]);
  if (!ohneInstanz && !directSearch) {
   
   if(!id.includes("vis")){
   
   counter++;
   if (getState(id).val==null) {;counter2++; mylog(ida[2]+ida[3]+"--------------------der hier wurde nie gestartet"); 
      htmlDP.push(ida[2]+"."+ida[3]);
      htmlMSG.push("Instanzen ohne Werte");} //else{instanzArr.push(ida[2]+"."+ida[3])}
   if (getState(id).val==false) {counter3++;mylog(ida[2]+ida[3]+"-----------------------der hier ist ausgeschalten"); 
      htmlDP.push(ida[2]+"."+ida[3]);
      htmlMSG.push("nicht aktiviert");} /*else{instanzArr.push(ida[2]+"."+ida[3])}*/
   }}
});
 if (!ohneInstanz) {
mylog("______________________________________________Anzahl Instanzen: " + counter.toString());
htmlDP.push("");
htmlMSG.push("");
htmlDP.push("Anzahl Instanzen");
htmlMSG.push(counter.toString());
mylog("______________________________________________Anzahl gestoppter Instanzen ohne Werte: " + counter2.toString())
htmlDP.push("Instanzen ohne Werte");
htmlMSG.push(counter2.toString());
htmlDP.push("Instanzen nicht aktiviert");
htmlMSG.push(counter3.toString());
 }
}
//------------------------------------------CHECK ZUORDNUNG--------------------------------------------------------
function checkTypes(select) {
    helplog("bin in check types");
   var counter=0; 
   htmlMSG.push("");
   htmlDP.push("");
   var sub= select.substring(select.length-1, select.length); log("---------: "+sub);//console.log("----------select: "+select);
   mylog(select)
   $(select).each(function (id, i) {
       counter++
     //  console.log("===============id vor null - kein value zu:  "+id);
          
   if (!id.includes('scriptEnabled') && !id.includes('scriptProblem')  && getState(id).val !== null /*&& !id.includes('Log-Script')  && !id.includes('Ereignisliste') && !id.includes('GETPROCESS')*/ ){
       //console.log("===============id vor null - kein value zu:  "+id);
      //console.log("status0-checkType");
       if (getState(id).val==null) console.log("===============nullwert - kein value zu:  "+id);
      
      //console.log("status1-checkType");
       if (!JSON.stringify(getObject(id)).includes("type") && !JSON.stringify(getObject(id)).includes("name") /*&& !JSON.stringify(getObject(id)).includes("meta")*/ ) {
      //console.log("===============id nach stringify - kein value zu:  "+id);
            var valType = typeof getState(id).val;
             htmlDP.push(id+": "+valType);
             htmlMSG.push("<b>missing DP-OBEJCT !!</b>" );}
       
        else{ 
         //console.log("status2-checkType");
            var dpType = getObject(id).common.type;
              var valType = typeof getState(id).val;
              if(dpType != "mixed" ) {
              if(dpType !== valType && !(dpType == 'array' && valType == 'object' &&  dpType == 'meta.user') /*&& !(dpType =='text' && valType=='string') && !(dpType =='string' && valType=='text')*/ ) {
                 mylog(id + ': Datenpunkttyp: ' + dpType + ', Wert: ' + valType);
                 htmlDP.push(id+": "+valType);
                 htmlMSG.push(dpType );
                 /* später testing)
                 console.log("======1=============no type: "+id +"object: "+JSON.stringify(getObject(id)));
                 if(!getObject(id).common.hasOwnProperty("type")) console.log("--------------kein TYPE: "+id) ;
                 console.log("======2=============no type: "+id +"object: "+JSON.stringify(getObject(id).common));
               */
                 
                 }
               
       }}
     /*
       if(dpType != valType && !(dpType == 'array' && valType == 'object')) {
           log(id + ': Datenpunkttyp: ' + dpType + ', Wert: ' + valType);
           htmlDP.push(dpType);
           htmlMSG.push(valType);
       }*/
   }
   });
   htmlDP.push("<i>ID + IST-WERT</i>");
   htmlMSG.push("<i>SOLL-WERT</i>");
 //  htmlDP.push("<b>geprüfte Instanz</b>");
  // htmlMSG.push("<i><b>"+select+"</b></i>");
    htmlDP.push("-col-<b>geprüfte Instanz</b>");
   htmlMSG.push("-col-<i><b>"+select+"</b></i>");
   helplog("fertg in checkType mit:" + counter.toString()+ " Durchläufen")
  
}
//------------------------------------------CHECK  WERTE--------------------------------------------------------
function checkWerte(select) {
   helplog("bin in check Werte");
   var counter=0; 
   mylog(select);
   $(select).each(function (id, i) {
       counter++
       
   if (!id.includes('scriptEnabled') && !id.includes('scriptProblem') /* )  && !id.includes('Ereignisliste') && !id.includes('GETPROCESS')*/ ){
      //var dpType = getObject(id).common.type;
       
     
            if (!JSON.stringify(getObject(id)).includes("type") && !JSON.stringify(getObject(id)).includes("name") ) { //CHECK MISSING OBJECT))
             try{
             valType = typeof getState(id).val;
             } catch (e) {console.log("------------ERROR: "+e + "bei id: " + id); }
             htmlDP.push(id+": "+valType);
             htmlMSG.push("<b>missing DP-OBEJCT !!</b>" );}
             else {
       var valType =  getState(id).val;
      // if(dpType != "mixed" ) {}
      //console.log("status1");
           if(valType === null) {mylog(id + ': Datenpunkttyp: ' /*+ dpType */+ ", Wert: "+valType);
               htmlDP.push(id);
               var ddd = new Date().getTime()-getObject(id).ts;
               htmlMSG.push("missing seit " + Math.floor((ddd)/1000/60/60/24)+"d "+Math.floor((ddd)/1000/60/60 %24)+"h "+Math.floor((ddd)/1000/60 %60)+"m ");
           } 
              //console.log("status2");
        if(getObject(id).common.hasOwnProperty("states") /*&& JSON.stringify(getObject(id).common.states)!=null && JSON.stringify(getObject(id).common.states)!=undefined */){
           // console.log("======2=============no type: "+id +"object: "+JSON.stringify(getObject(id).common.states));
           //console.log("der hier: " +id);
           try{
           var helpStates= Object.keys(getObject(id).common.states);
           } catch (e) {console.log("------------ERROR: "+e + "bei id: " + id); extendObject(id, {common: {states:{"0":"script"}}})}
           var helpType= getObject(id).common.type;
          
         
         //  console.log(helpType);
        //console.log(helpStates.toString());
       // console.log(helpStates[0] + helpStates[1] );
        if (helpType=="number" || helpType=="boolean") {
                   var alarmString=false;var alarmString2=false;
                   for (var i=0;  i  < helpStates.length ;i++){
                      //  console.log( helpStates[i]);
                        mylog(isNaN(helpStates[i]).toString())  ;
                        if (isNaN(helpStates[i]) && helpType=="number") alarmString=true; //type number - stehen da nummern drin
                        var helpTypeBool= helpStates[i].toString()  + helpType;
                        if  (helpType=="boolean") {if (helpTypeBool !="falseboolean" && helpTypeBool != "trueboolean")  alarmString2=true;} //type boolean - stehen da booleans
                   }
                   if (alarmString){  htmlDP.push(id);
                                      htmlMSG.push("-col-<b>ACHTUNG Multstate must be number</b>")}
                   if (alarmString2){ htmlDP.push(id);
                                      htmlMSG.push("-col-<b>ACHTUNG Multstate must be boolean</b>")}
                   } else {htmlDP.push(id);
                           htmlMSG.push("-col-<b>ACHTUNG Multstate wrong Def.</b>")}
        
        } //ende states check
       /* else {            htmlDP.push(id);
                           htmlMSG.push("ACHTUNG Multstate wrong Def.")}*/
   } //ende check missing object
   } // ende script enabled check
   }); // ende selct.each
 
    helplog("bin raus aus check Werte");
  
}
//---------------------------------------------------------------------------------------------------------------------
function mylog(message) {
  if(mylogs)
      console.log(message);
}function helplog(message) {
  if(helplogs)
      console.log(message);
}
//------------------------------------------Zähle Objecte der  INSTANZEN--------------------------------------------------------
function countDP(idb){
   mylog("bin richtig in count");
   var counter4=0;
   $(idb+".*").each(function(id, i) {
   counter4++; })
mylog(idb+counter4);
htmlDP.unshift(idb);
htmlMSG.unshift(counter4.toString());
counterAll=counterAll+counter4;
mylog("bin raus aus count");
}
//----------------------------------------------Direct Suchen
on({id:dpPrefix + "ProofingDatapoints.OrdnerCheck", ack: false, change: "any"}, function (obj) {
 
    directSearch=true;
     instanzArrHelp=[];
    setState(dpPrefix + "ProofingDatapoints.RunScript",true);
   
    });
//-----------------------------------------------SCHALTER MAIN------------------------------------------------
on({id:dpPrefix + "ProofingDatapoints.RunScript", ack: false, val: true}, function (obj) { 
   setState(dpPrefix + "ProofingDatapoints.RunSuccessful",false); 
   let java= getState(dpPrefix + "ProofingDatapoints.JavaInstanzCheck").val;
   let instanzAnzahl= getState(dpPrefix + "ProofingDatapoints.ObjectAnzahlCheck").val;
   let monster= getState(dpPrefix + "ProofingDatapoints.MonsterSearch").val;
   var ohneInstanz = getState(dpPrefix + "ProofingDatapoints.ohneInstanzAnzeige").val;
   var endehtmlConst=   "<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\">Letztes File Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"</p>";
   var endehtmlDPConst=   "<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\">Letztes Table Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"</p>";
   setState(dpPrefix + "ProofingDatapoints.ScriptVersion",versionNr);
   htmlHelper="";
   htmlHelperFile="";
   setState(dpPrefix + "ProofingDatapoints.HTMLTable",htmlReset+endehtml+htmlError);
   writeFile(null, "/ProofingDatapoints/htmlputz.html" ,htmlReset+endehtml+htmlError+"</body>", function (error) {mylog('file written'); });
  
   counterAll=0;
   instanzArrHelp=[];
   allInstArr=[];
setStateDelayed(dpPrefix + "ProofingDatapoints.RunScript",false,2500);
htmlDP=[];
htmlMSG=[];
instanzCount();  //überprüft instanzen und stellt allInstArr her
htmlDP.push("-col-<b>INSTANZ INFO</b>"); htmlMSG.push(""); htmlDP.push(""); htmlMSG.push("");
mylog(instanzArr.length+"==================="+instanzArr.toString());
if (monster) {instanzArrHelp=allInstArr;} else {instanzArrHelp=instanzArr}  //ACHTUNG MONSTERSEARCH
if (directSearch) {instanzArrHelp=[]; instanzArrHelp.push(getState(dpPrefix + "ProofingDatapoints.OrdnerCheck").val);}
for(let name in instanzArrHelp){
   checkWerte(instanzArrHelp[name]+".*")                   //checkt alle werte in intanzArr
    mylog("!!!!!!!!!!!!!!!!!!!!:  "+instanzArrHelp[name]);}
    if (instanzAnzahl){
          htmlDP.unshift(""); htmlMSG.unshift("");htmlDP.unshift("<b>OBJECTE IN INSTANZ</b>"); htmlMSG.unshift("Anzahl"); 
           
          for(let name in instanzArrHelp){
            countDP(instanzArrHelp[name]);mylog("bin in zhlen");}
            if (java && !monster) countDP("javascript")
          htmlDP.unshift("-col-<b>GESAMT GEPRÜFTE OBJECTE IN INSTANZEN</b>"); htmlMSG.unshift("-col-<b>"+counterAll.toString()+"</b>"); 
          
          }
          mylog("=============: "+counterAll);
if (java && !monster && !ohneInstanz && !directSearch) checkWerte('javascript.*');                //checkt alle javainstanzen
 htmlDP.push("-col-<b>ID's OHNE WERT:</b>");
 htmlMSG.push("");
for(let name in instanzArrHelp){
   checkTypes(instanzArrHelp[name]+".*")
   mylog("!!!!!!!!!!!!!!!!!!!!:  "+instanzArrHelp[name])};
     htmlDP.push("");
     htmlMSG.push("");
     htmlDP.push("-col-<b>IDs MIT FALSCHEN TYPE:</b>");
     htmlMSG.push("");
 if (java && !monster && !ohneInstanz && !directSearch ) checkTypes('javascript.*');
 //console.log(htmlMSG.length+"--"+htmlDP.length)
for(var i= htmlDP.length-1; i>-1; i--) {
   //console.log(htmlDP[i]+"anerer :"+htmlMSG[i]);
     //  if (htmlMSG[i].includes("-col-")) console.log(htmlMSG[i]);
       let htmlDPVis; let htmlDPFile;let htmlMSGVis;let htmlMSGFile;
       if(htmlDP[i].includes("-col-")) {htmlDPVis=htmlDP[i].replace("-col-", (htmlHeadersDP+">"));  htmlDPVis=" "+htmlDPVis } else {htmlDPVis=">"+htmlDP[i]}
       if(htmlMSG[i].includes("-col-")) {htmlMSGVis=htmlMSG[i].replace("-col-", (htmlHeadersDP+">"));htmlMSGVis=" "+htmlMSGVis } else {htmlMSGVis=">"+htmlMSG[i]}
       htmlHelper= htmlHelper+"<tr><td"+htmlDPVis+"  </td><td"+htmlMSGVis+"  </td></tr>"
    //  if(htmlDP[i].includes("-col-")) {htmlDP[i]=htmlDP[i].replace("-col-", (htmlHeaders+">")); htmlDPFile=htmlDP[i]; htmlDPFile= " "+htmlDPFile ; } else {htmlDPFile=">"+htmlDP[i]}
       if(htmlDP[i].includes("-col-")) {htmlDPFile=htmlDP[i].replace("-col-", (htmlHeaders+">"));  htmlDPFile= " "+htmlDPFile ; } else {htmlDPFile=">"+htmlDP[i]}
       if(htmlMSG[i].includes("-col-")) {htmlMSGFile=htmlMSG[i].replace("-col-", (htmlHeaders+">")); htmlMSGFile=" "+htmlMSGFile; } else {htmlMSGFile=">"+htmlMSG[i]}    
       htmlHelperFile= htmlHelperFile+"<tr><td"+htmlDPFile+"  </td><td"+htmlMSGFile+"  </td></tr>"
}
   var   endehtml=endehtmlConst;
   var   endehtmlDP=endehtmlDPConst;                       
    
   if (monster){endehtml="<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\"><i>!!! Monster Suche wird automatisch  deaktiviert !!!</i></p>"+endehtml;
             endehtmlDP="<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\"><i>!!! ACHTUNG: SYSTEM WIRD BELASTET !!! </br></br>!!! Monster Suche wird automatisch  deaktiviert !!! </br></br> BERICHT/AUSWERTUNG NUR ÜBER WEBSEITE</i></p>"+endehtmlDP;}
   if (!instanzAnzahl){endehtml="<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\"><i>!!! Auswertung ohne DatenpunktZählung !!! kann enabled werden</i></p>"+endehtml;
             endehtmlDP="<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\"><i>!!! Auswertung ohne DatenpunktZählung !!! kann enabled werden</i></p>"+endehtmlDP;}
   if (!java){ endehtml="<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\"><i>!!! Auswertung ohne Javascript Instanzen !!! kann enabled werden</i></p>"+endehtml;
             endehtmlDP="<p style=\"color:"+warnColor+"; font-family:"+schriftart+";\"><i>!!! Auswertung ohne Javascript Instanzen !!! kann enabled werden</i></p>"+endehtmlDP;}
   
   if(!monster) { setStateDelayed(dpPrefix + "ProofingDatapoints.HTMLTable",endehtmlDP+"<table>"+htmlHelper,900);} else{setStateDelayed(dpPrefix + "ProofingDatapoints.HTMLTable",endehtmlDP,900);}
  
   mylog("================================schreibe file")  ; 
   writeFile(null, "/ProofingDatapoints/htmlputz.html" ,format+endehtml+htmlTable+htmlHelperFile+"</table></body>", function (error) { mylog('file written'); });
  // endehtml=endehtmlConst;
  // endehtmlDP=endehtmlDPConst;
   setState(dpPrefix + "ProofingDatapoints.MonsterSearch",false);  //setzt monstersearch zurück
   directSearch=false;
    setState(dpPrefix + "ProofingDatapoints.RunSuccessful",true); 
});