import React,{useState,useEffect,useRef} from 'react';
import Container from '../components/container';
import { useRoute } from '@react-navigation/native';
import { globalStyles,customStyles,GetPageTheme } from "../styles/Global";
import { AppState, StatusBar,Image,TextInput,View,Text,ScrollView,TouchableOpacity,Platform,PermissionsAndroid,FlatList, Alert, Animated,KeyboardAvoidingView, DeviceEventEmitter, ViewBase, Keyboard} from 'react-native';
import { ReactReduxContext,connect,useSelector, useDispatch  } from 'react-redux';
import { mapStateToProps,mapDispatchToProps } from '../reducers/contextProvider';
import SQLite from 'react-native-sqlite-2';
import {notify} from '../components/notify';
import moment from 'moment';
import {UploadData2, getDownloadJson,getKPIFields,marktext1,marktext2, resizeImage, restore_ImageWithMetaData} from '../controller/functions';
import {get_item,set_item,clear_item} from '../components/localStorage';
import {version,sloganline,appname,testurl,db, colors_Arr, common_ImagePath,ImageFolderPath} from '../constants/constants';
import CustomHeader from '../components/customHeader';
import {Card, Menu, Switch} from 'react-native-paper';
import {AntDesign, Entypo, FontAwesome, Fontisto, Ionicons, MaterialCommunityIcons} from '../components/icons';
import { stat } from 'react-native-fs';
import CustomLoader from '../components/CustomLoader';
import LinearGradient from 'react-native-linear-gradient';
import { AppTables } from '../constants/tableConstants';
import { SvgXml } from 'react-native-svg';
import {launchCamera, launchImageLibrary,CameraOptions} from 'react-native-image-picker';
import * as RNFS from 'react-native-fs';
import GradientButton from '../components/gradientButton';
import addImg from '../assets/performics/add_image.svg';
import CustomModal from '../components/CustomModal';
import { Q_getpaidvisibility } from '../constants/ConstantQueries';
import { Picker } from '@react-native-picker/picker';
import { ConfirmSaveAlert } from '../components/alert';
import ModalSelector from 'react-native-modal-selector'
import { CustomPicker, CustomPicker2 } from '../components/CustomPicker';
import CustomCamera from '../components/Camera';
import ImageViewer from 'react-native-image-zoom-viewer';
import DateTimePicker from '@react-native-community/datetimepicker';
import CheckBox from '@react-native-community/checkbox';

import cameraImg from '../assets/performics/camera_front_image.svg'
import MultiSelect from 'react-native-multiple-select';
import CameraImg3 from '../assets/performics/camera_tick.svg';
import CameraImg2 from '../assets/performics/camera_icon.svg';
import CameraImg4 from '../assets/performics/camera_asterisk.svg';
import CameraImg5 from '../assets/image/astrickcamera.svg';
import IRLogin from '../components/IRLogin';
import { SyncIRsessionsInKPI } from '../constants/uploadData';
import { METHODS, getMethodName } from '../constants/methodNames';
import { PageTheme } from '../styles/Themes';

