class PendingReportSubmitionTable{
    getTableBody(excelJson){
        let tableBody='';
            PENDING_REPORT_SUBMISSIONS_ERROR_BUCKET_OBJECT={}//evry time clear errobucket
        let whileInitiallyLoopStart=(currentLoopObj, currentLoopIndex, nextLoopObj, lastLoopIndex)=>{
            let insertManagerDetailsInJson=()=>{
                currentLoopObj["managerId"]=USER_EMPID;// in index.php file
                currentLoopObj["managerName"]=USER_NAME; //in index.php file
            }
            insertManagerDetailsInJson();
            if(currentLoopIndex!=lastLoopIndex){
                this.checkForDuplicateEntries(currentLoopObj, nextLoopObj);
            }
        }
        for(let loopIndex=0; loopIndex< excelJson.length; loopIndex++){
            let bgColor='';
            let errorMsgTag='';
            let currentLoopObj=excelJson[loopIndex];
            let uniqueKey=currentLoopObj.SiteId+"_"+currentLoopObj.EmpId+"_"+currentLoopObj.SiteVisitDate;
            whileInitiallyLoopStart(currentLoopObj, loopIndex, excelJson[loopIndex+1],(excelJson.length-1));
            this.checkInvalidEntries(currentLoopObj, uniqueKey);
            if(currentLoopObj.invalidEntry){
                bgColor="bg-light-danger";
                errorMsgTag=`<br><span class="errorMsgTag text-danger font-weight-bold">Invlaid Entry</span>`;
            }
            if(currentLoopObj.duplicate){
                bgColor="bg-light-danger";
                errorMsgTag=`<br><span class="errorMsgTag text-danger font-weight-bold">Duplicate</span>`;
            }
            tableBody+=`<tr class="${bgColor} tr_${uniqueKey}">
                            <td>${loopIndex+1}</td>
                            <td>${currentLoopObj.SiteId}${errorMsgTag}</td>
                            <td>${currentLoopObj.Project}</td>
                            <td>${currentLoopObj.StageOfAudit}</td>
                            <td>${currentLoopObj.EmpId}</td>
                            <td>${currentLoopObj.EmpName}</td>
                            <td>${currentLoopObj.SiteVisitDate}</td>
                            <td>${currentLoopObj["TL Name"]}</td>
                            <td>${currentLoopObj["TL Id"]}</td>
                            <td>${currentLoopObj["PONo"]}</td>
                            <td class="reportTd">${this.getReportDateTd(currentLoopObj, currentLoopObj.reportDate,loopIndex,  uniqueKey)}</td>
                            <td class="reportRemarkTd">${this.getReportRemarkTd(currentLoopObj, currentLoopObj["Report Remarks"], loopIndex, uniqueKey)}</td>
                            
                        </tr>`;
        }
        return tableBody;
    }
    
    getReportRemarkTd(currentLoopObj, reportRemarks, index, uniqueKey){
        let className="";
        let errorMsgTag='';
        if(reportRemarks){
            if(reportRemarks.length > 300){
                className="border-danger"
                this.updateErrorBucket(uniqueKey, "Report Remark Exceed MaxLength");
                errorMsgTag=`<span class="errorMsgTag d-block text-center text-danger font-weight-bold">Max Limit 300</span>`;
            }else{
                reportRemarks=reportRemarks.replaceAll("'","");
                currentLoopObj["Report Remarks"]=reportRemarks;
            }
        }
        return `<textarea class="form-control reportRemark" data-rowIndex="${index}" data-errorKey="${uniqueKey}"  maxlength="300" rows="2" placeholder="Enter Report Remarks">${reportRemarks}</textarea>${errorMsgTag}`;
    }
    getReportDateTd(currentLoopObj, reportDate, index, uniqueKey){
        let dateReg1=/^\d{4}\/(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])$/; // for 2022/01/01
        let dateReg2=/^\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$/; // for 2022-01-01
        let errorMsgTag='';
        if(reportDate){
            if(reportDate.match(dateReg1) || reportDate.match(dateReg2)){
                reportDate=reportDate.replaceAll('/','-');
                currentLoopObj["reportDate"]=reportDate;
            }else{
                errorMsgTag=`<span class="errorMsgTag font-weight-bold d-block text-danger text-center">Invalid Formate(<span class="text-dark">${reportDate}</span>)</span>`;
                this.updateErrorBucket(uniqueKey, "Invalid ReportDate");
            }
        }else{
            errorMsgTag=`<span class="font-weight-bold errorMsgTag d-block text-danger text-center ">Required</span>`;
            this.updateErrorBucket(uniqueKey, "ReportDate Required");
        }
        return `<input type="date" value="${reportDate}" class="form-control reportDate" data-rowIndex="${index}" data-errorKey="${uniqueKey}"/>${errorMsgTag}`;
    }
    
    checkForDuplicateEntries(currentLoopObj, nextLoopObj){
        let crntSiteId=currentLoopObj["SiteId"];
        let crntEmpId=currentLoopObj["EmpId"];
        let crntDate=currentLoopObj["SiteVisitDate"];
        
        let nxtSiteId = nextLoopObj["SiteId"];
        let nxtEmpId= nextLoopObj["EmpId"];
        let nxtDate= nextLoopObj["SiteVisitDate"];
        
        if(crntSiteId==nxtSiteId && crntEmpId==nxtEmpId && crntDate==nxtDate){
            currentLoopObj.duplicate=true;
            nextLoopObj.duplicate=true;
            
            let crnt_uniqueId=crntSiteId+"_"+crntEmpId+"_"+crntDate;
            let nxt_uniqueId=nxtSiteId+"_"+nxtEmpId+"_"+nxtDate;
            this.updateErrorBucket(crnt_uniqueId, 'Duplicate Entry');
            this.updateErrorBucket(nxt_uniqueId, 'Duplicate Entry');
        }
        
    }
    checkInvalidEntries(currentLoopObj, uniqueId){
        let isObjExist=PENDING_REPORTS_SUBMITION_DETAILS_RESPONSE_JSON_IN_OBJECT[uniqueId];
        if(!isObjExist){
            currentLoopObj.invalidEntry=true;
            this.updateErrorBucket(uniqueId, 'Invalid Entry');
        }
    }
    updateErrorBucket(uniqueId, errorType){
        let indexOfErrorValueNotExist=-1;
        if(!PENDING_REPORT_SUBMISSIONS_ERROR_BUCKET_OBJECT[uniqueId]){ // if array not exist
            PENDING_REPORT_SUBMISSIONS_ERROR_BUCKET_OBJECT[uniqueId]=[]; // create array 
        }
        let indexOfErrorValue = PENDING_REPORT_SUBMISSIONS_ERROR_BUCKET_OBJECT[uniqueId].indexOf(errorType);    // check if error already exist, if exist ignore
        if(indexOfErrorValue==indexOfErrorValueNotExist){
            PENDING_REPORT_SUBMISSIONS_ERROR_BUCKET_OBJECT[uniqueId].push(errorType);
        }
    }
}