function PaidVisibilityOneAppIR_Only(props) { 
    const route = useRoute();
    const ST=props.StaticText || {};

    // get all theme styles acc to current theme set 
    const PageTheme=GetPageTheme(props.DarkMode,route.name);
    const customStyle=customStyles(props.DarkMode,route.name);
    const animatedChoice=useRef(new Animated.Value(0)).current;
    
    const [processing, setProcessing] = useState(true);
    const [loaderTitle, setLoaderTitle] = useState();
    const [isAdhocScreen, setIsAdhocScreen] = useState(false);
    const [storeData, setStoreData] = useState({});
    const [StoreCameraAllow, setStoreCameraAllow] = useState(true);
    const [currentMenu, setCurrentMenu] = useState({});
    const [rerenderdata, setrerenderdata]= useState(0);
    const [rerenderdata2, setrerenderdata2]= useState(0);
    const [rerenderdata3, setrerenderdata3]= useState(0);
    const [rerenderdata4, setrerenderdata4]= useState(0);
    
    const [hasUnsavedChanges,setHasUnsavedChanges] = useState(false);
    
    const [WindowData, setWindowData] = useState([]);
    const [reasons_list, setReasons_list] = useState([]);
    const [Windows, setWindows] = useState([]);

    const [show_zoomImage, setShow_zoomImage] = useState(false);
    const [show_zoomImage2, setShow_zoomImage2] = useState(false);
    const Show_zoomImageRef=useRef(false);
    const Show_zoomImageRef2=useRef(false);
    const [zoomImageIndex, setzoomImageIndex] = useState(0);
    const [refImageIndex, setrefImageIndex] = useState(0);
    const [refImageIndex2, setrefImageIndex2] = useState(0);
    const [zoomImageUrl, setZoomImageUrl] = useState([]);
    const [zoomImageUrl2, setZoomImageUrl2] = useState([]);
    const zoomView=useRef(null);
    const zoomView2=useRef(null);

    const [showAlert, setShowAlert] = useState(false);
  
    const [showCamera, setShowCamera] = useState(false);
    const showCameraRef = useRef(false);
    const [showQRCamera, setShowQRCamera] = useState(false);
    const showQRCameraRef = useRef(false);
    const [getImageProps,setGetImageProps]= useState({});
    const [showRating, setShowRating] = useState(false);
    const [RatingQtn, setRatingQtn] = useState({});
    const [RatingWindow, setRatingWindow] = useState({});
    const [RatingOrder, setRatingOrder] = useState([]);

    const [Products, setProducts] = useState([]);
    const [DisplayList, setDisplayList] = useState([]);
    const [toRemoveId,setToRemoveId]= useState('');
    const [toRemoveItem,setToRemoveItem]= useState({});
    const [showRemoveConfirm_M,setshowRemoveConfirm_M]= useState(false);
    const [showRAllC_M,setShowRAllC_M]= useState(false);
    const [searchedItem, setSearchedItem]= useState('');
    const [globalWindows, setGlobalWindows] = useState([]);
    const [KPIFields, setKPIFields] = useState([]);
    const [GridValue, setGridValue] = useState(false);
    const [QREnable, setQREnable] = useState(false);

    const [DataCleanModal, setDataCleanModal] = useState(false);
    const [DataCleanAnim, setDataCleanAnim] = useState("");
    const [DataCleanItem, setDataCleanItem] = useState({});
    const [isPresentClean, setIsPresentClean] = useState(0);

    const [InputChange, setInputChange] = useState([]);

    const [SelectedImg, setSelectedImg] = useState('');
    const [showModal, setShowModal] = useState(false);
    const [reCapImgModalObj, setReCapImgModalObj] = useState({});
    const [showImageSaveOp, setShowImageSaveOp] = useState(true);
    const [ImgMadCount, setImgMadCount] = useState({img1:0,img2:0});
    const [AppStatus, setAppStatus] = useState(AppState.currentState);
    const [QRqtnData, setQRqtnData] = useState({});

    const hasUnsavedChangesRef = React.useRef(hasUnsavedChanges);
    const WindowDataRef=React.useRef(WindowData);
    const StoreIdRef=React.useRef(null);
    const ScreenNameRef=React.useRef({});
    
    const inputRefs = useRef({});    


    // IR states or refs
    const [isDataExists, setisDataExists] = useState(false);
    const [isDataUploaded, setisDataUploaded] = useState("N");
    // const [WindowIRImages, setWindowIRImages] = useState([]);
    // const [GbTempSessionId, setGbTempSessionId] = useState("");
    const WindowIRImages=useRef([]);
    const GbTempSessionId=useRef("");
    const GbTempSessionObj=useRef({});
    const sessionsToUpload = useRef([]);
    const sessionsToUploadDetails = useRef([]);
    const sessionsUploadedCount = useRef(0);
    const sessionsReceived = useRef(0);
    const [showRetakeModal, setshowRetakeModal] = useState(false);
    const [retakeMData, setretakeMData] = useState({});
    const [showUploadAlert, setshowUploadAlert] = useState(false);
    const [windIRParams, setWindIRParams] = useState({});
    
    
    const d1=new Date();
    const d2=moment(d1).format('MM/DD/YYYY');
    
  
    useEffect(() => {
        setLoaderTitle(ST.Loading+'...')
        let params=props.route.params? props.route.params:{};
        let storeData1=params.storeData || {};
        let menu1=params.menu || {};
        let cameraAllow=storeData1.CameraAllow=='true' || storeData1.CameraAllow==1?true:false;
        setStoreCameraAllow(cameraAllow);
        
        let isAdhoc=params.isAdhoc || false;

        StoreIdRef.current=storeData1.StoreId
        ScreenNameRef.current={BgscreenName:menu1.ScreenName,BgMenuId:menu1.MenuId }
        setIsAdhocScreen(isAdhoc);
        setStoreData(storeData1);
        setCurrentMenu(menu1);

        let IR_Creds=props.IR_Creds!=null && props.IR_Creds!=""?JSON.parse(props.IR_Creds):[];
        let IR_CredsObj=IR_Creds.length>0?IR_Creds[0]:{};
        let Vis_IRCreds=IR_CredsObj.Visibility!=null && IR_CredsObj.Visibility.length>0?IR_CredsObj.Visibility[0]:{};
        setWindIRParams(Vis_IRCreds);
        
        getData(storeData1,menu1);
 
        const AppStateSubscription = AppState.addEventListener('change', (pro)=>{ _handleAppStateChange(pro)});
        const removeIRListener=DeviceEventEmitter.addListener('onIRImageUpload',(data)=>{ onIRImageUpload(data,storeData1,menu1)});
        const unsubscribe=props.navigation.addListener('beforeRemove', onBeforeRemove);

        
        return function cleanup() {
            IRLogin.deRegisterReceiver();
            AppStateSubscription.remove();
            removeIRListener.remove();   
            return unsubscribe;
        };
    }, []);



    const _handleAppStateChange = async (nextAppState) => {
        
        if(nextAppState =='background' && hasUnsavedChangesRef.current==true){
           
           let newData = {
               storeBGData:WindowDataRef.current,
               menuName:ScreenNameRef.current && ScreenNameRef.current.BgscreenName,
               StoreId1:StoreIdRef.current,
               BgMenuID: ScreenNameRef.current && ScreenNameRef.current.BgMenuId,
               bg_GbTempSessionId:GbTempSessionId.current,
               bg_WindowIRImages:WindowIRImages.current,
               visiteDate:d2
           }
           let WindowsStr= await JSON.stringify(newData)
           
           await set_item('storeData',WindowsStr); 
       }
     }



    // useEffect(() => {
    //     const unsubscribe=props.navigation.addListener('beforeRemove', onBeforeRemove);
    //     return unsubscribe;
    // }, [hasUnsavedChanges]);   

    
    // useEffect(() => {
    //     const unsubscribe=props.navigation.addListener('beforeRemove', onBeforeRemove);
    //     return unsubscribe;
    // }, [showCamera]); 

    // useEffect(() => {
    //     const unsubscribe=props.navigation.addListener('beforeRemove', onBeforeRemove);
    //     return unsubscribe;
    // }, [showQRCamera]); 
    
    
    function  onBeforeRemove(e){
        
        if(showCameraRef.current==true || showQRCameraRef.current==true ){
            e.preventDefault();
            UpdateShowCameraRef(false);
            UpdateShowQRCameraRef(false)
        }
        else if(Show_zoomImageRef.current==true || Show_zoomImageRef2.current==true){
            e.preventDefault();
            UpdateShow_zoomImageRef(false);
            UpdateShow_zoomImageRef2(false);
        }
        else{
            if (hasUnsavedChangesRef.current==true) {
                e.preventDefault(); // Prevent default behavior of leaving the screen
                onRemoveScreen(e);
            }
            else{
               return;
            }   
        }
    }

    function BgUnsavedChanges(val){
        hasUnsavedChangesRef.current=val
        setHasUnsavedChanges(val);
    }

    function BgWindowData(val){
        WindowDataRef.current=val
        setWindowData(val);
    }

    function UpdateShow_zoomImageRef(val){
        Show_zoomImageRef.current=val
        setShow_zoomImage(val);
    }

    function UpdateShow_zoomImageRef2(val){
        Show_zoomImageRef2.current=val
        setShow_zoomImage2(val);
    }


    function UpdateShowCameraRef(val){
        showCameraRef.current=val
        setShowCamera(val);
    }

    function UpdateShowQRCameraRef(val){
        showQRCameraRef.current=val
        setShowQRCamera(val);
    }


    async function onIRImageUpload(data,storeData1,menu1){
        console.log('onIRImageUpload on receive',data);
        let {message,sessionId,status}=data;
        let snum=sessionsReceived.current+1;
        let su_num=sessionsUploadedCount.current;
        console.log('onreceive data',data);
        sessionsReceived.current=snum;
        let thisIR_SessObjIndex=sessionsToUploadDetails.current.findIndex(i=>i.TEMP_SESSION_ID==sessionId);
        let thisIR_SessObj=sessionsToUploadDetails.current[thisIR_SessObjIndex];
        if(status!=null && status=='200' && sessionId!=null && sessionId!=''){
            
            let UnSessionId=await IRLogin.getDataIRSession(sessionId);
            if(UnSessionId!=null && UnSessionId!=''){
                sessionsUploadedCount.current=++su_num;
                let isUpdated=await UpdateIRUploadStatus(storeData1,menu1,sessionId,UnSessionId);
                let isUploaded=await LogImageUpload(storeData1,menu1,sessionId,UnSessionId,message,status,thisIR_SessObj);
                console.log("su_num:",su_num);
                if(isUploaded){
                    console.log('Image Uploaded');
                    notify("Images Log uploaded for session:"+sessionId);
                }
                else{
                    console.log('cannot Uploaded image');
                    notify("cannot upload log for session:"+sessionId);
                }

            }
            else{
                console.log('OnReceived UnSessionId get',UnSessionId);
                notify("Cannot upload images for session:"+sessionId+". Universal Id not found");
                let isUploaded=await LogImageUpload(storeData1,menu1,sessionId,"",message,status,thisIR_SessObj);
                if(isUploaded){
                    console.log('Image Uploaded');
                    notify("Images Log uploaded for session:"+sessionId);
                }
                else{
                    console.log('cannot Uploaded image');
                    notify("cannot upload log for session:"+sessionId);
                }

            }
            
        }
        else{
            console.log('Cannot get OnReceived UnSessionId');
            notify((message!=null && message!=""?message+". ":"")+"Cannot upload images for session:"+sessionId);
            let isUploaded=await LogImageUpload(storeData1,menu1,sessionId,"",message,status,thisIR_SessObj);
            if(isUploaded){
                console.log('Image Uploaded');
                notify("Images Log uploaded for session:"+sessionId);
            }
            else{
                console.log('cannot Uploaded image');
                notify("cannot upload log for session:"+sessionId);
            }
            
          
        }
        
        console.log("check snum and su_num:",snum,su_num,sessionsToUpload.current.length);
        // if last broadcast received either uploaded or not update the processing status to false
        if(snum==sessionsToUpload.current.length){
            setProcessing(false);
            console.log('Deregister event when last received');
            IRLogin.deRegisterReceiver();
        }

        // All IR Sessions with Images Uploaded : set DataUploaded Status to U (Fully Upload)
        if(su_num==sessionsToUpload.current.length){
            setisDataUploaded("U");
            setProcessing(false);
            notify("All IR images uploaded!");
            console.log('set all uploaded true to U');
        }
        // Some Of IR Sessions with Images Uploaded but some are yet pending : set DataUploaded Status to P (Partial Upload)
        else if(su_num>0 && su_num!=sessionsToUpload.current.length){
            // setProcessing(false);
            setisDataUploaded("P");
            notify("Some IR Images are still not uploaded!");
            console.log('set all uploaded true to P');
        }
    }

    function onRemoveScreen(e){     
        Alert.alert(
            "",
            ST.Doyoureallywanttoexitthescreen,
            [
              {
                text: ST.Cancel,
                onPress: () => {},
                style: "cancel"
              },
              { text: ST.OK, onPress: async () => {
                // setHasUnsavedChanges(false);
                BgUnsavedChanges(false)
                await clear_item('storeData')
                props.navigation.dispatch(e.data.action);} }
            ]
          );
    }
    

    function _OpenCaptureImage_Modal(img){
       
        const isImageCap=(img!='' || img!=null)?true:false;
        let {window,splitItem,splitItemIndex,cameraType}=reCapImgModalObj
        let camera2Label=(window && window.PromoImage2Lable) || '';
        return (
          <CustomModal 
            style={customStyle.PromoImgModal}
            title={currentMenu.MenuName}
            message={camera2Label}
            titleStyle={customStyle.PromoImgModal_title}
            messageStyle={customStyle.PromoImgModal_subtitle}
            showModal={showModal}
          >
            { 
            isImageCap && 
            <View style={customStyle.PromoImgModalCon}>
              <View style={customStyle.PromoImgModal_ImgWrap}>
             
                <Image  style={[customStyle.PromoImgModal_Img,(Platform.OS=='ios' ?customStyle.android_flipIMageView:{})]} source={{uri:SelectedImg}} />
              </View>
              <TouchableOpacity style={customStyle.PromoImgModal_CameraSmall} onPress={()=>{openCamera(window,splitItem,splitItemIndex,cameraType)}}>
                <MaterialCommunityIcons name='camera-retake' size={30} color={PageTheme.$primary_color}/>
              </TouchableOpacity>
              
              {!showImageSaveOp &&
                <TouchableOpacity style={customStyle.PromoImgModal_Cancel_btn} onPress={()=>{cancelImage(false)}}>
                
                  <Text style={customStyle.PromoImgModal_Cancel_btnText}>{ST.Close}</Text>
                </TouchableOpacity>
              }
            </View>
            }
          </CustomModal>
        )
      }
  

    async function getData(storeData1,menu1){        
        try {   
            let {StoreId,ChainId,StateId,StoreTypeId}=storeData1;
            
            let AllKPIFields=await getKPIFields(menu1);
            setKPIFields(AllKPIFields);

            let isSpecificMapIndex=AllKPIFields.findIndex(i=>i.KPIFieldName=='SpecificMapping')
            let isSpecificMapKPIObj=isSpecificMapIndex>=0?AllKPIFields[isSpecificMapIndex]:{};
            let isSpecificMappingEnable=isSpecificMapIndex>=0?isSpecificMapKPIObj['KPIFieldEnable']:false;

            
            let CameraIROnceOnlyIndex=AllKPIFields.findIndex(i=>i.KPIFieldName=='CameraIROnceOnly')
            let CameraIROnceOnlyObj=CameraIROnceOnlyIndex>=0?AllKPIFields[CameraIROnceOnlyIndex]:{};
            let CameraIROnceOnly=CameraIROnceOnlyIndex>=0?CameraIROnceOnlyObj['KPIFieldEnable']:true;
        
            let windData = await get_item('storeData');

            console.log('CameraIROnceOnly in PV IR Only;',CameraIROnceOnly);
            await db.transaction(async function (txn) { 
                // delete data for test purpose
                // await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_HDR_DATA} `,[],async function (txn2, txnres) { 
                //     console.log('window hdr data deleted');
                // },function (txnE,txnerr) { console.log(txnerr); },);
                // await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_CHILD_DATA} `,[],async function (txn2, txnres) { 
                //     console.log('window child data deleted');
                // },function (txnE,txnerr) { console.log(txnerr); },);
                // await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_IMAGES}`,[],async function (txn2, txnres) { 
                //     console.log('window images data deleted');
                // },function (txnE,txnerr) { console.log(txnerr); },);
                // await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_STOCK_DATA} `,[],async function (txn2, txnres) { 
                //     console.log('window stock data deleted');
                // },function (txnE,txnerr) { console.log(txnerr); },);

                // await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_IR_IMAGES} `,[],async function (txn2, txnres) { 
                //     console.log('window IR images data deleted');
                // },function (txnE,txnerr) { console.log(txnerr); },);

                // await txn.executeSql(`UPDATE ${AppTables.PAIDVIS_IRUPLOAD} set UPLOAD_STATUS='0' , SYNC_STATUS='' `,[],async function (txn2, txnres) { 
                //     console.log('window IR Status data deleted');
                // },function (txnE,txnerr) { console.log(txnerr); },);


                
                let q3=`Select VisibilityReasonId as ReasonId,VisibilityReason as Reason From Master_VisibilityReason WHERE MenuId='${menu1.MenuId}' `;
                await txn.executeSql(q3,[],async function (txn2, txnres2) { 
                    if(txnres2.rows.length>0){
                        let arr=[];
                        for(var i=0;i<txnres2.rows.length;i++){
                            let data =txnres2.rows.item(i);
                            arr.push(data);
                            if(i==txnres2.rows.length-1){
                                
                                setReasons_list(arr);
                            }                                
                        }
                    }
                },function (txnE,txnerr) { console.log(txnerr); },);

                // check if data exists
                let join4='',qIRSelect='';
                if(!CameraIROnceOnly){ // If IR enabled and IR camera is shown for each window
                    join4=`Left outer join ${AppTables.PAIDVIS_IRUPLOAD} u on  w.VisibilityDefinitionId=u.PVIS_DEFINITION_ID and w.VisibilityId=u.PVIS_ID and u.STORE_ID='${StoreId}' and u.MENU_ID='${menu1.MenuId}' and u.VISIT_DATE='${d2}' `
                    qIRSelect=` ,u.TEMP_SESSION_ID as TempSessionId,u.UN_SESSION_ID as UploadSessionId,u.UPLOAD_STATUS as UploadStatus,u.SYNC_STATUS as SyncStatus,u.SESSION_STORECODE as Sess_StoreCode,u.SESSION_TASKNAME as Sess_TaskName,u.SESSION_CATNAME as Sess_CatName,u.SESSION_PHOTOTYPE as Sess_PhotoType`;
                }
                let selectlist=`Distinct w.STORE_ID as StoreId,w.PVIS_HEADER_ID as PVisHeaderId,wd.VisibilityDefinitionId,w.MENU_ID as MenuId,wd.VisibilityId,wd.VisibilityName,wd.VisibilityTable,wd.VisibilityField,wd.VisibilityValue,wd.ChildName,wd.VisibilityRefImage,wd.VisibilityElementCheckAssortment,wd.VisibilityElementStockRequired,w.IS_PRESENT as IsPresent,wd.VisibilityNotExistCamera,w.PVIS_NA_IMAGE as PVisNAImage,wd.VisibilityExistReasonEnable,wd.VisibilityNotExistReasonEnable,w.REASON_ID as ReasonId,w.REASON as Reason,w.REMARK as Remark,wd.NoOfSplit,wd.VisibilityImage1,wd.VisibilityImage2,wd.VisibilityImage1Lable,wd.VisibilityImage2Lable,wd.VisibilityImage1CameraGrid,wd.VisibilityImage2CameraGrid,wd.StockQtyRequired ${qIRSelect}`;
                let join=` inner join Master_VisibilityDefinition wd on w.PVIS_DEFINITION_ID=wd.VisibilityDefinitionId `;
                let q=` Select ${selectlist} from ${AppTables.PAIDVIS_HDR_DATA} w  ${join} ${join4} where w.STORE_ID='${StoreId}' and w.MENU_ID='${menu1.MenuId}' `;

                // else pick data from masters
                let selectlist2=`Distinct s.StoreId,w.VisibilityDefinitionId,w.MenuId,w.VisibilityId,w.VisibilityName,w.VisibilityTable,w.VisibilityField,w.VisibilityValue,w.ChildName,w.VisibilityRefImage,w.VisibilityElementCheckAssortment,w.VisibilityElementStockRequired,'' as IsPresent,w.VisibilityNotExistCamera,'' as PVisNAImage,w.VisibilityExistReasonEnable,w.VisibilityNotExistReasonEnable,'' as ReasonId,'' as Reason,w.NoOfSplit,w.VisibilityImage1,w.VisibilityImage2,w.VisibilityImage1Lable,w.VisibilityImage2Lable,w.VisibilityImage1CameraGrid,w.VisibilityImage2CameraGrid,w.StockQtyRequired`;
                let join2=` inner join ${(isSpecificMappingEnable?'Mapping_StoreVisibilitySpecific':'Mapping_StoreVisibility')} s on w.VisibilityDefinitionId=s.VisibilityDefinitionId `;
                let q2=` Select ${selectlist2} from Master_VisibilityDefinition w  ${join2} where s.StoreId='${StoreId}' and w.MenuId='${menu1.MenuId}'  `;
            

                let storeBGData1=[],bgStoreJson={},isBGDataExists=false;
                if(windData!=null && windData!=''){
                    let StoreJson = await JSON.parse(windData)
                    let { storeBGData,menuName,StoreId1,BgMenuID,visiteDate,bg_WindowIRImages,bg_GbTempSessionId }= StoreJson
                    // Check if bg data exists for this Store and menu on today date
                    if(menuName == menu1.ScreenName && StoreId1== StoreId && menu1.MenuId==BgMenuID && visiteDate==d2){
                        isBGDataExists=true;

                        // Check if paid visibilities data exists in bg data
                        if(storeBGData.length>0){
                            storeBGData1=storeBGData;
                            bgStoreJson=StoreJson
                            // setWindowData(storeBGData);
                            BgWindowData(storeBGData);
                            BgUnsavedChanges(true);
                            console.log("set bg data");
                        }

                        // Check if IR Images and session present in bg data 
                        if(bg_GbTempSessionId!=null && bg_GbTempSessionId!='' && bg_WindowIRImages!=null && bg_WindowIRImages.length>0){
                            WindowIRImages.current=bg_WindowIRImages;
                            GbTempSessionId.current=bg_GbTempSessionId;
                        }
                    }
                }

                console.log("execute q");
                await txn.executeSql(q,[],async function (txn2, txnres2) { 
                    console.log('Paid Visi added count',txnres2.rows.length);
                    if(txnres2.rows.length>0){
                        let arr=[];let images=[],allWindowsData=[],inputChangeFlag=[];
                        let isfullyUploaded=true;
                        

                        for(var i=0;i<txnres2.rows.length;i++){
                            let data=txnres2.rows.item(i);
                            
                            if(storeBGData1.length>0){
                                let storeBgIndex=storeBGData1.findIndex(i=>i.VisibilityId==data.VisibilityId && i.VisibilityDefinitionId==data.VisibilityDefinitionId)
                                let storeBgObj=storeBgIndex>=0?storeBGData1[storeBgIndex]:{};

                                let bgisPresent=storeBgObj.isPresent=='1' || storeBgObj.isPresent==1?1:0;
                                let animatedChoice=new Animated.Value(bgisPresent);
                                data.animatedChoice=animatedChoice;
                            }else{
                                let animatedChoice=new Animated.Value((data.IsPresent=='1' || data.IsPresent==1?1:0));
                                data.animatedChoice=animatedChoice;
                            }
                            
                            data.NoOfSplit=parseInt(data.NoOfSplit);
                            
                            let NoOfSplit=data.NoOfSplit;
                            let isPresent=data.IsPresent=='1' || data.IsPresent==1?1:0;
                            let isStockReq=data.VisibilityElementStockRequired=='true' || data.VisibilityElementStockRequired==1?1:0;
                            
                            let imgObj={imgIndex:(i+1),url: data.VisibilityRefImage, props: {}}
                            let WindowSplits =  await getWindowSplits(NoOfSplit,data,storeData1,menu1);
                            let IRImages=[],zoomIRImages=[];
                            if(!isBGDataExists){ //perform action only if IRImages flag is enable for this KPI and if bg data does not exists
                                if(CameraIROnceOnly && i==0){// get IR images for all KPI at once if CameraIROnceOnly enabled
                                    let IRImgResObj=await getIRImages({},storeData1,menu1,"2");
                                    IRImages=IRImgResObj!=null && IRImgResObj["allImages"]!=null?IRImgResObj["allImages"]:[];
                                    zoomIRImages=IRImgResObj!=null && IRImgResObj["zoomIRImages"]!=null?IRImgResObj["zoomIRImages"]:[];
                                    // setWindowIRImages(IRImages);
                                    WindowIRImages.current=IRImages;
                                    setZoomImageUrl2(zoomIRImages);
                                    
                                }
                                else if(!CameraIROnceOnly){// get IR images for each window if CameraIROnceOnly is not enabled
                                    let IRImgResObj=await getIRImages(data,storeData1,menu1,"1");
                                    IRImages=IRImgResObj!=null && IRImgResObj["allImages"]!=null?IRImgResObj["allImages"]:[];
                                    zoomIRImages=IRImgResObj!=null && IRImgResObj["zoomIRImages"]!=null?IRImgResObj["zoomIRImages"]:[];
                                }
                            }
                            
                            let WQr =  await getWindowQuestions(data,storeData1,isPresent,menu1);
                            let WindowQuestions = WQr['WindowQuestions'] || [];
                            let WindowQA= WQr['WindowQA'] || {};
                            let WSd= isStockReq==true ? await getWindowStockData(data,storeData1,isPresent,AllKPIFields) : {'WStocks':[],'WStocksData':[]};
                            let WStocks=WSd['WStocks'] || [];
                            let WStocksData=WSd['WStocksData'] || [];
                            let isAllChecked=WSd['isAllChecked']!=null?WSd['isAllChecked']:0;

                            let isNAImageAvl=data.VisibilityNotExistCamera=='true' || data.VisibilityNotExistCamera==1?1:0;
                            let NAImage1=isNAImageAvl==1 && data.PVisNAImage!=null?data.PVisNAImage:'';
                            let NAImage1Path=NAImage1!=''?'file://'+ImageFolderPath+menu1.ScreenName+"/"+NAImage1:'';


                            let windowDataObj={'VisibilityId':data.VisibilityId,'VisibilityDefinitionId':data.VisibilityDefinitionId,'WindowSplits':WindowSplits,'WindowQA':WindowQA,'WStocksData':WStocksData,'NAImage1':NAImage1,'NAImage1Path':NAImage1Path,'ReasonId':data.ReasonId,'Reason':data.Reason,'isPresent':isPresent,'isAllSKUChecked':isAllChecked,'remark':(data.Remark!=null?data.Remark:'')};
                            if(!CameraIROnceOnly && !isBGDataExists){ // If IR enable and IR camera is shown for each window and if bg data does not exists
                                windowDataObj['IRImages']=IRImages;
                                windowDataObj['zoomIRImages'] =zoomIRImages;
                                windowDataObj['TempSessionId']=data.TempSessionId;
                                windowDataObj['Sess_StoreCode']=data.Sess_StoreCode;
                                windowDataObj['Sess_TaskName']=data.Sess_TaskName;
                                windowDataObj['Sess_CatName']=data.Sess_CatName;
                                windowDataObj['Sess_PhotoType']=data.Sess_PhotoType;

                                if(data.UploadStatus=='1' && isDataUploaded!='P' && isDataUploaded!='U'){
                                    console.log('cat hdr image upload success: P');
                                    // stop editing if any image is uploaded 
                                    setisDataUploaded("P");
                                }
    
                                if(data.UploadStatus!='1'){
                                    // check if any image is not uploaded then set uploaded status to U
                                    isfullyUploaded=false;
                                }
                                
                            }
                            
                            data['WindowQuestions']=WindowQuestions;
                            data['WindowStocks']=WStocks;
                            let changesFlag = {VisibilityId:data.VisibilityId, VisibilityDefinitionId: data.VisibilityDefinitionId, Flag:true}
                            inputChangeFlag.push(changesFlag)
                            arr.push(data);
                            
                            allWindowsData.push(windowDataObj);
                            images.push(imgObj);
                            if(i==txnres2.rows.length-1){
                                let { menuName,StoreId1,BgMenuID,visiteDate }=bgStoreJson
                                if(!isBGDataExists){
                                    // setWindowData(allWindowsData);
                                    BgWindowData(allWindowsData);
                                }

                                //set IR Images Upload Status if KPI IR flag is enabled
                                if(CameraIROnceOnly){ // Camera for each window is not enabled
                                    let isChecked=await getUploadIRStatus(storeData1,menu1);
                                }
                                else if(!CameraIROnceOnly && isfullyUploaded){ // Stop Upload and Editing both when fully uploaded, Case: if Camera for each window is enabled
                                    setisDataUploaded('U');
                                }
                                

                                setisDataExists(true);
                                setInputChange(inputChangeFlag)
                                setWindows(arr);
                                setGlobalWindows(arr);
                                setZoomImageUrl(images);
                                setProcessing(false);
                            }                                
                        }
                    }
                    else{
                        console.log('execute q2');
                        await txn.executeSql(q2,[],async function (txn2, txnres2) { 
                            console.log('Paid Visi load count',txnres2.rows.length);
                            if(txnres2.rows.length>0){
                                let arr=[],images=[],allWindowsData=[],inputChangeFlag=[];


                                for(var i=0;i<txnres2.rows.length;i++){
                                    let data=txnres2.rows.item(i);
                                    console.log('VisibilityRefImage:',data.VisibilityDefinitionId,data.VisibilityRefImage);

                                    if(storeBGData1.length>0){
                                        let storeBgIndex=storeBGData1.findIndex(i=>i.VisibilityId==data.VisibilityId && i.VisibilityDefinitionId==data.VisibilityDefinitionId)
                                        let storeBgObj=storeBgIndex>=0?storeBGData1[storeBgIndex]:{};
        
                                        let bgisPresent=storeBgObj.isPresent=='1' || storeBgObj.isPresent==1?1:0;
                                        let animatedChoice=new Animated.Value(bgisPresent);
                                        data.animatedChoice=animatedChoice;
                                    }else{
                                        let animatedChoice=new Animated.Value(0);
                                        data.animatedChoice=animatedChoice;
                                    }

                                    data.NoOfSplit=parseInt(data.NoOfSplit);
                                    let isStockReq=data.VisibilityElementStockRequired=='true' || data.VisibilityElementStockRequired==1?1:0;
                            
                                    let imgObj={imgIndex:(i+1),url: data.VisibilityRefImage, props: {}}
                                    let WindowSplits =  [];
                                    for(var s=0;s<data.NoOfSplit;s++){
                                        let obj={'Image1Name':'','Image1':'','Image2Name':'','Image2':'',img1Required:true, img2Required:true};
                                        WindowSplits.push(obj);
                                    }
                                    let WQr =  await getWindowQuestions(data,storeData1,false,menu1);
                                    let WindowQuestions = WQr['WindowQuestions'] || [];
                                    let WindowQA= WQr['WindowQA'] || {};
                                    let WSd= isStockReq==true ? await getWindowStockData(data,storeData1,false,AllKPIFields) : {'WStocks':[],'WStocksData':[]};
                            
                                    let WStocks=WSd['WStocks'] || [];
                                    let WStocksData=WSd['WStocksData'] || [];
                                    let isAllChecked=WSd['isAllChecked']!=null?WSd['isAllChecked']:0;

                                    let windowDataObj={'VisibilityId':data.VisibilityId,'VisibilityDefinitionId':data.VisibilityDefinitionId,'WindowSplits':WindowSplits,'WindowQA':WindowQA,'WStocksData':WStocksData,'isAllSKUChecked':isAllChecked};
                                    data['WindowQuestions']=WindowQuestions;
                                    data['WindowStocks']=WStocks;
                                    let changesFlag = {VisibilityId:data.VisibilityId, VisibilityDefinitionId: data.VisibilityDefinitionId, Flag:false}
                                    inputChangeFlag.push(changesFlag)
                                    arr.push(data);
                                    allWindowsData.push(windowDataObj);
                                    images.push(imgObj);
                                    if(i==txnres2.rows.length-1){
                                        if(!isBGDataExists) {
                                            // setWindowData(allWindowsData);
                                            BgWindowData(allWindowsData);
                                        }

                                        console.log("on load data end");
                                        setInputChange(inputChangeFlag)
                                        setWindows(arr);
                                        setGlobalWindows(arr);
                                        console.log("pv images on load",images);
                                        setZoomImageUrl(images);
                                        setProcessing(false);
                                    }                                
                                }
                            }
                            else{
                                setProcessing(false);
                            }
                        },function (txnE,txnerr) { console.log(txnerr);setProcessing(false); },);
                    }
                },function (txnE,txnerr) { console.log(txnerr);setProcessing(false); },);

            });          
        } catch (err) {
            
          console.log(err);          
        }        
    }

    async function getWindowSplits(NoOfSplit,window,storeData1,menu1){
        let WindowSplits_def=  [];
        for(var s=0;s<NoOfSplit;s++){
            let obj={'Image1Name':'','Image1':'','Image2Name':'','Image2':'',img1Required:true, img2Required:true};
            WindowSplits_def.push(obj);
        }
        return new Promise((resolve,reject)=>{
            
            db.transaction(async function (txn) {

                let q=`select * from ${AppTables.PAIDVIS_IMAGES} where PVIS_HEADER_ID='${window.PVisHeaderId}' and  STORE_ID='${storeData1.StoreId}' `;
               
                await txn.executeSql(q,[],async function (txn2, txnres2) { 
                   
                    if(txnres2.rows.length>0){
                        let arr=[];
                        for(var i=0;i<txnres2.rows.length;i++){
                            let data =txnres2.rows.item(i);
                            console.log(data.PVIS_HEADER_ID)
                            let isImage1=window.VisibilityImage1=='true' || window.VisibilityImage1==1?1:0;
                            let isImage2=window.VisibilityImage2=='true' || window.VisibilityImage2==1?1:0;

                            let Image1=isImage1==1 && data.IMAGE1!=null && data.IMAGE1!=''?'file://'+ImageFolderPath+menu1.ScreenName+"/"+data.IMAGE1:'';
                            let Image2=isImage2==1 && data.IMAGE2!=null && data.IMAGE2!=''?'file://'+ImageFolderPath+menu1.ScreenName+"/"+data.IMAGE2:'';
                            let obj={'Image1Name':data.IMAGE1,'Image1':Image1,'Image2Name':data.IMAGE2,'Image2':Image2};
                            arr.push(obj);

                            if(i==txnres2.rows.length-1){
                                resolve(arr)
                            }                                
                        }
                    }
                    else{
                        resolve(WindowSplits_def)
                    }
                },function (txnE,txnerr) { console.log(txnerr); resolve(WindowSplits_def) },);
            });  
        }).then((val)=>{
            return val
        }).catch((err)=>{
            console.log(err);
            return WindowSplits_def;
        });
    }

    async function getIRImages(window,storeData1,menu1,type="1"){
        let res={allImages:[],zoomIRImages:[]}

        return new Promise((resolve,reject)=>{
            
            db.transaction(async function (txn) {

                let q=`select IMAGE1 as Image1 from ${AppTables.PAIDVIS_IR_IMAGES} where STORE_ID='${storeData1.StoreId}' and MENU_ID='${menu1.MenuId}' and VISIT_DATE='${d2}'`;
                q+=type=='1'?` and PVIS_HEADER_ID='${window.PVisHeaderId}'`:'';
               
                await txn.executeSql(q,[],async function (txn2, txnres2) { 
                    console.log('get IRImages count ',txnres2.rows.length);
                    let arr=[],arr2=[];
                    if(txnres2.rows.length>0){
                        for(var i=0;i<txnres2.rows.length;i++){
                            let data =txnres2.rows.item(i);
                            let obj={'ImagePath':data.Image1};
                            arr.push(obj);

                            let imgObj={imgIndex:(i+1),url: data.Image1, props: {}}
                            arr2.push(imgObj);
                            if(i==txnres2.rows.length-1){
                                res['allImages']=arr
                                res['zoomIRImages']=arr2
                                resolve(res)
                            }                                
                        }
                    }
                    else{
                        resolve(res)
                    }
                },function (txnE,txnerr) { console.log(txnerr); resolve(res) },);
            });  
        }).then((val)=>{
            return val
        }).catch((err)=>{
            console.log(err);
            return res;
        });
    }

    async function getUploadIRStatus(storeData1,menu1){
        let allImages=[];
        let {StoreId} =storeData1;
        return new Promise((resolve,reject)=>{
            db.transaction(async function (txn) { 

                // For CameraIROnceOnly enabled condition only one TempSessionId will be genrated per KPI
                let q=` SELECT Distinct TEMP_SESSION_ID as TempSessionId,UN_SESSION_ID as UploadSessionId,UPLOAD_STATUS as UploadStatus,SYNC_STATUS as SyncStatus,SESSION_STORECODE as Sess_StoreCode,SESSION_TASKNAME as Sess_TaskName,SESSION_CATNAME as Sess_CatName,SESSION_PHOTOTYPE FROM ${AppTables.PAIDVIS_IRUPLOAD} where STORE_ID='${StoreId}' and MENU_ID='${menu1.MenuId}' and VISIT_DATE='${d2}'  `;
                await txn.executeSql(q,[],async function (txn2, txnres) { 
                    if(txnres.rows.length>0){
                        let isfullyUploaded=true;
                        //No Loop required, As For CameraIROnceOnly enabled condition only one TempSessionId will be genrated per KPI
                        let data =txnres.rows.item(0);
                        let {Sess_StoreCode,Sess_TaskName,Sess_CatName,Sess_PhotoType}=data;
                        if(data.UploadStatus=='1' && isDataUploaded!='P' && isDataUploaded!='U'){
                            console.log('getUploadIRStatus success: U');
                            // Stop Upload and Editing both when fully uploaded
                            setisDataUploaded("U");
                        }
                        // setGbTempSessionId(data.TempSessionId);
                        GbTempSessionId.current=data.TempSessionId;
                        let obj={Sess_StoreCode,Sess_TaskName,Sess_CatName,Sess_PhotoType};
                        GbTempSessionObj.current=obj;
                        resolve(true);
                    }
                    else{
                        resolve(true);
                    }
                },function (txnE,txnerr) { console.log(txnerr); resolve(false); },);
            });        
        }).catch((err)=>{
            return false;
        })
    }

    async function getWindowQuestions(window,storeData1,isInserted=false,menu1){
        let obj={'WindowQA':{},'WindowQuestions':[]}
        return new Promise((resolve,reject)=>{
            
            db.transaction(async function (txn) {
                var q='',selectlist='',join='',join2='';
                if(isInserted==true){
                    selectlist=` DISTINCT  q.QUESTION_ID as VisibilityQuestionId,q.QUESTION_CODE as VisibilityQuestionCode,wq.VisibilityQuestionName,wq.QuestionType,wq.VQShowCamera,wq.VQCameraMandatory,wq.VQLengthValidationRequired,wq.VQMinimumChar,wq.VQMaximumChar,wq.VQDecimalPoint,wq.VQDateRangeMin,wq.VQDateRangeMax,wq.VQVoiceLengthInMinutes,wq.VQDefaultQuestionEnable,q.ANSWER as Answer,q.ANSWER_ID as AnswerId,q.MULTI_OPTIONS_IDS as multi_op_ids,q.IMAGE_ALLOW1 as VAShowCamera,q.IMAGE1 as Image1  `;
                    join2=` inner join Mapping_VisibilityQuestion mq on mq.VisibilityQuestionId=wq.VisibilityQuestionId `;
                    join=` inner join Master_VisibilityQuestion wq on wq.VisibilityQuestionId=q.QUESTION_ID `;
                    q=`select ${selectlist} from ${AppTables.PAIDVIS_CHILD_DATA} q ${join} ${join2} where q.STORE_ID='${storeData1.StoreId}' and q.PVIS_DEFINITION_ID='${window.VisibilityDefinitionId}' and q.PVIS_ID='${window.VisibilityId}' order by wq.VisibilityQuestionSequence  `;
                }
                else{
                    selectlist=` DISTINCT  wq.VisibilityQuestionId,wq.VisibilityQuestionCode,wq.VisibilityQuestionName,wq.QuestionType,wq.VQShowCamera,wq.VQCameraMandatory,wq.VQLengthValidationRequired,wq.VQMinimumChar,wq.VQMaximumChar,wq.VQDecimalPoint,wq.VQDateRangeMin,wq.VQDateRangeMax,wq.VQVoiceLengthInMinutes,wq.VQDefaultQuestionEnable `;
                    join=` inner join Mapping_VisibilityQuestion mq on mq.VisibilityQuestionId=wq.VisibilityQuestionId `;
                    q=`select ${selectlist} from Master_VisibilityQuestion wq  ${join} where mq.VisibilityDefinitionId='${window.VisibilityDefinitionId}' order by wq.VisibilityQuestionSequence  `;
                }

              

                await txn.executeSql(q,[],async function (txn2, txnres2) { 
                    
                    if(txnres2.rows.length>0){
                        let arr=[];
                        let wqa_obj={};
                        for(var i=0;i<txnres2.rows.length;i++){
                            let data =txnres2.rows.item(i);
                            let answers=[];
                            data.VQDefaultQuestionEnable=data.VQDefaultQuestionEnable==1 || data.VQDefaultQuestionEnable=='true'?true:false;
                            // data['isDisabled']=!data.VQDefaultQuestionEnable;
                            if(isInserted){
                                data['isDisabled']=data.IsDisabled==1 || data.IsDisabled=="1"?true:false;
                            }
                            else{
                                data['isDisabled']=!data.VQDefaultQuestionEnable;
                            }
                              if(data.QuestionType=='Multi choice list' || data.QuestionType=='Single choice list' || data.QuestionType=='Rating'){
                                  answers=await getWindowAnswers(data);
                                  if(data.QuestionType=='Rating'){
                                      data.showRating=false;
                                  }
                              }
                              else if(data.QuestionType=='Date'){
                                  data.showDatePicker=false;
                              }
                              data['Answers']=answers;
      
                              let id_key=data.VisibilityQuestionId+'_AnswerId'; 
                              let ans_key=data.VisibilityQuestionId+'_Answer'; 
                              let multi_key=data.VisibilityQuestionId+'_MultiOption';
                              let date_key=data.VisibilityQuestionId+'_Date';
                              let img_key=data.VisibilityQuestionId+'_ImagePath1';
                              let imgname_key=data.VisibilityQuestionId+'_ImageName1';
                              let rating_key=data.VisibilityQuestionId+'_Rating'; 
                              
      
                              let showImageTag=(data.VQShowCamera=='true' || data.VQShowCamera==1) ;
      
                              console.log("qtn---4--",data.VisibilityQuestionId,data.AnswerId,data.Answer)
                              data.AnswerId!=null?wqa_obj[id_key]=data.AnswerId:'';
                              data.Answer!=null?wqa_obj[ans_key]=data.Answer:'';

                              
                              let selansid=data.AnswerId!=null?data.AnswerId:'';
                              if(data.QuestionType=='Multi choice list' && selansid!='' && data.multi_op_ids!=null){
                                  selansid=data.multi_op_ids?data.multi_op_ids.split(','):[];
                                  wqa_obj[multi_key]=data.multi_op_ids;
                              }
      
                              if((data.QuestionType=='Single choice list' || data.QuestionType=='Multi choice list' ) && selansid!='' && selansid!=null){
                                  if (data.Answers && data.Answers.length>0){
                                      for(var k=0;k<data.Answers.length;k++){
                                          let ansss=data.Answers[k];
                                          let isandImgAl=(ansss.VAShowCamera==1 || ansss.VAShowCamera=='true');
                                          if(data.QuestionType=='Single choice list' && (isandImgAl && ansss.AnswerId==selansid)){
                                              showImageTag=true;
                                          }
                                          else if(data.QuestionType=='Multi choice list' && (isandImgAl && selansid.indexOf(ansss.AnswerId)>=0)){
                                              showImageTag=true;
                                          }
                                      }
                                  }
                              }
      
                              if(showImageTag && data.Answer!=null){
                                  let imgPath=(Platform.OS=='ios'?'file://':'')+ImageFolderPath+menu1.ScreenName+"/"+data.Image1;
                                  wqa_obj[imgname_key]=data.Image1;
                                  wqa_obj[img_key]=imgPath;
                              }

                             
      
                              if(data.QuestionType=='Date' && data.Answer!=null){
                                  let dayonly=moment().format('DD');
                                  let actual_date=data.Answer?data.Answer.split('/'):[];
                                  let month=actual_date[0],year=actual_date[1];
                                  let fulldate=month+'/'+dayonly+'/'+year;
                                  wqa_obj[date_key]=fulldate;
                                  
                              }

                            arr.push(data);
                            if(i==txnres2.rows.length-1){
                                obj['WindowQuestions']=arr;
                                obj['WindowQA']=wqa_obj;
                                resolve(obj)
                            }                                
                        }
                    }
                    else{
                        resolve(obj)
                    }
                },function (txnE,txnerr) { console.log(txnerr); resolve(obj) },);
            });  
        }).then((val)=>{
            return val
        }).catch((err)=>{
            console.log(err);
            return obj;
        });
    }


    async function getWindowAnswers(qtn){
        
        return new Promise((resolve,reject)=>{
            
            db.transaction(async function (txn) {
                var q='',selectlist='';
                selectlist=` DISTINCT  VisibilityAnswerId as AnswerId,VisibilityAnswerName as Answer,VAShowCamera,VACameraMandatory,VAQuestionEnable,VAQuestionDisable `;
                q=`select ${selectlist} from  Master_VisibilityQuestion  where VisibilityQuestionId='${qtn.VisibilityQuestionId}'  order by VASequence  `;

                await txn.executeSql(q,[],async function (txn2, txnres2) { 
                    if(txnres2.rows.length>0){
                        let arr=[];
                        for(var i=0;i<txnres2.rows.length;i++){
                            let data =txnres2.rows.item(i);
                            arr.push(data);
                            if(i==txnres2.rows.length-1){
                                resolve(arr)
                            }                                
                        }
                    }
                    else{
                        resolve([])
                    }
                },function (txnE,txnerr) { console.log(txnerr); resolve([]) },);
            });  
        }).then((val)=>{
            return val
        }).catch((err)=>{
            console.log(err);
            return [];
        });
    }

    async function getWindowStockData(window,storeData1,isInserted=false,AllKPIFields=[]){
        let obj={'WStocks':[],'WStocksData':[],'isAllChecked':0}
        let {StateId,ChainId,StoreTypeId,StoreId}=storeData1;

        let isSpecificMapIndex=AllKPIFields.findIndex(i=>i.KPIFieldName=='SpecificMapping')
        let isSpecificMapKPIObj=isSpecificMapIndex>=0?AllKPIFields[isSpecificMapIndex]:{};
        let isSpecificMappingEnable=isSpecificMapIndex>=0?isSpecificMapKPIObj['KPIFieldEnable']:false;

        return new Promise((resolve,reject)=>{
            db.transaction(async function (txn) {
                let checkassrt=window.VisibilityElementCheckAssortment=='true' || window.VisibilityElementCheckAssortment==1?true:false;
                let join='',join2='',selectlist2='',q2='';
                if(checkassrt){
                    join=` inner join Mapping_ProductAssortmentStorewise a on a.ProductId=s.PVIS_STOCK_VALUE and a.StoreId='${StoreId}'`;
                }
                let selectlist1=`  s.PVIS_STOCK_DEFINITION_ID as VisibilityStockDefinitionId, s.PVIS_DEFINITION_ID as VisibilityDefinitionId,s.PVIS_STOCK_TABLE as VisibilityStockTable,s.PVIS_STOCK_FIELD as VisibilityStockField,s.PVIS_STOCK_VALUE as VisibilityStockValue,s.PVIS_STOCK_MBQ as VisibilityStockMBQ,s.PRODUCT_NAME as ProductName, s.STOCK as Stock,s.IS_PVIS_PRESENT as isPVisPresent `;
                let q=`select ${selectlist1} from  ${AppTables.PAIDVIS_STOCK_DATA} s ${join} where s.PVIS_DEFINITION_ID='${window.VisibilityDefinitionId}' and s.STORE_ID='${storeData1.StoreId}'  `;
               
                q+=` order by s.PRODUCT_NAME `;

                if(checkassrt){
                    join2=` inner join Mapping_ProductAssortmentStorewise a on a.ProductId=s.VisibilityStockValue and a.Storeid='${StoreId}'`;
                }

                if(isSpecificMappingEnable==true){
                    // StoreId,VisibilityDefinitionId,VisibilityTable,VisibilityField,VisibilityValue,ChildName
                    selectlist2=` '0' as VisibilityStockDefinitionId, s.VisibilityDefinitionId,s.VisibilityTable as VisibilityStockTable,s.VisibilityField as VisibilityStockField,s.VisibilityValue as VisibilityStockValue,'' as VisibilityStockMBQ,s.ChildName as ProductName `;
                    q2=`select ${selectlist2} from  Mapping_StoreVisibilitySpecific s ${join2} where s.VisibilityDefinitionId='${window.VisibilityDefinitionId}'  and s.StoreId='${StoreId}'  `;
                }else{
                    selectlist2=`  s.VisibilityStockDefinitionId, s.VisibilityDefinitionId,s.VisibilityStockTable,s.VisibilityStockField,s.VisibilityStockValue,s.VisibilityStockMBQ,s.ProductName `;
                    q2=`select ${selectlist2} from  Master_VisibilityStockDefinition s ${join2} where s.VisibilityDefinitionId='${window.VisibilityDefinitionId}' `;
                }
                
                
                // if(checkassrt){
                //     q2+=` and a.StateId='${storeData1.StateId}' `;
                // }
                if(isSpecificMappingEnable==true){
                    q2+=` order by s.ChildName `;
                }
                else{
                    q2+=` order by s.ProductName `;
                }

                
                
                await txn.executeSql(q,[],async function (txn2, txnres2) { 
                    console.log('Stock qty added:',txnres2.rows.length);
                    if(txnres2.rows.length>0){
                        let arr=[],WStocksData=[];
                        let isAllChecked=1;
                        for(var i=0;i<txnres2.rows.length;i++){
                            let data =txnres2.rows.item(i);
                            // use index for refId instead of VisibilityStockDefinitionId as the condition does not work in case of isSpecificMappingEnable is true ( because all VisibilityStockDefinitionId are 0) 
                            let refId='input1_'+data.VisibilityDefinitionId+"_"+i;
                            
                            inputRefs.current[refId]='';
                            if(isInserted==true && data.Stock!=null){
                                let stockData_obj={'ProductId':data.VisibilityStockValue,'Stock':data.Stock,'isPVisPresent':(data.isPVisPresent!=null ?data.isPVisPresent:0)}
                                WStocksData.push(stockData_obj);
                            }
                            if(data.isPVisPresent==null || data.isPVisPresent==0 || data.isPVisPresent=='0' || data.isPVisPresent==''){
                               
                                isAllChecked=0;
                            }
                            arr.push(data);
                            if(i==txnres2.rows.length-1){
                                obj['WStocks']=arr;
                                obj['WStocksData']=WStocksData;
                                obj['isAllChecked']=isAllChecked;
                                resolve(obj)
                            }                                
                        }
                    }
                    else{
                      
                        await txn.executeSql(q2,[],async function (txn2, txnres3) { 
                            console.log('Stock qty load:',txnres3.rows.length);
                            if(txnres3.rows.length>0){
                                let arr=[],WStocksData=[];
                                let isAllChecked=1;
                                for(var i=0;i<txnres3.rows.length;i++){
                                    let data =txnres3.rows.item(i);
                                    // let refId='input1_'+data.VisibilityDefinitionId+"_"+data.VisibilityStockDefinitionId;
                                    // use index for refId instead of VisibilityStockDefinitionId as the condition does not work in case of isSpecificMappingEnable is true ( because all VisibilityStockDefinitionId are 0) 
                                    let refId='input1_'+data.VisibilityDefinitionId+"_"+i;
                                    
                                    inputRefs.current[refId]='';
                                    if(isInserted==true && data.Stock!=null){
                                        let stockData_obj={'ProductId':data.VisibilityStockValue,'Stock':data.Stock,'isPVisPresent':(data.isPVisPresent!=null ?data.isPVisPresent:0)}
                                        WStocksData.push(stockData_obj);
                                    }
                                    if(data.isPVisPresent==null || data.isPVisPresent==0 || data.isPVisPresent=='0' || data.isPVisPresent==''){
                                       isAllChecked=0;
                                    }
                                    arr.push(data);
                                    if(i==txnres3.rows.length-1){
                                        obj['WStocks']=arr;
                                        obj['WStocksData']=WStocksData;
                                        obj['isAllChecked']=isAllChecked;
                                        resolve(obj)
                                    }                                
                                }
                            }
                            else{
                                resolve(obj);
                            }
                        },function (txnE,txnerr) { console.log(txnerr); resolve(obj) },);
                    }
                },function (txnE,txnerr) { console.log(txnerr); resolve(obj) },);
            });  
        }).then((val)=>{
            return val
        }).catch((err)=>{
            console.log(err);
            return obj;
        });
    }

    function openRetakeOp(wind, type='1',IRImgIndex,IRimgPath){
        let data={'wind':wind,'type':type,'IRImgIndex':IRImgIndex,'IRimgPath':IRimgPath};
        setretakeMData(data);
        setshowRetakeModal(true);
    }

    
    function closeRetakeOp(){
        setretakeMData({})
        setshowRetakeModal(false);
    }

    async function StartCameraSession(wind,type='1'){
        // type: 1 or 2 , 1: Camera enabled for each window header ,2 : Camera enabled for once in KPI
        let IR_Creds=props.IR_Creds!=null && props.IR_Creds!=""?JSON.parse(props.IR_Creds):[];
        let IR_CredsObj=IR_Creds.length>0?IR_Creds[0]:{};
        wind=wind!=null?wind:{};
        let newStdata=storeData;
        if(IR_CredsObj.UseStoreCode!=1){
            newStdata.StoreCode=newStdata.StoreId;
        }
        let obj={"StoreData":newStdata};
        
        // Option values for Perfetti paid visibility if IR shown in header only
        // obj["category_name"]="multi";
        // obj["task_name"]="paid-visibility-displays";
        // obj["photo_type"]="paid-visibility";
        let task_name=windIRParams.task_name+" "+currentMenu.MenuId;
        obj["category_name"]=windIRParams.category_name || '';
        obj["task_name"]=task_name;//'Generic Display';
        obj["photo_type"]=windIRParams.photo_type || '';

        let st1=JSON.stringify(obj);
        let TempSessionId= await IRLogin.StartIRSession(st1);
        console.log('TempSessionId StartCameraSession:',TempSessionId,newStdata.StoreCode,windIRParams);
        if(TempSessionId!=null){
            setLoaderTitle('Processing Image...');
            setProcessing(true);
            let IRCamImages=await IRLogin.getImageURIFromIRSession(TempSessionId);
            console.log('Images from session :',IRCamImages);

            if(type=='2'){ //set global IR images and session id if Camera is shown only once in header for KPI Screen
                // setGbTempSessionId(TempSessionId);
                GbTempSessionId.current=TempSessionId;
                let sessObj={}
                sessObj['Sess_StoreCode'] =newStdata.StoreCode;
                sessObj['Sess_TaskName'] =obj["task_name"];
                sessObj['Sess_CatName'] =obj["category_name"];
                sessObj['Sess_PhotoType'] =obj["photo_type"];
                // setSOSIRImages(IRCamImages);
                GbTempSessionObj.current=sessObj;
                WindowIRImages.current=IRCamImages;
                setIRZoomImages(IRCamImages);
            }
            else{ //set category wise IR images and session id if Camera is shown for each window
                let zoomIRImages=await getIRZoomImages(IRCamImages)

                let allData=WindowData;
                let defData={'VisibilityId':wind.VisibilityId,'VisibilityDefinitionId':wind.VisibilityDefinitionId};
                const win_index=allData.findIndex(i=>i.VisibilityId==wind.VisibilityId && i.VisibilityDefinitionId==wind.VisibilityDefinitionId);
                let windData=win_index>=0?(allData[win_index] || defData) : defData;
                windData['IRImages'] =IRCamImages;
                windData['zoomIRImages'] =zoomIRImages;
                windData['TempSessionId'] =TempSessionId;
                windData['Sess_StoreCode'] =newStdata.StoreCode;
                windData['Sess_TaskName'] =obj["task_name"];
                windData['Sess_CatName'] =obj["category_name"];
                windData['Sess_PhotoType'] =obj["photo_type"];
                win_index>=0?allData[win_index]=windData:allData.push(windData);
                // setWindowData(allData);
                BgWindowData(allData);
            }

            // setHasUnsavedChanges(true);
            BgUnsavedChanges(true);
            setrerenderdata(!rerenderdata);
            
            // stop image processing loader after all images get from sessionID
            setProcessing(false);
            setLoaderTitle('loading...');
            
        }
        else{
            notify('Cannot capture images as getting Session Null.');
        }
        
    }


    async function ResumeCameraSession(wind,type='1'){
        // type: 1 or 2 , 1: Camera enabled for each window header ,2 : Camera enabled for once in KPI
        wind=wind!=null?wind:{};
        let allData=WindowData;
        let defData={'VisibilityId':wind.VisibilityId,'VisibilityDefinitionId':wind.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==wind.VisibilityId && i.VisibilityDefinitionId==wind.VisibilityDefinitionId);
        let windData=win_index>=0?(allData[win_index] || defData) : defData;
        
        // Resume Temp Session Id
        let TempSessionId="";
        if(type=='2'){
            TempSessionId= GbTempSessionId.current;
        }
        else{
            TempSessionId= windData.TempSessionId;
        }
        console.log('TempSessionId of wind :',TempSessionId);
        if(TempSessionId!=null){
            setLoaderTitle('Processing Image...');
            setProcessing(true);
            let retTempSessionId=await IRLogin.ResumeIRSession(TempSessionId);
            console.log('retTempSessionId :',retTempSessionId);
            if(retTempSessionId!=null){
                // start fetching images after capturing photos

                let IRCamImages=await IRLogin.getImageURIFromIRSession(TempSessionId);
                console.log('Images from session :',IRCamImages);

                if(type=='2'){
                    // setWindowIRImages(IRCamImages);
                    WindowIRImages.current=IRCamImages
                    setIRZoomImages(IRCamImages);
                }
                else{
                    let zoomIRImages=await getIRZoomImages(IRCamImages)
                    windData['IRImages'] =IRCamImages;
                    windData['zoomIRImages'] =zoomIRImages;
                    win_index>=0?allData[win_index]=windData:allData.push(windData);
                    // setWindowData(allData);
                    BgWindowData(allData);
                }
                // setHasUnsavedChanges(true);
                BgUnsavedChanges(true);
                setrerenderdata(!rerenderdata);
                
                // stop image processing loader after all images get from sessionID
                setProcessing(false);
                setLoaderTitle('loading...');
            }
            else{
                notify('Cannot capture images as getting Session Null.');
            }
            
        }
        else{
            notify('Cannot capture images as getting Session Null.');
        }
        
    }

    async function DeleteIRPhoto(){
        console.log('DeleteIRPhoto called');
        setshowRetakeModal(false);
        let {wind,type,IRImgIndex,IRimgPath}= retakeMData;
        // type: 1 or 2 , 1: Camera enabled for each window header ,2 : Camera enabled for once in KPI
        
        wind=wind!=null?wind:{},
        type=type!=null?type:'1';
        IRImgIndex=IRImgIndex!=null?IRImgIndex:'';
        IRimgPath=IRimgPath!=null?IRimgPath:'';
        

        let allData=WindowData;
        let defData={'VisibilityId':wind.VisibilityId,'VisibilityDefinitionId':wind.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==wind.VisibilityId && i.VisibilityDefinitionId==wind.VisibilityDefinitionId);
        let windData=win_index>=0?(allData[win_index] || defData) : defData;
       
        let TempSessionId="";
        if(type=='2'){
            TempSessionId=GbTempSessionId.current;
        }
        else{
            TempSessionId=windData['TempSessionId'];
        }

        console.log('DeleteIRPhoto sessionID :',TempSessionId);
        if(TempSessionId!=null || TempSessionId!=''){
            setLoaderTitle('Removing Image...');
            setProcessing(true);
            let isDeleted= await IRLogin.DeleteIRSessionPhoto(TempSessionId,IRimgPath);//"8099b819-0979-40d2-950e-489566041484";//
            console.log('DeleteIRPhoto isDeleted :',isDeleted);
            if(isDeleted){
                setLoaderTitle('Processing Image...');
                
                let IRCamImages=await IRLogin.getImageURIFromIRSession(TempSessionId);
                console.log('Deleted, Images from session :',IRCamImages);
                if(type=='2'){
                    // setWindowIRImages(IRCamImages);
                    WindowIRImages.current=IRCamImages;
                    setIRZoomImages(IRCamImages);
                }
                else{
                    let zoomIRImages=await getIRZoomImages(IRCamImages)
                    windData['IRImages'] =IRCamImages;
                    windData['zoomIRImages'] =zoomIRImages;
                    win_index>=0?allData[win_index]=windData:allData.push(windData);
                    // setWindowData(allData);
                    BgWindowData(allData);
                }
                
                // setHasUnsavedChanges(true);
                BgUnsavedChanges(true);
                setrerenderdata(!rerenderdata);
                
                // stop image processing loader after all images get from sessionID
                setProcessing(false);
                setLoaderTitle('loading...');
                
            }
            else{
                notify('Cannot delete photo!.');
            }

        }
        else{
            notify('Cannot delete photo! Found Null Session.');
        }
        
    }

    async function RetakeIRPhoto(){
        setshowRetakeModal(false);
        let {wind,type,IRImgIndex,IRimgPath}= retakeMData;
        // type: 1 or 2 , 1: Camera enabled for each window header ,2 : Camera enabled for once in KPI
        
        wind=wind!=null?wind:{},
        type=type!=null?type:'1';
        IRImgIndex=IRImgIndex!=null?IRImgIndex:'';
        IRimgPath=IRimgPath!=null?IRimgPath:'';
        

        let allData=WindowData;
        let defData={'VisibilityId':wind.VisibilityId,'VisibilityDefinitionId':wind.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==wind.VisibilityId && i.VisibilityDefinitionId==wind.VisibilityDefinitionId);
        let windData=win_index>=0?(allData[win_index] || defData) : defData;
       
        let TempSessionId="";
        if(type=='2'){
            TempSessionId=GbTempSessionId.current;
        }
        else{
            TempSessionId=windData['TempSessionId'];
        }

        console.log('Retake sessionID :',TempSessionId);
        if(TempSessionId!=null || TempSessionId!=''){
            setLoaderTitle('Processing Image...');
            setProcessing(true);
            let isRetakeDone= await IRLogin.RetakeIRSessionPhoto(TempSessionId,IRimgPath);
            console.log('Retake isRetakeDone :',isRetakeDone);
            if(isRetakeDone){
                setTimeout(async ()=>{
                    let IRCamImages=await IRLogin.getImageURIFromIRSession(TempSessionId);
                    console.log('Retake Images from session :',IRCamImages);
                    if(type=='2'){
                        // setWindowIRImages(IRCamImages);
                        WindowIRImages.current=IRCamImages;
                        setIRZoomImages(IRCamImages);
                    }
                    else{
                        let zoomIRImages=await getIRZoomImages(IRCamImages)
                        windData['IRImages'] =IRCamImages;
                        windData['zoomIRImages'] =zoomIRImages;
                        win_index>=0?allData[win_index]=windData:allData.push(windData);
                        // setWindowData(allData);
                        BgWindowData(allData);
                    }
                    // setHasUnsavedChanges(true);
                    BgUnsavedChanges(true);
                    setrerenderdata(!rerenderdata);
                    
                    // stop image processing loader after all images get from sessionID
                    setProcessing(false);
                    setLoaderTitle('loading...');
                },1000);

            }
            else{
                notify('Error occur while retaking photo!.');
            }

        }
        else{
            notify('Cannot start camera! Found Null Session.');
        }
        
    }

    // Start Upload for IR images 
    async function UploadIRSessions(){
        setshowUploadAlert(false);
        sessionsToUpload.current=[];
        sessionsReceived.current=0;
        sessionsUploadedCount.current=0;
      
        try{
            let {StoreId}=storeData;
            setLoaderTitle('Uploading Images...');
            setProcessing(true);

            // Global Upload function
            // Sync Status for IR images
            // From Infilect SDK 1.3.6 - The Images are uploading on realtime bases i.e. As the images are clicked by user the Images are getting uploaded to infilect server.
            // In this case call below func to check the status of images that is already being uploaded by Real Time processing
            let sync_result=await SyncIRsessionsInKPI(props,storeData,AppTables.PAIDVIS_IRUPLOAD,AppTables.PAIDVIS_IR_IMAGES,true,currentMenu);
            let {isUploadStarted,AllDataUploaded,noDataFound,success,sessionList,sessionListWithDetails}=sync_result;
            console.log("Sync Resp sync_result:",sync_result);
            if(!success){
                notify('Cannot Upload Data! Something went wrong.');
                setProcessing(false);
            }
            else{
                if(noDataFound){
                    notify('No session to upload!');
                    setisDataUploaded('U');
                    setProcessing(false);
                }
                else{
                    if(!isUploadStarted && AllDataUploaded){
                        notify('All images synced! No session to upload.');
                        setisDataUploaded('U');
                        setProcessing(false);
                    }else if(isUploadStarted){
                        sessionsToUpload.current=sessionList;
                        sessionsToUploadDetails.current=sessionListWithDetails;
                        console.log("UploadStarted");
                    }
                }
            }
        }catch(e){
            console.log('Uploading Issue:',e);
            setProcessing(false);
        }
        
        
    }

    async function UpdateIRUploadStatus(storeData1,menu1,TempSessionId,UnSessionId){
        console.log('UpdateIRUploadStatus');
        return new Promise((resolve,reject)=>{

            let {StoreId,ChainId,StateId,StoreTypeId}=storeData1;
            db.transaction(async function (txn) {    
                // update upload status and sync status here : when files are uploaded and we have got the universal session id for that 
                let q=`Update ${AppTables.PAIDVIS_IRUPLOAD} set UN_SESSION_ID='${UnSessionId}',UPLOAD_STATUS='1',SYNC_STATUS='Synced' where STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and MENU_ID='${menu1.MenuId}' and TEMP_SESSION_ID='${TempSessionId}' `;
                // console.log("update IR Upload q:",q);
                await txn.executeSql(q,[],async function (txn2, txnres) { 
                    console.log('Updated IR Upload Status');
                    // console.log("update IR Upload q2:",q2);
                    let q2=`Update ${AppTables.PAIDVIS_IR_IMAGES} set UN_SESSION_ID='${UnSessionId}' where STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and MENU_ID='${menu1.MenuId}' and TEMP_SESSION_ID='${TempSessionId}' `;
                    await txn.executeSql(q2,[],async function (txn2, txnres2) { 
                        console.log('Updated IR Upload Images Status');
                        resolve(true);
                    },function (txnE,txnerr) { console.log(txnerr);resolve(false); },);
                    
                },function (txnE,txnerr) { console.log(txnerr);resolve(false); },);
            });  
        }).catch((Err)=>{
            console.log('Error in UpdateIRUploadStatus:',Err);
            return false;
        })
        
                    
        
    }

    async function LogImageUpload(storeData1,menu1,TempSessionId,UnSessionId,message,status,thisIR_SessObj={}){
        let {StoreId,StoreName}=storeData1;
        const url=props.baseurl+getMethodName(METHODS.UPLOADJSON_METHOD);
        const nowTime=moment().format('HH:mm:ss');
        let ImageCount=await getImageCount(storeData1,menu1,TempSessionId);
        let {SESSION_STORECODE,SESSION_TASKNAME,SESSION_CATNAME,SESSION_PHOTOTYPE}=thisIR_SessObj;


        ////Replaced special charecter and white space
        let storeTittle = StoreName.replace(`@!%&`, '').replace(' ', '-');
        console.log("storeTittle:",storeTittle,StoreName);

        let obj={};
        obj['StoreId']=StoreId;
        obj['Username']=props.UserId;
        obj['VisitDate']=d2;
        obj['InTime']=nowTime;
        obj['TempSessionId']=TempSessionId;
        obj['UnSessionId']=UnSessionId;
        obj['Status']=status;
        obj['Message']=message;
        obj['ImageCount']=ImageCount;
        obj['StoreTitle']=storeTittle;
        obj['StoreCode']=SESSION_STORECODE;
        obj['TaskName']=SESSION_TASKNAME;
        obj['CategoryName']=SESSION_CATNAME;
        obj['PhotoType']=SESSION_PHOTOTYPE;
        obj['KPIType']=currentMenu.MenuName;
        obj['ScreenName']=currentMenu.ScreenName;
        obj['UploadType']="New";
                                
        let postData={};
        postData['MID']=0;
        postData['Keys']='IR_UPLOAD_LOG_MSG';
        postData['JsonData']=JSON.stringify(obj);
        postData['UserId']=props.UserId;

        console.log('postData',postData);
        
        return await UploadData2(url,postData)
        .then((res)=>{
            // console.log("log Uploaded:",res.UploadJsonResult);
            if(res.UploadJsonResult!=null && res.UploadJsonResult=='Success'){
                return true;
            }
            return false;
        })
        .catch((err)=>{
            console.log(err);
            return false;
        });
    }

    async function getImageCount(storeData1,menu1,TempSessionId){
        let {StoreId,ChainId,StateId,StoreTypeId}=storeData1;
        console.log('storeData in getImageCount',storeData1);
        return new Promise((resolve,reject)=>{

            
            db.transaction(async function (txn) {    

                let q=`select DISTINCT TEMP_SESSION_ID,count(IMAGE1) as ImageCount from ${AppTables.PAIDVIS_IR_IMAGES}  where STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and TEMP_SESSION_ID='${TempSessionId}'  group by TEMP_SESSION_ID `;
                console.log('q',q);
                await txn.executeSql(q,[],async function (txn2, txnres) { 
                    console.log('ImageCount rows:',txnres.rows.length);
                    if(txnres.rows.length>0){
                        let data =txnres.rows.item(0);
                        console.log('data:',data)
                        console.log('Image Count for TempSessionId:',data.ImageCount);
                        resolve(data.ImageCount);
                    }
                    else{
                        resolve(0);
                    }
                    
                },function (txnE,txnerr) { console.log(txnerr);resolve(0); },);
            });  
        }).catch((Err)=>{
            console.log('Error in getImageCount:',Err);
            return 0;
        })
        
                    
        
    }
    

    async function focusToNext(WindowStocks,windowIndex,stockProd,index)
    {
        console.log('focusToNext is call');
        console.log('WindowStocks',index+1)
        
        if(index==WindowStocks.length-1){
            return;
        }
     
        try{
            // inputRefs.current['input1_'+data.VisibilityDefinitionId+"_"+data.VisibilityStockDefinitionId]='';
            // use (index+1) instead of WindowStocks[index+1].VisibilityStockDefinitionId as the condition does not work in case of isSpecificMappingEnable is true ( because all VisibilityStockDefinitionId are 0) 
            console.log('next 1 call','input1_'+WindowStocks[index+1].VisibilityDefinitionId+'_'+(index+1))
            let refIn2=inputRefs.current['input1_'+WindowStocks[index+1].VisibilityDefinitionId+'_'+(index+1)];
            // let refIn2=inputRefs.current['input1_'+stockProd.WindowDefinitionId+'_'+stockProd.WindowStockDefinitionId];
            
            if(refIn2!=null){
                refIn2.focus();
            }
        }
        catch(err){
            console.log(err);
        }
   }

   async function getImage(imgdata){
    let type=getImageProps.type || '';
    let window=getImageProps.window || {};
    let splitItem=getImageProps.splitItem || {};
    let splitItemIndex=getImageProps.splitItemIndex || 0;
    let qtn=getImageProps.qtn || {};
    let cameraType=getImageProps.cameraType!=null?getImageProps.cameraType:'1';

    if(typeof imgdata=='object' && imgdata.errorCode=='camera_unavailable'){
        notify(ST.Cameraunavailable);
    }
    else if(typeof imgdata =='object' && imgdata.uri!=null){
        const img=imgdata;
        const imgurl=img.uri, imgWidth=img.width, imgHeight=img.ExtendedHeight;
        let isImgFromGallery=img.fromGallery!=null?img.fromGallery:false;
        let picture_clickedd=isImgFromGallery==true?img.datetime:new Date();

          let picture_clicked_time=moment(picture_clickedd).format('MM-DD-YYYY HH:mm:ss')
          let picture_clicked_time_for_pic_name=moment(picture_clickedd).format('MMDDYYYY_HHmmss')

          console.log("time", picture_clicked_time);
      console.log("time1", picture_clicked_time_for_pic_name);
      let calculate_tym_date_for_filename = picture_clicked_time_for_pic_name;
      let calculate_tym_date_over_img = picture_clicked_time;

         let filename=storeData.StoreId+'_'+window.VisibilityDefinitionId+'_'+window.VisibilityId+'_'+(props.UserId || '')+'_STImg-'+calculate_tym_date_for_filename+'.jpg';
        
        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const wind_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId) ;
        let wind=wind_index>=0?allData[wind_index]:defData;

        let camera1Label=window.VisibilityImage1Lable || '';
        let camera2Label=window.VisibilityImage2Lable || '';
        let extraLabel='';

        if(cameraType=='2'){
            var QD=wind.WindowQA || {};
            var image_key=qtn.VisibilityQuestionId+'_ImageName1';
            var image_key_path=qtn.VisibilityQuestionId+'_ImagePath1';
            QD[image_key]=filename;
            extraLabel='Qtn Id: '+qtn.VisibilityQuestionId;
        }
        else if(cameraType=='3'){
            var image_key='NAImage1';
            var image_key_path='NAImage1Path';
            wind[image_key]=filename;
            extraLabel='Not Exist';
        }
        else{
            var WindowSplits=wind.WindowSplits || [];
            var image_key=type=='1'?'Image1Name':'Image2Name';
            var image_key_path=type=='1'?'Image1':'Image2';
            splitItem[image_key]=filename;
            extraLabel=type=='1'?camera1Label:camera2Label;
        }

        
        
        const mark_text1=calculate_tym_date_over_img;
        const mark_text2='Store Name:'+storeData.StoreName+' | Store Id:'+storeData.StoreId+' | User Id:'+storeData.EmpId+' | Visibility Id:'+window.VisibilityDefinitionId+(extraLabel!=''?' ('+extraLabel+')':'')+' | Image Type: '+currentMenu.MenuName+' | Date:'+calculate_tym_date_over_img;
       
        
        let imagePath=`${ImageFolderPath+currentMenu.ScreenName}/${filename}`;
        RNFS.copyFile(imgurl, imagePath)
        .then(async(resn) => {
            // render data with clicked image
            let uri='file://'+imagePath;
            console.log('image marker:',imgWidth,imgHeight,uri);
            
            if(cameraType=='2'){
                QD[image_key_path]=uri;
                wind.WindowQA=QD;
                wind_index>=0?allData[wind_index]=wind:allData.push(wind);
                WindowDataRef.current=allData
                setWindowData(allData);
                // setHasUnsavedChanges(true);
                BgUnsavedChanges(true)
                setrerenderdata3(!rerenderdata3);
            }
            else if(cameraType=='3'){
                wind[image_key_path]=uri;
                wind_index>=0?allData[wind_index]=wind:allData.push(wind);
                WindowDataRef.current=allData
                setWindowData(allData);
                // setHasUnsavedChanges(true);
                BgUnsavedChanges(true)
                setrerenderdata(!rerenderdata);
            }
            else{
                console.log('split image updated');
                splitItem[image_key_path]=uri;
                splitItemIndex>=0?WindowSplits[splitItemIndex]=splitItem:WindowSplits.push(splitItem);
                wind.WindowSplits=WindowSplits;
                wind_index>=0?allData[wind_index]=wind:allData.push(wind);
                WindowDataRef.current=allData
                setWindowData(allData);
                // setHasUnsavedChanges(true);
                BgUnsavedChanges(true)
                setrerenderdata2(!rerenderdata2);
            }
            
            let objIndex = InputChange.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
            let winArr=[...InputChange]
            winArr[objIndex].Flag=true
            setSelectedImg(uri)
            setInputChange(winArr)

            // add metdata then resize image and restored back to the imagePath
            let restore_data={"destFilePath":imagePath,"imgurl":imgurl,imgWidth,imgHeight,mark_text1,mark_text2}
            let is_restored=await restore_ImageWithMetaData(restore_data,imgdata);
            console.log("image restored:",is_restored);
            
        })
        .catch(err => {
            console.log('ERROR: image file write failed!!!');
            console.log(err.message, err.code);
        });   


        // Add MetaData
        // const viewShotRef=img.viewShotRef;
        // let ss_imgurl = await viewShotRef.current.capture();

        
        // resize file 
        // let resize_res=await resizeImage(ss_imgurl,imgWidth,imgHeight)
        
        
        // if(resize_res.success){
            // file resized now rename file
            
        // }
        // else{
        //     if(resize_res.error){
        //         notify("Error in image: ",resize_res.error);
        //     }else if (resize_res.imagenotfound){
        //         notify("Cannot find image!");
        //     }else{
        //         notify("Something went wrong while capturing image!");
        //     }
        // }                        
                     
    }   
      
}

  
    
    async function onQRScanned(imgdata){
        let qtn=QRqtnData.qtn || {};
        let window=QRqtnData.window || {};
        let QR_withValidChars=imgdata!=null && imgdata!=''?imgdata.replace(/["']/g,''):'';
        let value=QR_withValidChars;//imgdata && imgdata[0] && imgdata[0].displayValue ? imgdata[0].displayValue :""
        setTextValue(value,qtn,window)
    }


    function showQtnDatePicker(qtn,window,show=false){
        let allQtns=window.WindowQuestions || [];
        let newqtnIndex=allQtns.findIndex(q=>q.VisibilityQuestionId==qtn.VisibilityQuestionId);
       
        if(newqtnIndex>=0){
            let newqtn=allQtns[newqtnIndex];
            newqtn.showDatePicker=show;
            allQtns[newqtnIndex]=newqtn;
            window['WindowQuestions']=allQtns;
            let allWindows=Windows;
            const winIndex=allWindows.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId) || {};
            allWindows[winIndex]=window;
            setWindows(allWindows);
            setGlobalWindows(allwindows);
            if(show==true) setrerenderdata(!rerenderdata);
        }
    }
  
    async function openCamera(window,splitItem,splitItemIndex,type='1',cameraType='1',qtn={}){  
        let GridAllow = cameraType=='1' ?( type==='1' ? (window.VisibilityImage1CameraGrid === 'true' || window.VisibilityImage1CameraGrid==true): (window.VisibilityImage1CameraGrid === 'true' || window.VisibilityImage1CameraGrid==true)):false

        setGridValue(GridAllow);
        setGetImageProps({'window':window,'splitItem':splitItem,'splitItemIndex':splitItemIndex,'type':type,'cameraType':cameraType,'qtn':qtn}); 
        UpdateShowCameraRef(true);
        // props.navigation.navigate('CameraScreen',{'getImage':getImage,'cameraType':'back'})
    }
   
    async function onSubmitData(){
        let isvalid=await validate();
        if(isvalid){
            Keyboard.dismiss();
            setShowAlert(true);
        }
    }

    async function saveData(){
        // setHasUnsavedChanges(false);
        BgUnsavedChanges(false)
        setShowAlert(false);
        setLoaderTitle(ST.SavingData+'...');
        setProcessing(true);
        let d1n=new Date();
        let d3=moment(d1n).format('MM/DD/YYYY');
        try {   
            let {StoreId,ChainId,StateId,StoreTypeId}=storeData;

            let isSpecificMapIndex=KPIFields.findIndex(i=>i.KPIFieldName=='SpecificMapping')
            let isSpecificMapKPIObj=isSpecificMapIndex>=0?KPIFields[isSpecificMapIndex]:{};
            let isSpecificMappingEnable=isSpecificMapIndex>=0?isSpecificMapKPIObj['KPIFieldEnable']:false;
            

            let CameraIROnceOnlyIndex=KPIFields.findIndex(i=>i.KPIFieldName=='CameraIROnceOnly')
            let CameraIROnceOnlyObj=CameraIROnceOnlyIndex>=0?KPIFields[CameraIROnceOnlyIndex]:{};
            let CameraIROnceOnly=CameraIROnceOnlyIndex>=0?CameraIROnceOnlyObj['KPIFieldEnable']:true;
        
            
            //  remove old data
            let isDeleted = await removePreviousData();
            console.log("isDeleted:",isDeleted);
            
            await db.transaction(async function (txn) {   

                
              
                // add data
                var values='',childV='',imageV='',stockV='',IRImageV='',IRStatusV='';
              
                for (const wi in globalWindows){
                    const window=globalWindows[wi];
                    let isImage1=window.VisibilityImage1=='true' || window.VisibilityImage1==1?1:0;
                    let isImage2=window.VisibilityImage2=='true' || window.VisibilityImage2==1?1:0;
                    let isNAImageAvl=window.VisibilityNotExistCamera=='true' || window.VisibilityNotExistCamera==1?1:0;
                    let isNAReasonEnable=window.VisibilityNotExistReasonEnable=='true' || window.VisibilityNotExistReasonEnable==1? 1:0;
                    let isReasonEnable=window.VisibilityExistReasonEnable=='true' || window.VisibilityExistReasonEnable==1? 1:0;
                    let isStockReq=window.VisibilityElementStockRequired=='true' || window.VisibilityElementStockRequired==1?1:0;
                    let WindowQuestions=window.WindowQuestions || [];
                    let WindowStocks=window.WindowStocks || [];
    
                   
                    const wind=WindowData.find(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
                    let isPresent=wind.isPresent!=null && wind.isPresent!=''?wind.isPresent:'0';
                    let ReasonId=wind.ReasonId!=null?wind.ReasonId:0;
                    let Reason=wind.Reason!=null?wind.Reason:'';
                    let NAImage1=wind.NAImage1!=null?wind.NAImage1:'';
                    let NAImage1Path=wind.NAImage1Path!=null?wind.NAImage1Path:'';
                    let remark=wind.remark!=null?wind.remark:'';
                    let WindowSplits=wind.WindowSplits || [];
                    let QD=wind.WindowQA || {};
                    let WStocksData=wind.WStocksData || [];
                    let windIRImages=wind.IRImages!=null?wind.IRImages:[];
                    let TempSessionId=wind.TempSessionId!=null?wind.TempSessionId:'';
                    let Sess_StoreCode=wind.Sess_StoreCode!=null?wind.Sess_StoreCode:'';
                    let Sess_TaskName=wind.Sess_TaskName!=null?wind.Sess_TaskName:'';
                    let Sess_CatName=wind.Sess_CatName!=null?wind.Sess_CatName:'';
                    let Sess_PhotoType=wind.Sess_PhotoType!=null?wind.Sess_PhotoType:'';


                    let PVIS_HEADER_ID='WIND'+wi+(Math.floor(Math.random()*1000)+1);
                    let {VisibilityDefinitionId,MenuId,VisibilityId,VisibilityName,VisibilityTable,VisibilityField,VisibilityValue,ChildName}=window;
                    
                    // console.log('MenuId in savedata:',MenuId);
                    values+=values!=''?' , ':'';
                    values+=` ('${PVIS_HEADER_ID}','${MenuId}','${StoreId}','${d3}','${VisibilityDefinitionId}','${VisibilityId}','${VisibilityName}','${VisibilityTable}','${VisibilityField}','${VisibilityValue}','${ChildName}','${isPresent}','${NAImage1}','${ReasonId}','${Reason}','${(remark || '')}','1','${d3}','${isSpecificMappingEnable}') `;
                    
                    if(!CameraIROnceOnly){ // Add window wise IR Status and Images if IR enabled and IR Camera enabled for each window
                        
                        for(const IRImageIndex in windIRImages){
                            let IRImgObj=windIRImages[IRImageIndex];
                            let Image1=IRImgObj['ImagePath']!=null && IRImgObj['ImagePath']!=''?IRImgObj['ImagePath']:'';
                            
                            IRImageV+=IRImageV!=''?' , ':'';
                            // PVIS_HEADER_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,IMAGE1,IMAGE2,TEMP_SESSION_ID,UN_SESSION_ID,MENU_ID,ADDED_DATE
                            IRImageV+=` ('${PVIS_HEADER_ID}','${StoreId}','${d3}','${VisibilityDefinitionId}','${VisibilityId}','${Image1}','','${TempSessionId}','','${currentMenu.MenuId}','${d3}') `;
                        }


                        IRStatusV+=IRStatusV!=''?' , ':'';
                        IRStatusV+=` ('${PVIS_HEADER_ID}','${StoreId}','${d3}','${VisibilityDefinitionId}','${VisibilityId}','${TempSessionId}','','0','','${currentMenu.MenuId}','${Sess_StoreCode}','${Sess_TaskName}','${Sess_CatName}','${Sess_PhotoType}','${d3}') `;
                        
                    }
                }
              
                if(CameraIROnceOnly){// Add window wise IR images if IR enabled and IR Camera enabled for once only
                    for(const IRImageIndex in WindowIRImages.current){
                        let IRImgObj=WindowIRImages.current[IRImageIndex];
                        let Image1=IRImgObj['ImagePath']!=null && IRImgObj['ImagePath']!=''?IRImgObj['ImagePath']:'';
                        
                        IRImageV+=IRImageV!=''?' , ':'';
                        IRImageV+=` ('','${StoreId}','${d3}','','','${Image1}','','${GbTempSessionId.current}','','${currentMenu.MenuId}','${d3}') `;
                    }

                    let {Sess_StoreCode,Sess_TaskName,Sess_CatName,Sess_PhotoType}=GbTempSessionObj.current;
                    Sess_StoreCode=Sess_StoreCode || '';
                    Sess_TaskName=Sess_TaskName || '';
                    Sess_CatName=Sess_CatName || '';
                    Sess_PhotoType=Sess_PhotoType || '';
                    IRStatusV+=IRStatusV!=''?' , ':'';
                    IRStatusV+=` ('','${StoreId}','${d3}','','','${GbTempSessionId.current}','','0','','${currentMenu.MenuId}','${Sess_StoreCode}','${Sess_TaskName}','${Sess_CatName}','${Sess_PhotoType}','${d3}') `;
                    
                }
                
                let add_hdr_data=`INSERT INTO ${AppTables.PAIDVIS_HDR_DATA} (PVIS_HEADER_ID,MENU_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,PVIS_NAME,PVIS_TABLE,PVIS_FIELD,PVIS_VALUE,CHILD_NAME,IS_PRESENT,PVIS_NA_IMAGE,REASON_ID,REASON,REMARK,IS_UPDATED,ADDED_DATE, IS_STORE_SPECIFIC) VALUES ${values} `;
                let add_child_data=`INSERT INTO ${AppTables.PAIDVIS_CHILD_DATA} (PVIS_HEADER_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,QUESTION_ID,QUESTION_CODE,QUESTION_TYPE,ANSWER,ANSWER_ID,MULTI_OPTIONS_IDS,IMAGE1,IMAGE_ALLOW1,ADDED_DATE) VALUES ${childV} `;
                let add_images_data=`INSERT INTO ${AppTables.PAIDVIS_IMAGES} (PVIS_HEADER_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,IMAGE1,IMAGE2,ADDED_DATE) VALUES ${imageV} `;
                let add_stock_data=`INSERT INTO ${AppTables.PAIDVIS_STOCK_DATA} (PVIS_HEADER_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,PVIS_STOCK_DEFINITION_ID,PVIS_STOCK_TABLE,PVIS_STOCK_FIELD,PVIS_STOCK_VALUE,PVIS_STOCK_MBQ,PRODUCT_NAME,STOCK,IS_PVIS_PRESENT,ADDED_DATE) VALUES ${stockV} `;
                let add_IRImage_data=`INSERT INTO ${AppTables.PAIDVIS_IR_IMAGES} (PVIS_HEADER_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,IMAGE1,IMAGE2,TEMP_SESSION_ID,UN_SESSION_ID,MENU_ID,ADDED_DATE) VALUES ${IRImageV} `;
                let add_IRStatus_data=`INSERT INTO ${AppTables.PAIDVIS_IRUPLOAD} (PVIS_HEADER_ID,STORE_ID,VISIT_DATE,PVIS_DEFINITION_ID,PVIS_ID,TEMP_SESSION_ID,UN_SESSION_ID,UPLOAD_STATUS,SYNC_STATUS,MENU_ID,SESSION_STORECODE,SESSION_TASKNAME,SESSION_CATNAME,SESSION_PHOTOTYPE,ADDED_DATE) VALUES ${IRStatusV} `;
                
                
                
                await txn.executeSql(add_hdr_data,[],async function (txn2, txnres) { 
                    console.log('st header data added');
                    var isSplitImageAdded=true,isStockAdded=true,isChildAdded=true,isIRImageAdded=true,isIRStatusAdded=true;
                    if(imageV!=''){
                        isSplitImageAdded=await executeQuery(add_images_data);
                    }
                    if(stockV!=''){
                        isStockAdded=await executeQuery(add_stock_data);
                    }
                    if(childV!=''){
                        isChildAdded=await executeQuery(add_child_data);
                    }
                    if(IRImageV!=''){
                        isIRImageAdded=await executeQuery(add_IRImage_data);
                    }
                    if(IRStatusV!=''){
                        isIRStatusAdded=await executeQuery(add_IRStatus_data);
                    }
                    
                    if(!isSplitImageAdded){
                        setProcessing(false);notify('Cannot add paid visibility images');
                    }
                    else if(!isStockAdded){
                        setProcessing(false);notify('Cannot add paid visibility stock data');
                    }
                    else if(!isChildAdded){
                        setProcessing(false);notify('Cannot add paid visibility questions data');
                    }
                    else if(!isIRImageAdded){
                        setProcessing(false);notify('Cannot add paid visibility IR Images data');
                    }
                    else if(!isIRStatusAdded){
                        setProcessing(false);notify('Cannot add paid visibility IR Status data');
                    }
                    else{
                        setProcessing(false);notify('Paid visibility updated successfully');
                        setisDataExists(true);
                        // clear store data in local storage to avoiding re-set data for the store  
                        await clear_item('storeData')
                        BgUnsavedChanges(false);// when all data saved clear the unsaved changes flag 
                        props.navigation.goBack();// send back 
                    }

                       
                },function (txnE,txnerr) { console.log(txnerr);setProcessing(false);notify('Cannot add paid visibility data'); },);
            });          
        } catch (err) {
            console.log(err);          
        } 
    }

    async function removePreviousData(){
        let {StoreId,ChainId,StateId,StoreTypeId}=storeData;
        return new Promise((resolve,reject)=>{

            db.transaction(async function (txn) {   

                await txn.executeSql(`Select * FROM ${AppTables.PAIDVIS_HDR_DATA} WHERE STORE_ID='${StoreId}' and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `,[],async function (txn2, txnres) { 
                    if(txnres.rows.length>0){
                        let arr=[];
                        let isHdrDel=false,isQtnsDel=false,isImagesDel=false,isStockDel=false,isIRImageDel=false,isIRStatusDel=false;
                        for(let i=0;i<txnres.rows.length;i++){
                            let data=txnres.rows.item(i);
                            let {PVIS_HEADER_ID}=data;
                            arr.push(PVIS_HEADER_ID);
                            if(i==txnres.rows.length-1){
                                let AllHdrIds=`'${arr.join("','")}'`;

                                await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_HDR_DATA} WHERE STORE_ID='${StoreId}' and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `,[],async function (txn2, txnres) { 
                                    console.log('window hdr data deleted');
                                    isHdrDel=true;
                                    if(isHdrDel && isQtnsDel &&  isImagesDel && isStockDel && isIRImageDel && isIRStatusDel){
                                        resolve(true);
                                    }
                                },function (txnE,txnerr) { console.log(txnerr); },);
                                await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_CHILD_DATA} WHERE STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and PVIS_HEADER_ID in (${AllHdrIds}) `,[],async function (txn2, txnres) { 
                                    console.log('window child data deleted');
                                    isQtnsDel=true;
                                    if(isHdrDel && isQtnsDel &&  isImagesDel && isStockDel && isIRImageDel && isIRStatusDel){
                                        resolve(true);
                                    }
                                },function (txnE,txnerr) { console.log(txnerr); },);
                                await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_IMAGES} WHERE STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and PVIS_HEADER_ID in (${AllHdrIds}) `,[],async function (txn2, txnres) { 
                                    console.log('window images data deleted');
                                    isImagesDel=true;
                                    if(isHdrDel && isQtnsDel &&  isImagesDel && isStockDel && isIRImageDel && isIRStatusDel){
                                        resolve(true);
                                    }
                                },function (txnE,txnerr) { console.log(txnerr); },);
                                await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_STOCK_DATA} WHERE STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and PVIS_HEADER_ID in (${AllHdrIds}) `,[],async function (txn2, txnres) { 
                                    console.log('window stock data deleted');
                                    isStockDel=true;
                                    if(isHdrDel && isQtnsDel &&  isImagesDel && isStockDel && isIRImageDel && isIRStatusDel){
                                        resolve(true);
                                    }
                                },function (txnE,txnerr) { console.log(txnerr); },);

                                await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_IR_IMAGES} WHERE STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and MENU_ID='${currentMenu.MenuId}' `,[],async function (txn2, txnres) { 
                                    console.log('window IR images data deleted');
                                    isIRImageDel=true;
                                    if(isHdrDel && isQtnsDel &&  isImagesDel && isStockDel && isIRImageDel && isIRStatusDel){
                                        resolve(true);
                                    }
                                },function (txnE,txnerr) { console.log(txnerr); },);

                                await txn.executeSql(`DELETE FROM ${AppTables.PAIDVIS_IRUPLOAD} WHERE STORE_ID='${StoreId}' and VISIT_DATE='${d2}' and MENU_ID='${currentMenu.MenuId}' `,[],async function (txn2, txnres) { 
                                    console.log('window IR Status data deleted');
                                    isIRStatusDel=true;
                                    if(isHdrDel && isQtnsDel &&  isImagesDel && isStockDel && isIRImageDel && isIRStatusDel){
                                        resolve(true);
                                    }
                                },function (txnE,txnerr) { console.log(txnerr); },);

                            }
                        }
                    }
                    else{
                        resolve(true);
                    }
                },function (txnE,txnerr) { console.log(txnerr);resolve(false); },);

                
            });    

        }).then((val)=>{
            return val;
        }).catch((err)=>{
            console.log('error:',err);
            return false;
        })
    }

    async function executeQuery(q){
        return new Promise((resolve,reject)=>{
          db.transaction(async function (txn) { 
            await txn.executeSql(q,[],async function (txn2, txnres2) {           
              resolve(true);
            },function(Etxn,txnerr){console.log(txnerr);resolve(false) });
          }); 
        }).then((val)=>{
          return val;
        }).catch((err)=>{
            console.log(err);
          return false;
        })
    }

    async function validate(){
        let isValid=true;

        let isListedSKUIndex=KPIFields.findIndex(i=>i.KPIFieldName=='ListedSKUCheckbox');
        let isListedSKUKPIObj=isListedSKUIndex>=0?KPIFields[isListedSKUIndex]:{};
        let isListedSKUEnable=isListedSKUIndex>=0?isListedSKUKPIObj['KPIFieldEnable']:true;

        
        let CameraIROnceOnlyIndex=KPIFields.findIndex(i=>i.KPIFieldName=='CameraIROnceOnly')
        let CameraIROnceOnlyObj=CameraIROnceOnlyIndex>=0?KPIFields[CameraIROnceOnlyIndex]:{};
        let CameraIROnceOnly=CameraIROnceOnlyIndex>=0?CameraIROnceOnlyObj['KPIFieldEnable']:true;
        
       
        return new Promise((resolve,reject)=>{
                for (const wi in globalWindows){
                    const window=globalWindows[wi];
                    const wind=WindowData.find(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
                    let windIRImages=wind.IRImages!=null?wind.IRImages:[];
                    let TempSessionId=wind.TempSessionId!=null?wind.TempSessionId:"";


                    if(StoreCameraAllow && !CameraIROnceOnly && (windIRImages.length<=0 || TempSessionId=='') ){
                        notify(`Please click Images for ${window.VisibilityName}`,'SHORT');
                        resolve(false);return;
                    }
                    

                    if(wi==(Windows.length-1)){
                        if( StoreCameraAllow && CameraIROnceOnly && ( WindowIRImages.current.length<=0  || GbTempSessionId.current=='') ){
                            notify(`Please click Images for ${currentMenu.MenuName}`,'SHORT');
                            resolve(false);return;
                        }
                        else{
                            resolve(true);return;
                        }
                    }
                    
                }
            
            
        }).then((val)=>{return val})
        .catch((err)=>{console.log(err); return false});
    
    }


    function onselectionChange3(option,keyLbl,keyVal,otherData){
        
        let item=otherData.window;
        let allData=WindowData;
        let defData={'VisibilityId':item.VisibilityId,'VisibilityDefinitionId':item.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==item.VisibilityId && i.VisibilityDefinitionId==item.VisibilityDefinitionId);
        let wind=win_index>=0?(allData[win_index] || defData) : defData;
        wind[keyVal]=option.value;
        wind[keyLbl]=option.label;

        win_index>=0?allData[win_index]=wind:allData.push(wind);
        console.log('allData:',allData);
        let objIndex = InputChange.findIndex(i=>i.VisibilityId==item.VisibilityId && i.VisibilityDefinitionId==item.VisibilityDefinitionId);
        let winArr=[...InputChange]
        winArr[objIndex].Flag=true

        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function onselectionChange(option,qtn,window){
        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const wind_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let wind=wind_index>=0?allData[wind_index]:defData;
        let data=wind.WindowQA || {};
        let id_key=qtn.VisibilityQuestionId+'_AnswerId'; 
        let ans_key=qtn.VisibilityQuestionId+'_Answer'; 
        data[id_key]=option.value;
        data[ans_key]=option.label;
        

        wind['WindowQA']=data;
        wind_index>=0?allData[wind_index]=wind:allData.push(wind);
        let objIndex = InputChange.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let winArr=[...InputChange]
        winArr[objIndex].Flag=true
     
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData);

        let aq_ans=qtn.Answers!=null?qtn.Answers:[];
        let ans_obj=aq_ans.find(i=>i.AnswerId==option.value) || {};
        let EQtns=ans_obj.VAQuestionEnable!=null && ans_obj.VAQuestionEnable!=''?ans_obj.VAQuestionEnable.replace(' ','').split(','):[];
        let DQtns=ans_obj.VAQuestionDisable!=null && ans_obj.VAQuestionDisable!=''?ans_obj.VAQuestionDisable.replace(' ','').split(','):[];
      
        let sqtns=window.WindowQuestions || []

        // console.log("DQtns.length-----disableQtns",DQtns.length>0,EQtns.length>0)
        // console.log("DQtns.length-----1",EQtns,DQtns)

        if(EQtns.length>0){
            enableQtns(sqtns,EQtns,DQtns,data,wind,wind_index,allData,window)
        }
        else if(DQtns.length>0){
            disableQtns(sqtns,DQtns,data,wind,wind_index,allData,window)
        }
        else{
            // setHasUnsavedChanges(true);
            BgUnsavedChanges(true)
            setrerenderdata(!rerenderdata);
        }
       
    }

    async function disableQtns(sqtns,DQtns,data,wind={},wind_index=-1,allData=[],window={}){
       
        if(DQtns.length>0){
            new Promise.all(
                DQtns.map((qid,q_index)=>{
                    let s_qtnindex=sqtns.findIndex(i=>i.VisibilityQuestionId==qid) || {};
                    let s_qtn=sqtns[s_qtnindex];
                    if(s_qtn!=null){
                    s_qtn['isDisabled']=true
                    sqtns[s_qtnindex]=s_qtn;
                    let id_key=s_qtn.VisibilityQuestionId+'_AnswerId'; 
                    let ans_key=s_qtn.VisibilityQuestionId+'_Answer'; 
                    data[id_key]=0;
                    data[ans_key]='';

                    wind['WindowQA']=data;
                    wind_index>=0?allData[wind_index]=wind:allData.push(wind);
                    return false
                    }else{
                    return false
                    }
                })
            ).then(async (val)=>{

                let allwindows=Windows;
                let windowIndex=allwindows.findIndex(i=>i.VisibilityDefinitionId==window.VisibilityDefinitionId && i.VisibilityId==window.VisibilityId)
                if(windowIndex>=0){
                    window['WindowQuestions']=sqtns;
                    allwindows[windowIndex]=window;
                    // setWindowData(allData);
                    BgWindowData(allData);
                    setWindows(allwindows);
                    setGlobalWindows(allwindows);
                    // setHasUnsavedChanges(true);
                    BgUnsavedChanges(true)
                    setrerenderdata(!rerenderdata);
                }
                
            })
        }
    }

    async function enableQtns(sqtns,EQtns,DQtns,data,wind={},wind_index=-1,allData=[],window={}){
        new Promise.all(
            EQtns.map((qid,q_index)=>{
                let s_qtnindex=sqtns.findIndex(i=>i.VisibilityQuestionId==qid) || {};
                let s_qtn=sqtns[s_qtnindex];
                // console.log("DQtns.length-----1.1",s_qtn,sqtns,qid)
                if(s_qtn!=null){
                    s_qtn['isDisabled']=false
                    sqtns[s_qtnindex]=s_qtn;
                    return false
                }
                else{
                    return false
                }
            })
        ).then(async (val)=>{
            if(DQtns.length>0){
                await disableQtns(sqtns,DQtns,data,wind,wind_index,allData,window)
            }
            else{
                let allwindows=Windows;
                let windowIndex=allwindows.findIndex(i=>i.VisibilityDefinitionId==window.VisibilityDefinitionId && i.VisibilityId==window.VisibilityId)
                if(windowIndex>0){
                    window['WindowQuestions']=sqtns;
                    allwindows[windowIndex]=window;
                    setWindows(allwindows);
                    setGlobalWindows(allwindows);
                    // setHasUnsavedChanges(true);
                    BgUnsavedChanges(true)
                    setrerenderdata(!rerenderdata);
                }
            }
        })
    }

    async function setMultiSelectValue(selectedItems=[],qtn={},window={}) {  
        console.log('setMultiSelectValue',selectedItems);      
        let id_key=qtn.VisibilityQuestionId+'_AnswerId'; 
        let ans_key=qtn.VisibilityQuestionId+'_Answer'; 
        let multi_key=qtn.VisibilityQuestionId+'_MultiOption';
       
        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const wind_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let wind=wind_index>=0?allData[wind_index]:defData;
        let obj=wind.WindowQA || {};
        obj[id_key]=0;
        obj[multi_key]=selectedItems.join(',');
        let anss=[];
        selectedItems.map((itemValue)=>{
            let ans = qtn.Answers.find(c1 => c1.AnswerId == itemValue); 
            if(ans.Answer){anss.push(ans.Answer)}
        });
        obj[ans_key]=anss.join(',');
        console.log('obj:',obj);
        
        wind['WindowQA']=obj;
        wind_index>=0?allData[wind_index]=wind:allData.push(wind);

        let objIndex = InputChange.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let winArr=[...InputChange]
        winArr[objIndex].Flag=true
    
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function setTextValue(value,qtn,window) {        
        let id_key=qtn.VisibilityQuestionId+'_AnswerId'; 
        let ans_key=qtn.VisibilityQuestionId+'_Answer'; 

        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const wind_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let wind=wind_index>=0?allData[wind_index]:defData;
        let obj=wind.WindowQA || {};

        if(qtn.QuestionType=='Date' ){
            let date_key=qtn.VisibilityQuestionId+'_Date'; 
            let d=value!=null?new Date(value):new Date();
            let mfdate=moment(d).format('MM/YYYY');
            showQtnDatePicker(qtn,window,false);
            obj[id_key]=0;
            obj[ans_key]=mfdate;
            obj[date_key]=moment(d).format('MM/DD/YYYY');
        }
        else{
            obj[id_key]=0;
            obj[ans_key]=value;
        }
        
        console.log(value,obj);
        wind['WindowQA']=obj;
        wind_index>=0?allData[wind_index]=wind:allData.push(wind);

        let objIndex = InputChange.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let winArr=[...InputChange]
        winArr[objIndex].Flag=true
   
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function showQtnDatePicker(qtn,window,show=false){
        let allQtns=window.WindowQuestions || [];
        let newqtnIndex=allQtns.findIndex(q=>q.VisibilityQuestionId==qtn.VisibilityQuestionId);
       
        if(newqtnIndex>=0){
            let newqtn=allQtns[newqtnIndex];
            newqtn.showDatePicker=show;
            allQtns[newqtnIndex]=newqtn;
            window['WindowQuestions']=allQtns;
            let allWindows=Windows;
            const winIndex=allWindows.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId) || {};
            allWindows[winIndex]=window;
            setWindows(allWindows);
            setGlobalWindows(allwindows);
            if(show==true) setrerenderdata(!rerenderdata);
        }
    }

    function setRatingValue(data){
        setRatingOrder(data);
    }

    function onRatingCancel(){ 
        setShowRating(false);
    }

    function onRatingSave(){
        setShowRating(false);
        let qtn=RatingQtn;
        let window=RatingWindow;
        let id_key=qtn.VisibilityQuestionId+'_AnswerId'; 
        let ans_key=qtn.VisibilityQuestionId+'_Answer'; 
        let rating_key=qtn.VisibilityQuestionId+'_Rating'; 
        let ids=[],anss=[];
        RatingOrder.map((item,index)=>{
            ids.push(item.AnswerId);
            anss.push(item.Answer);
        })

        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const wind_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let wind=wind_index>=0?allData[wind_index]:defData;
        let obj=wind.WindowQA || {};

        obj[rating_key]=ids.join(',');
        obj[id_key]=0;
        obj[ans_key]=anss.join(',');
        
        wind['WindowQA']=obj;
        wind_index>=0?allData[wind_index]=wind:allData.push(wind);

        let objIndex = InputChange.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let winArr=[...InputChange]
        winArr[objIndex].Flag=true

        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }
    
   
    function onChoiceSelect(item,val,key,animatedChoice){
        let win_index=InputChange.find(i=>i.VisibilityId==item.VisibilityId && i.VisibilityDefinitionId==item.VisibilityDefinitionId)
        let changeValue=win_index.Flag;
     
        if(changeValue){
            setIsPresentClean(val)
            setDataCleanAnim(animatedChoice)
            setDataCleanItem(item)
            setDataCleanModal(true)
            return
        }
        
        var val1=0;
        val==1?val1=1:'';
        
        if(animatedChoice!=null){
            Animated.timing(animatedChoice, {
                toValue: val1,
                duration:400,
                useNativeDriver:false,
            }).start();
        }
        onWindowDataChange(item,val,key)
    }

    function onWindowDataChange(item,val,key){
        let allData=WindowData;
        let defData={'VisibilityId':item.VisibilityId,'VisibilityDefinitionId':item.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==item.VisibilityId && i.VisibilityDefinitionId==item.VisibilityDefinitionId);
        let wind=win_index>=0?(allData[win_index] || defData) : defData;
        wind[key]=val;

        if(key=='ReasonId'){
            let rsn=reasons_list.find(r=>r.ReasonId==val) || {};
            wind['Reason']=rsn.Reason || '';
        }

        win_index>=0?allData[win_index]=wind:allData.push(wind);
        
        if(key!="isPresent"){
            let objIndex = InputChange.findIndex(i=>i.VisibilityId==item.VisibilityId && i.VisibilityDefinitionId==item.VisibilityDefinitionId);
            let winArr=[...InputChange]
            winArr[objIndex].Flag=true
            setInputChange(winArr)
        }

        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    
    async function setWindowStockVal(val,window,stockProd,key,type=''){
        if(type=='numeric' && val!=''){
            const regex = new RegExp(/^\d+$/);
            let isNUmeric=regex.test(val);
            if(!isNUmeric){
                notify(ST.Pleaseenterwholenumbersonly,'SHORT');
                return;
            }
        }
        
        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let wind=win_index>=0?(allData[win_index] || defData) : defData;
        let WStocksData=wind['WStocksData'] || [];
        let sdIndex=WStocksData.findIndex(i=> i.ProductId==stockProd.VisibilityStockValue);
        let sd=sdIndex>=0?WStocksData[sdIndex]:{'ProductId':stockProd.VisibilityStockValue,'Stock':''};
        sd[key]=val;
        sdIndex>=0?WStocksData[sdIndex]=sd:WStocksData.push(sd);
        wind['WStocksData']=WStocksData;
        win_index>=0?allData[win_index]=wind:allData.push(wind);
        if(key=='isPVisPresent'){
            let isAllChecked = await verifyAllChecked(val,window,stockProd,key);
            wind['isAllSKUChecked']=isAllChecked;
        }
        
        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata4(!rerenderdata4);
    }

    async function onCatTextChange(window,key,val){
        let item=window;
        let allData=WindowData;
        let defData={'VisibilityId':item.VisibilityId,'VisibilityDefinitionId':item.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==item.VisibilityId && i.VisibilityDefinitionId==item.VisibilityDefinitionId);
        let wind=win_index>=0?(allData[win_index] || defData) : defData;
        wind[key]=val;

        win_index>=0?allData[win_index]=wind:allData.push(wind);

        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }


    async function verifyAllChecked(val,window,stockProd,key){
        return await new Promise((resolve,reject)=>{
            let WindowStocks=window.WindowStocks || [];
            let allData=WindowData;
            const win_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
            let wind=win_index>=0?(allData[win_index] || defData) : defData;
            let WStocksData=wind['WStocksData'] || [];
            if(WindowStocks.length>0){
                let isAllChecked=1;
                for(var i=0;i<WindowStocks.length;i++){
                    let stockProd=WindowStocks[i];
                    
                    let sdIndex1=WStocksData.findIndex(a=> a.ProductId==stockProd.VisibilityStockValue);
                    let sd1=sdIndex1>=0?WStocksData[sdIndex1]:{};
                    let isPVisPresent=sd1.isPVisPresent;
                    if(isPVisPresent==null || isPVisPresent=='' || isPVisPresent==0 || isPVisPresent=='0'){
                        isAllChecked=0
                    }

                    if(i==WindowStocks.length-1){
                        resolve(isAllChecked);
                    }
                }
            }
            else{
                resolve(0);
            }
            
        }).catch((err)=>{
            console.log(err);
            return 0;
        });
    }

    function onWindowDataClean(){
        if(DataCleanAnim!=null){
            // console.log("anim---")
            let anim=isPresentClean==1?1:'';
            Animated.timing(DataCleanAnim, {
                toValue:anim,
                duration:400,
                useNativeDriver:false,
            }).start();
        }
        let allData=WindowData;
        let WindowSplits =  [];
        for(var s=0;s<DataCleanItem.NoOfSplit;s++){
            let obj={'Image1Name':'','Image1':'','Image2Name':'','Image2':''};
            WindowSplits.push(obj);
        }

        // i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId
        let defData={'VisibilityId':DataCleanItem.VisibilityId,'VisibilityDefinitionId':DataCleanItem.VisibilityDefinitionId,'isAllSKUChecked':0,'WindowSplits':WindowSplits,'WindowQA':{},'WStocksData':[],isPresent:isPresentClean};
        const win_index=allData.findIndex(i=>i.VisibilityId==DataCleanItem.VisibilityId && i.VisibilityDefinitionId==DataCleanItem.VisibilityDefinitionId);
        allData[win_index]=defData

        let objIndex = InputChange.findIndex((obj => obj.VisibilityId == DataCleanItem.VisibilityId && obj.VisibilityDefinitionId==DataCleanItem.VisibilityDefinitionId));
        let winArr=[...InputChange]
        winArr[objIndex].Flag=false
  
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setDataCleanModal(false)
        setrerenderdata(!rerenderdata);
    }

    function checkAllSKUs(val,window){
        
        let WindowStocks=window.WindowStocks || [];
        let allData=WindowData;
        let defData={'VisibilityId':window.VisibilityId,'VisibilityDefinitionId':window.VisibilityDefinitionId};
        const win_index=allData.findIndex(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
        let wind=win_index>=0?(allData[win_index] || defData) : defData;
        let WStocksData=wind['WStocksData'] || [];
        console.log('WStocksData before:',WStocksData)
        for(var i=0;i<WindowStocks.length;i++){
            let stockProd=WindowStocks[i];
            
            let sdIndex=WStocksData.findIndex(a=> a.ProductId==stockProd.VisibilityStockValue);
            let sd=sdIndex>=0?WStocksData[sdIndex]:{'ProductId':stockProd.VisibilityStockValue,'Stock':''};
            let isPVisPresent=(val==1 || val=='1')?1:0;
            sd['isPVisPresent']=isPVisPresent;
            
            sdIndex>=0?(WStocksData[sdIndex]=sd):(WStocksData.push(sd));
        }

        
        wind['WStocksData']=WStocksData;
        wind['isAllSKUChecked']=val==1?1:0;
        console.log('wind updated');
        win_index>=0?allData[win_index]=wind:allData.push(wind);
        

        // setWindowData(allData);
        BgWindowData(allData);
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function onSaveCancel(){
        setShowAlert(false);
    }

  

    function setIRZoomImages(IRCamImages){
        let z_images=[];
        for(let ci in IRCamImages){
            let img=IRCamImages[ci];
            let img_obj={imgIndex:(ci+1),url: img.ImagePath, props: {}}
            
            z_images.push(img_obj);
            if(ci==IRCamImages.length-1){
                setZoomImageUrl2(z_images);
            }
        }
    }

    async function getIRZoomImages(IRCamImages){
        return new Promise((resolve,reject)=>{
            let z_images=[];
            for(let ci in IRCamImages){
                let img=IRCamImages[ci];
                let img_obj={imgIndex:(ci+1),url: img.ImagePath, props: {}}
                
                z_images.push(img_obj);
                if(ci==IRCamImages.length-1){
                    resolve(z_images)
                }
            }
        }).catch((err)=>{
            console.log(err);
            return [];
        })
    }

    function openImageRefView(windowIndex=0){
        setrefImageIndex(windowIndex);
        UpdateShow_zoomImageRef(true);
    }

    function openImageRefView2(ImageIndex=0,wind_index,Type='2'){
        if(Type=='1'){
            let wind=Windows[wind_index];
            const windDataIndex=WindowData.findIndex(i=>i.VisibilityId==wind.VisibilityId && i.VisibilityDefinitionId==wind.VisibilityDefinitionId) ;
            const windData=windDataIndex>=0?windData[windDataIndex]:{};
            let zoomIRImages=windData?.zoomIRImages!=null && windData?.zoomIRImages!=""? windData?.zoomIRImages:[];
            setZoomImageUrl2(zoomIRImages);
        }
        setrefImageIndex2(ImageIndex);
        UpdateShow_zoomImageRef2(true);
    }

    function FilterStores(searchedQry){
        searchedQry=searchedQry.toLowerCase();
        console.log('searchedQry',searchedQry);
        let arr=[];
        let newWindows=[];
        if(searchedQry!=null && searchedQry!=''){
            
            for(let i=0;i<globalWindows.length;i++){
                let item=globalWindows[i];
                let {VisibilityName}=item;
                if(VisibilityName.toLowerCase().includes(searchedQry)){
                    newWindows.push(item);
                }

                if(i==globalWindows.length-1){
                    arr=newWindows;
                }
            }
        }
        else{
          arr=globalWindows;
        }

        setWindows(arr);
        setrerenderdata(!rerenderdata)
        setrerenderdata2(!rerenderdata2)
    }

    function renderRatingView(){
        let qtn=RatingQtn;
        let Answers=qtn.Answers;
        let id_key=qtn.VisibilityQuestionId+'_AnswerId'; 
        let ans_key=qtn.VisibilityQuestionId+'_Answer'; 
        let rating_key=qtn.VisibilityQuestionId+'_Rating'; 
        
        let newarr=RatingOrder;
        if(RatingOrder.length<=0){
            newarr=Answers;
        }

        return (
        <View style={customStyle.RatingModal}>
            <View style={customStyle.RatingModalCon}>
                <Text style={customStyle.VRModalHeding}>{ST.DragItemsInOrder}</Text>
                <Text style={customStyle.VRSubHeding}>{ST.Pressandholdtodrag}</Text>
                <DraggableFlatList
                    data={newarr}
                    style={customStyle.RModal_list}
                    contentContainerStyle={customStyle.RModal_listInner}
                    onDragEnd={({ data }) =>{setRatingValue(data)}}
                    keyExtractor={(item) => item.AnswerId}
                    renderItem={renderItem}
                />
                <View style={customStyle.RModal_Btns}>
                    <TouchableOpacity style={customStyle.RModal_BtnCancel} onPress={()=>{onRatingCancel()}}>
                        <Text style={customStyle.RModal_BtnTextCancel}>{ST.Cancel}</Text>
                    </TouchableOpacity>
                    <TouchableOpacity style={customStyle.RModal_Btnsave} onPress={()=>{onRatingSave()}}>
                        <Text style={customStyle.RModal_BtnTextsave}>{ST.Save}</Text>
                    </TouchableOpacity>
                </View>
            </View>
        </View>
        )
    }

    function render_Picker(label_key,value_key,onChange=()=>{},selected_data={}){
        var data=[];
        let qtn=selected_data.qtn || {};
        let window=selected_data.window || {};
        let isQtnDisabled=qtn.isDisabled!=null || qtn.isDisabled!=''?false:true;
        let allAnswers=qtn.Answers || [];
        
        allAnswers.map((item,index)=>{
            let obj={ key: index, label: item[label_key],value:item[value_key] };
            if(selected_data.value==item[label_key])
                obj['component']= <View style={customStyle.addvis_selectedOpStyle}><Text style={customStyle.addvis_selectedOpTextStyle}>{item[label_key]}</Text></View>;
            data.push(obj);
        });
        
        return (
            <ModalSelector
            data={data}
            
            touchableActiveOpacity={0.8}
            
            style={customStyle.addVisPickerStyle}
            onChange={(option)=>{onChange(option,qtn,window) }}
            overlayStyle={customStyle.addVisPickerOverlay}
            cancelContainerStyle={customStyle.addVisPicker_OptionContainerStyle}
            optionStyle={customStyle.addvis_opStyle}
            optionTextStyle={customStyle.addvis_opTextStyle}
            optionContainerStyle={customStyle.addVisPicker_OptionContainerStyle}
            selectedKey={'1'}
            disabled={isQtnDisabled}
            >
            <Text style={[customStyle.WQPicker_InputStyle,(isQtnDisabled?customStyle.addVisPicker_Dis_InputStyle:{})]}>{(selected_data.value!=null && selected_data.value!=''?selected_data.value: '-'+ST.select+'-')}</Text>
            </ModalSelector>
        )
    }

    function renderDatePicker(qtn,window){
        let qtnn=qtn;
        let DateRange=qtn.DateRange;
        let maxDate=moment().add(10,'years').format('MM/DD/YYYY');
        let minDate=moment().subtract(10,'years').format('MM/DD/YYYY');
        if(DateRange=='RFD'){
            maxDate=moment().format('MM/DD/YYYY');
        }
        else if(DateRange=='RPD'){
            minDate=moment().format('MM/DD/YYYY');
        }
        
        return (
            <DateTimePicker
            testID="dateTimePicker"
            value={(dateValue!=null && dateValue!=''?new Date(dateValue):new Date())}
            mode={'date'}
            display="default"  
            onChange={(event, selectedDate)=>{setTextValue(selectedDate,qtnn,window)}}
            maximumDate={new Date(maxDate)}
            minimumDate={new Date(minDate)}
            />    
        );
    }

    async function OpenImgModal(imgPath,window,splitItem,splitItemIndex,cameraType){
        setSelectedImg(imgPath)
        setShowModal(true);
        if((imgPath!='' && imgPath!=null)){
            setShowImageSaveOp(false);
        }
        else{
            setShowImageSaveOp(true);
        }
        setReCapImgModalObj({window,splitItem,splitItemIndex,cameraType})
        // _OpenCaptureImage_Modal(imgPath,window,splitItem,splitItemIndex,cameraType)
        
      }

      function cancelImage(){
        // setImage1('');
        setSelectedImg('');
        setReCapImgModalObj({})
        setShowModal(false);
      }

      function _render_RetakePopup(){
        return (
          <CustomModal 
            style={customStyle.storelVisitM_Style}
            titleStyle={customStyle.storelVisitM_titleStyle}
            title={'If any image is blurred you can "Retake" or "Delete" the Image?'}
            showModal={showRetakeModal}
          >
            <View style={customStyle.IRretakeM_options}>
              <TouchableOpacity style={customStyle.IRretakeM_optionsBtn} onPress={()=>{RetakeIRPhoto()}}>
                <View style={customStyle.IRretakeM_optionsInn}>
                    <MaterialCommunityIcons name='camera-retake' size={20} color={PageTheme.$primary_color}/>    
                    <Text style={customStyle.IRretakeM_optionsBtnText}>Retake</Text>
                </View>
              </TouchableOpacity>
              <TouchableOpacity style={customStyle.IRretakeM_optionsBtn} onPress={()=>{DeleteIRPhoto()}}>
                <View style={customStyle.IRretakeM_optionsInn}>
                    <FontAwesome name='trash' size={20} color={PageTheme.$red}/>     
                    <Text style={customStyle.IRretakeM_optionsBtnText}>Delete</Text>
                </View>
              </TouchableOpacity>
              <TouchableOpacity style={customStyle.IRretakeM_optionsBtn} onPress={()=>{closeRetakeOp()}}>
                <View style={customStyle.IRretakeM_optionsInn}>
                    <Entypo name='cross' size={20} color={PageTheme.$red}/> 
                    <Text style={customStyle.IRretakeM_optionsBtnText}>Cancel</Text>
                </View>
              </TouchableOpacity>
             
            
              
            </View>
          </CustomModal>
        )
      }

      function _render_UploadAlert(){
        return (
          <CustomModal 
            style={customStyle.storelVisitM_Style}
            titleStyle={customStyle.storelVisitM_titleStyle}
            title={'Upload IR Images! You cannot edit after images uploaded to the server!'}
            showModal={showUploadAlert}
          >
            <View style={customStyle.storelVisitM_options}>
             <TouchableOpacity style={customStyle.storelVisitM_op_btn} onPress={()=>{setshowUploadAlert(false)}}>
                <Text style={customStyle.storelVisitM_op_btnText}>Cancel</Text>
              </TouchableOpacity>
              <TouchableOpacity style={customStyle.storelVisitM_op_btn} onPress={()=>{UploadIRSessions()}}>
                <Text style={customStyle.storelVisitM_op_btnText}>Yes</Text>
              </TouchableOpacity>
            </View>
          </CustomModal>
        )
    }

      function _renderIRCamera(wind,IRImages,TempSessionId,type='1',wind_index=''){
        
        let isSaveDisabled=(isDataUploaded=='U' || isDataUploaded=='P');
        let isResumeDisabled=(TempSessionId==null || TempSessionId=='' || TempSessionId=='undefined' || isSaveDisabled==true);
                
        return (
            <View style={(type=='2'?customStyle.IRCamOnceWrap:[customStyle.openStk_prd_borderT,customStyle.pt10])}>
                <View style={customStyle.SOSheadingsCon}>
                    <Text style={customStyle.SOSheadingsText}>{`Capture ${currentMenu.MenuName} Images`}</Text>
                </View>
                <View style={[customStyle.IRCamWrapper]}>
                    <View style={customStyle.IRCamImgWrap}>
                    { (IRImages!=null && IRImages.length>0) && 
                        IRImages.map((IRImg,IRImgIndex)=>{
                            let IRimgPath=IRImg.ImagePath;
                            return(
                                <TouchableOpacity style={customStyle.IRCamImageView} key={IRImgIndex} onPress={()=>{openImageRefView2(IRImgIndex,wind_index,type)}}>
                                    {(IRimgPath!=null && IRimgPath!='') && <Image style={customStyle.IRCamImage} source={{uri:IRimgPath}}/>}
                                    {(IRimgPath==null || IRimgPath=='') && <View style={customStyle.IRCamImage}></View>}
                                    <TouchableOpacity style={[customStyle.IRCamImage_OpBtn,isSaveDisabled?{backgroundColor:PageTheme.$text_color_light}:{}]} disabled={isSaveDisabled} onPress={()=>{openRetakeOp(wind,type,IRImgIndex,IRimgPath)}}>
                                        <MaterialCommunityIcons name='camera-retake' size={15} color={PageTheme.$accent_color}/>                                   
                                    </TouchableOpacity>
                                </TouchableOpacity>  
                            );
                        })
                                                        
                    } 
                    </View>     
                    <View style={[customStyle.IRCamCon,(type=='2'?customStyle.IRCamConBG:{})]}>
                        <TouchableOpacity style={[customStyle.IRCamBtns,customStyle.IRCamStartSess]} disabled={isSaveDisabled} onPress={()=>{StartCameraSession(wind,type)}}>   
                            <AntDesign name='play' size={30} color={(isSaveDisabled?PageTheme.$text_color_light:PageTheme.$primary_color)}/>
                            <Text style={[customStyle.IRCamBtnsText,(isSaveDisabled?{color:PageTheme.$text_color_light}:{})]}>Start Session</Text>
                        </TouchableOpacity> 
                        <TouchableOpacity style={[customStyle.IRCamBtns,customStyle.IRCamStartSess]} disabled={isResumeDisabled} onPress={()=>{ResumeCameraSession(wind,type)}} >   
                            <AntDesign name='pausecircle' size={30} color={(isResumeDisabled?PageTheme.$text_color_light:PageTheme.$primary_color)}/>
                            <Text style={[customStyle.IRCamBtnsText,(isResumeDisabled?{color:PageTheme.$text_color_light}:{})]}>Resume Session</Text>
                        </TouchableOpacity>   
                    </View>      
                </View>
            </View>
        )
      }

      function _renderIRCameraOnce(){
        
        let CameraIROnceOnlyIndex=KPIFields.findIndex(i=>i.KPIFieldName=='CameraIROnceOnly')
        let CameraIROnceOnlyObj=CameraIROnceOnlyIndex>=0?KPIFields[CameraIROnceOnlyIndex]:{};
        let CameraIROnceOnly=CameraIROnceOnlyIndex>=0?CameraIROnceOnlyObj['KPIFieldEnable']:true;

        if(CameraIROnceOnly){
            return _renderIRCamera({},WindowIRImages.current,GbTempSessionId.current,'2','');
        }
        else{
            return null;
        }
        
      }


      function _renderWindow(){
        let RemarkEnableIndex=KPIFields.findIndex(i=>i.KPIFieldName=='RemarkEnable')
        let RemarkEnableKPIObj=RemarkEnableIndex>=0?KPIFields[RemarkEnableIndex]:{};
        let RemarkEnable=RemarkEnableIndex>=0?RemarkEnableKPIObj['KPIFieldEnable']:false;

        let isListedSKUIndex=KPIFields.findIndex(i=>i.KPIFieldName=='ListedSKUCheckbox');
        let isListedSKUKPIObj=isListedSKUIndex>=0?KPIFields[isListedSKUIndex]:{};
        let isListedSKUEnable=isListedSKUIndex>=0?isListedSKUKPIObj['KPIFieldEnable']:true;
    
        let CameraIROnceOnlyIndex=KPIFields.findIndex(i=>i.KPIFieldName=='CameraIROnceOnly')
        let CameraIROnceOnlyObj=CameraIROnceOnlyIndex>=0?KPIFields[CameraIROnceOnlyIndex]:{};
        let CameraIROnceOnly=CameraIROnceOnlyIndex>=0?CameraIROnceOnlyObj['KPIFieldEnable']:true;
        
        
        return (
            <KeyboardAvoidingView  behavior="padding" enabled  >  
            
            <FlatList 
            data={Windows}
            extraData={rerenderdata}
            contentContainerStyle={customStyle.Win_scroll} 
            style={customStyle.Win_scrollO}
            initialNumToRender={5}
            listKey={(item, index) => `window_${index.toString()}`}
            ListHeaderComponent={_renderIRCameraOnce}
            renderItem={({item,index})=>{
                const window=item;
                const windowIndex=index;
                
                let PromoTitleEnable=window.PromoDefinitionTitleEnable=='true' || window.PromoDefinitionTitleEnable==1? 1:0;
                let PromoTitle=window.PromoDefinitionTitle!=null && window.PromoDefinitionTitle!='undefined'? window.PromoDefinitionTitle:"";
                
                const wind=WindowData.find(i=>i.VisibilityId==window.VisibilityId && i.VisibilityDefinitionId==window.VisibilityDefinitionId);
                let isPresent=wind.isPresent!=null && wind.isPresent!=''?wind.isPresent:'0';
                let windIRImages=wind.IRImages!=null?wind.IRImages:[];
                let TempSessionId=wind.TempSessionId!=null?wind.TempSessionId:"";
                // console.log('RefImage:',RefImage);
                

                // var xpos=isPresent=='1'||isPresent==1?-75:0;
                
                // if(window.animatedChoice!=null ){
                //     xpos=window.animatedChoice.interpolate({
                //         inputRange:[0,1],
                //         outputRange:[0,-75],
                //     });
                // }
                
                return(
                    <View style={customStyle.WItem_wrap} key={'window_'+index}>
                        <View style={customStyle.WItem_Hdr}>                            
                            <View style={customStyle.WItem_Hdrbg}>
                                <Text style={customStyle.WItem_HdrText}>{window.VisibilityName}</Text>
                                {
                                    window && window.ChildName !="" && <Text style={[customStyle.WItem_Hdrname2]}>{window.ChildName}</Text>
                                }
                                {(PromoTitleEnable==1 && PromoTitle!=null && PromoTitle!='') && <Text style={customStyle.WItem_HdrSubTitleText}>{PromoTitle}</Text>}
                                <TouchableOpacity style={customStyle.WItem_RefImgBtn} onPress={()=>{openImageRefView(index)}}>
                                    <Entypo name='image-inverted' size={24} color={PageTheme.$accent_color} />    
                                </TouchableOpacity>
                            </View>
                        </View>
                        
                        {!CameraIROnceOnly && 
                        <View style={customStyle.WForm}>
                            <View style={[customStyle.openStk_prd_cols,customStyle.mt10]}>
                                {_renderIRCamera(window,windIRImages,TempSessionId,'1',windowIndex)}
                            </View>
                        </View>}
                    </View>
                );
            }}
            />

            </KeyboardAvoidingView>
        )
      }

    function _renderHeader(currentIndex,ImagesArr){        
        return(
            <View style={customStyle.album_ZOOM_topBar}>
                <Text style={customStyle.album_ZOOM_indicator}>{`${(currentIndex+1)}/${ImagesArr.length}`}</Text>
                <TouchableOpacity style={customStyle.album_ZOOM_backBtn} onPress={()=>{UpdateShow_zoomImageRef(false); UpdateShow_zoomImageRef2(false);}}>
                    <Entypo name='chevron-left' color={'#fff'} size={24}/>
                </TouchableOpacity>            
            </View> 
        )
    }

    const onCancelClean = () =>{
        setDataCleanModal(false)
    }
    const onclear = () => {
        onWindowDataClean(DataCleanItem)
    }

    function _renderBtns(){
        
        let isUploadDisabled=isDataUploaded=='U';
        let isSaveDisabled=(isDataUploaded=='U' || isDataUploaded=='P');

        let colors1=(isUploadDisabled?[PageTheme.$tertiary_color,PageTheme.$tertiary_color]:[PageTheme.$secondary_color_light,PageTheme.$gradient2, PageTheme.$primary_color]);
        let colors2=(isSaveDisabled?[PageTheme.$tertiary_color,PageTheme.$tertiary_color]:[PageTheme.$secondary_color_light,PageTheme.$gradient2, PageTheme.$primary_color]);
        
        return (
            <View style={customStyle.opening_Stock_btnWrap}>
                <GradientButton {...props} title={'Save'} onPress={()=>{onSubmitData()}} /> 
            </View> 
               
        )
    }

  
    return ( 
      <Container {...props} pt={0} avoidSafeArea={(Platform.OS=='ios'?true:false)}>
        {processing && <CustomLoader fullHeight={true} title={loaderTitle}/>}
        <CustomHeader {...props} showaddstore={true}  title={currentMenu.MenuName} projectCode={`${storeData.StoreId}: ${storeData.StoreName}`}/> 
        {_OpenCaptureImage_Modal()} 
        {ConfirmSaveAlert(props,showAlert,onSaveCancel,saveData)}
        {ConfirmSaveAlert(props,DataCleanModal,onCancelClean,onclear,'Your data will be clean',)}
        {_render_RetakePopup()}   
        {_render_UploadAlert()}   
        
        <CustomCamera cameraType={'back'} QRCodeEnable={QREnable} onImageCaptured={(imgData)=>{UpdateShowQRCameraRef(false);onQRScanned(imgData)}} showCamera={showQRCamera} onHideCamera={()=>{UpdateShowQRCameraRef(false);}}/>   
        <CustomCamera cameraType={'back'} BottomText={'Store Name:'+storeData.StoreName+' | Store Id:'+storeData.StoreId+' | User Id:'+storeData.EmpId+' | Image Type: '+currentMenu.MenuName} gridEnable={GridValue} onImageCaptured={(imgData)=>{UpdateShowCameraRef(false);getImage(imgData)}} showCamera={showCamera} onHideCamera={()=>{UpdateShowCameraRef(false);}}/>   
        
        <LinearGradient colors={[PageTheme.$gradient1,PageTheme.$primary_color]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={[customStyle.roundScrollWrapper,customStyle.zIndex0]}>
        <View style={[customStyle.pageContentWrapper]}>
            <View style={customStyle.storel_searchbar}>
                <TextInput 
                    style={[customStyle.storel_searchInput]}
                    placeholder={ST.Searchby+' '+currentMenu.MenuName}
                    placeholderTextColor={PageTheme.$placeholder_color} 
                    value={searchedItem}
                    autoComplete='off'
                    onChangeText={(val)=>{setSearchedItem(val); FilterStores(val)}}
                />
                <TouchableOpacity style={customStyle.storel_searchBtn} onPress={()=>{FilterStores(searchedItem)}}>
                    <AntDesign style={customStyle.storel_searchBtnIcon} name='search1' size={20} color={PageTheme.$accent_color}/>
                </TouchableOpacity>
            </View>
            { Object.keys(storeData).length>0 && 
                _renderWindow()
            }
            {_renderBtns()}
        </View>    
        </LinearGradient> 
        {   showRating==true && 
            renderRatingView()
        }
       {show_zoomImage && 
        <View style={customStyle.album_ZOOM_wrap}>
            <ImageViewer ref={zoomView} style={customStyle.album_ZOOM} imageUrls={zoomImageUrl}  index={refImageIndex}
            renderHeader={(currentIndex)=>{return  _renderHeader(currentIndex,zoomImageUrl)}} renderIndicator={()=>null}
            />
        </View>        
        }  

        {show_zoomImage2 && 
        <View style={customStyle.album_ZOOM_wrap}>
            <ImageViewer ref={zoomView2} style={customStyle.album_ZOOM} imageUrls={zoomImageUrl2} index={refImageIndex2} 
            renderHeader={(currentIndex)=>{return  _renderHeader(currentIndex,zoomImageUrl2)}} renderIndicator={()=>null}
            />
        </View>        
        }
      </Container>   
    ); 
}
  

export default connect(mapStateToProps, mapDispatchToProps)(PaidVisibilityOneAppIR_Only);