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 { StatusBar, Image, TextInput, View, Text, ScrollView, TouchableOpacity, Platform, PermissionsAndroid, FlatList, Alert, Animated, AppState, DeviceEventEmitter, 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, restore_ImageWithMetaData, validateNumber } 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 { AntDesign, Entypo, FontAwesome, Fontisto, MaterialCommunityIcons } from '../components/icons';

import CustomLoader from '../components/CustomLoader';
import LinearGradient from 'react-native-linear-gradient';
import { AppTables } from '../constants/tableConstants';
import * as RNFS from 'react-native-fs';
import GradientButton from '../components/gradientButton';
import CustomModal from '../components/CustomModal';

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 CameraImg from '../assets/performics/camera_front_image.svg'
import MultiSelect from 'react-native-multiple-select';
import CheckBox from '@react-native-community/checkbox';
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 { METHODS, getMethodName } from '../constants/methodNames';
import { SyncIRsessionsInKPI } from '../constants/uploadData';


function WindowIR(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('loading...');
    const [isAdhocScreen, setIsAdhocScreen] = useState(false);
    const [storeData, setStoreData] = useState({});
    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 [refImageIndex, setrefImageIndex] = useState(0);
    const [refImageIndex2, setrefImageIndex2] = useState(0);
    const [showAlert, setShowAlert] = useState(false);
    const [zoomImageUrl, setZoomImageUrl] = useState([]);
    const [zoomImageUrl2, setZoomImageUrl2] = useState([]);
    const [showCamera, setShowCamera] = useState(false);
    const showCameraRef = useRef(false);
    const [getImageProps, setGetImageProps] = useState({});
    const zoomView = useRef(null);
    const zoomView2 = useRef(null);
    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 [KPIFields, setKPIFields] = useState([]);

    const [GridValue, setGridValue] = 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 hasUnsavedChangesRef = React.useRef(hasUnsavedChanges);
    const WindowDataRef = React.useRef(WindowData);
    const StoreIdRef = React.useRef(null);
    const ScreenNameRef = React.useRef('');
    const [StoreCameraAllow, setStoreCameraAllow] = useState(true);

    const inputRefs = useRef({});

    // IR states or refs
    const [isDataExists, setisDataExists] = useState(false);
    const [isDataUploaded, setisDataUploaded] = useState("N");
    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(() => {
        console.log("window IR page init")
        console.log("window IR page init")
        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;
        setIsAdhocScreen(isAdhoc);
        setStoreData(storeData1);
        setCurrentMenu(menu1);

        StoreIdRef.current = storeData1.StoreId
        ScreenNameRef.current = { BgscreenName: menu1.ScreenName, BgMenuId: menu1.MenuId }

        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 Wind_IRCreds = IR_CredsObj.Window != null && IR_CredsObj.Window.length > 0 ? IR_CredsObj.Window[0] : {};
        setWindIRParams(Wind_IRCreds);

        console.log("window IR page get data start")
        getData(storeData1, menu1);

        const AppStateSubscription = AppState.addEventListener('change', (pro) => { _handleAppStateChange(pro) });
        const removeIRListener = DeviceEventEmitter.addListener('onIRImageUpload', (data) => { onIRImageUpload(data, storeData1, menu1) });
        props.navigation.addListener('beforeRemove', onBeforeRemove);

        return function cleanup() {
            IRLogin.deRegisterReceiver();
            AppStateSubscription.remove();
            removeIRListener.remove();
            props.navigation.removeListener('beforeRemove', onBeforeRemove);
        };
    }, []);

    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(() => {
    //     props.navigation.removeListener('beforeRemove', onBeforeRemove);
    //     props.navigation.addListener('beforeRemove', onBeforeRemove);
    // }, [hasUnsavedChanges]); 

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

    function onBeforeRemove(e) {
        // console.log("onBeforeRemove:",showCameraRef.current,show_zoomImage,hasUnsavedChangesRef.current);
        if (showCameraRef.current == true) {
            e.preventDefault();
            UpdateShowCameraRef(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 UpdateShowCameraRef(val) {
        showCameraRef.current = val
        setShowCamera(val);
    }

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

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




    function BgWindowData(val) {
        WindowDataRef.current = val
        setWindowData(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(
            "",
            "Do you really want to exit the screen?",
            [
                {
                    text: "Cancel",
                    onPress: () => { },
                    style: "cancel"
                },
                {
                    text: "OK", onPress: async () => {
                        // setHasUnsavedChanges(false);
                        BgUnsavedChanges(false)
                        // await clear_item('storeData')
                        props.navigation.dispatch(e.data.action);
                    }
                }
            ]
        );
    }


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

            let AllKPIFields = await getKPIFields(menu1);
            setKPIFields(AllKPIFields);

            let isKPIIREnableI = AllKPIFields.findIndex(i => i.KPIFieldName == 'KPIIREnable')
            let isKPIIREnableObj = isKPIIREnableI >= 0 ? AllKPIFields[isKPIIREnableI] : {};
            let isKPIIREnable = isKPIIREnableI >= 0 ? isKPIIREnableObj['KPIFieldEnable'] : false;

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


            let storeBGData1 = [], bgStoreJson = {}, isBGDataExists = false;
            let windData = await get_item('storeData')
            if (windData != null && windData != '') {
                let StoreJson = await JSON.parse(windData)
                let { storeBGData, menuName, StoreId1, BgMenuID, visiteDate, bg_GbTempSessionId, bg_WindowIRImages } = 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;
                    }
                }
            }

            await db.transaction(async function (txn) {


                let q3 = `Select WindowReasonId as ReasonId,WindowReason as Reason From Master_WindowReason 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 (isKPIIREnable && !CameraIROnceOnly) { // If IR enabled and IR camera is shown for each window
                    join4 = `Left outer join ${AppTables.WINDOW_IRUPLOAD} u on  w.WindowDefinitionId=u.WINDOW_DEFINITION_ID and w.WindowId=u.WINDOW_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 = ` w.STORE_ID as StoreId,w.WINDOW_HEADER_ID as windowHeaderId,wd.WindowDefinitionId,wd.WindowId,wd.WindowName,wd.WindowTable,wd.WindowField,wd.WindowValue,wd.ChildName,wd.WindowRefImage,wd.WindowElementCheckAssortment,wd.WindowElementStockRequired,w.IS_PRESENT as IsPresent,wd.WindowNotExistCamera,w.WINDOW_NA_IMAGE as WindowNAImage,wd.WindowExistReasonEnable,wd.WindowNotExistReasonEnable,w.REASON_ID as ReasonId,w.REASON as Reason,wd.NoOfSplit,wd.WindowImage1,wd.WindowImage2,wd.WindowImage1Lable,wd.WindowImage2Lable,wd.WindowImage1CameraGrid,wd.WindowImage2CameraGrid,wd.StockQtyRequired ${qIRSelect}`;
                let join = ` inner join Master_WindowDefinition wd on w.WINDOW_DEFINITION_ID=wd.WindowDefinitionId `;
                let q = ` Select ${selectlist} from ${AppTables.WINDOW_HDR_DATA} w  ${join} ${join4} where w.STORE_ID='${StoreId}' and w.MENU_ID='${menu1.MenuId}'    `;

                // else pick data from masters
                let selectlist2 = ` s.StoreId,w.WindowDefinitionId,w.WindowId,w.WindowName,w.WindowTable,w.WindowField,w.WindowValue,w.ChildName,w.WindowRefImage,w.WindowElementCheckAssortment,w.WindowElementStockRequired,'' as IsPresent,w.WindowNotExistCamera,'' as WindowNAImage,w.WindowExistReasonEnable,w.WindowNotExistReasonEnable,'' as ReasonId,'' as Reason,w.NoOfSplit,w.WindowImage1,w.WindowImage2,w.WindowImage1Lable,w.WindowImage2Lable,w.WindowImage1CameraGrid,w.WindowImage2CameraGrid,w.StockQtyRequired`;
                let join2 = ` inner join Mapping_StoreWindow s on w.WindowDefinitionId=s.WindowDefinitionId  `;
                let q2 = ` Select ${selectlist2} from Master_WindowDefinition w  ${join2} where s.StoreId='${StoreId}' and w.MenuId='${menu1.MenuId}'  `;


                let allWindowsData = [], inputChangeFlag = [];

                await txn.executeSql(q, [], async function (txn2, txnres2) {
                    console.log("added count:", txnres2.rows.length);
                    if (txnres2.rows.length > 0) {
                        let arr = []; let images = [];



                        for (var i = 0; i < txnres2.rows.length; i++) {
                            let data = txnres2.rows.item(i);
                            let isPresent = data.IsPresent == '1' || data.IsPresent == 1 ? 1 : 0;
                            if (isBGDataExists) {
                                let storeBgIndex = storeBGData1.findIndex(i => i.WindowId == data.WindowId && i.WindowDefinitionId == data.WindowDefinitionId)
                                let storeBgObj = storeBgIndex >= 0 ? storeBGData1[storeBgIndex] : {};
                                isPresent = storeBgObj.isPresent == '1' || storeBgObj.isPresent == 1 ? 1 : 0;
                            }

                            let animatedChoice = new Animated.Value(isPresent);
                            data.animatedChoice = animatedChoice;
                            data.NoOfSplit = parseInt(data.NoOfSplit);

                            let NoOfSplit = data.NoOfSplit;

                            let isStockReq = data.WindowElementStockRequired == 'true' || data.WindowElementStockRequired == 1 ? 1 : 0;
                            let imgObj = { imgIndex: (i + 1), url: data.WindowRefImage, props: {} }
                            images.push(imgObj);

                            let WindowSplits = await getWindowSplits(NoOfSplit, data, storeData1, menu1);
                            let IRImages = [], IRImages1 = [], zoomIRImages = [], zoomIRImages1 = [];
                            if (isKPIIREnable && !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");
                                    IRImages1 = IRImgResObj != null && IRImgResObj["allImages"] != null ? IRImgResObj["allImages"] : [];
                                    zoomIRImages1 = IRImgResObj != null && IRImgResObj["zoomIRImages"] != null ? IRImgResObj["zoomIRImages"] : [];
                                    // setWindowIRImages(IRImages);
                                    WindowIRImages.current = IRImages1;
                                    setZoomImageUrl2(zoomIRImages1);
                                }
                                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, menu1) : { 'WStocks': [], 'WStocksData': [] };
                            let WStocks = WSd['WStocks'] || [];
                            let WStocksData = WSd['WStocksData'] || [];
                            let isAllChecked = WSd['isAllChecked'] != null ? WSd['isAllChecked'] : 0;

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


                            let windowDataObj = { 'WindowId': data.WindowId, 'WindowDefinitionId': data.WindowDefinitionId, 'WindowSplits': WindowSplits, 'WindowQA': WindowQA, 'WStocksData': WStocksData, 'NAImage1': NAImage1, 'NAImage1Path': NAImage1Path, 'ReasonId': data.ReasonId, 'Reason': data.Reason, 'isPresent': isPresent, 'isAllSKUChecked': isAllChecked };
                            if (isKPIIREnable && !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 = { WindowId: data.WindowId, WindowDefinitionId: data.WindowDefinitionId, Flag: true }
                            inputChangeFlag.push(changesFlag)

                            arr.push(data);

                            allWindowsData.push(windowDataObj);
                            if (i == txnres2.rows.length - 1) {
                                let { menuName, StoreId1, BgMenuID } = bgStoreJson
                                if (!isBGDataExists) {
                                    // setWindowData(allWindowsData);
                                    BgWindowData(allWindowsData);
                                }

                                if (isKPIIREnable) {// 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);
                                setZoomImageUrl(images);
                                setProcessing(false);
                            }
                        }
                    }
                    else {
                        await txn.executeSql(q2, [], async function (txn2, txnres2) {
                            console.log("load count:", txnres2.rows.length);
                            if (txnres2.rows.length > 0) {
                                let arr = [], images = [];

                                for (var i = 0; i < txnres2.rows.length; i++) {
                                    let data = txnres2.rows.item(i);

                                    let isPresent = 0;
                                    if (isBGDataExists) {
                                        let storeBgIndex = storeBGData1.findIndex(i => i.WindowId == data.WindowId && i.WindowDefinitionId == data.WindowDefinitionId)
                                        let storeBgObj = storeBgIndex >= 0 ? storeBGData1[storeBgIndex] : {};
                                        console.log("storeBgObj in getdata:", storeBgObj);
                                        isPresent = storeBgObj.isPresent == '1' || storeBgObj.isPresent == 1 ? 1 : 0;
                                    }

                                    let animatedChoice = new Animated.Value(isPresent);
                                    data.animatedChoice = animatedChoice;
                                    data.NoOfSplit = parseInt(data.NoOfSplit);

                                    let imgObj = { imgIndex: (i + 1), url: data.WindowRefImage, props: {} }
                                    images.push(imgObj);

                                    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 = await getWindowStockData(data, storeData1, false, menu1);
                                    let WStocks = WSd['WStocks'] || [];
                                    let WStocksData = WSd['WStocksData'] || [];
                                    let isAllChecked = WSd['isAllChecked'] != null ? WSd['isAllChecked'] : 0;
                                    // console.log('WSd:',WSd);

                                    let windowDataObj = { 'WindowId': data.WindowId, 'WindowDefinitionId': data.WindowDefinitionId, 'WindowSplits': WindowSplits, 'WindowQA': WindowQA, 'WStocksData': WStocksData, 'isPresent': isPresent, 'isAllSKUChecked': isAllChecked };
                                    data['WindowQuestions'] = WindowQuestions;
                                    data['WindowStocks'] = WStocks;

                                    let changesFlag = { WindowId: data.WindowId, WindowDefinitionId: data.WindowDefinitionId, Flag: false }
                                    inputChangeFlag.push(changesFlag)

                                    arr.push(data);
                                    allWindowsData.push(windowDataObj);
                                    if (i == txnres2.rows.length - 1) {
                                        let { menuName, StoreId1, BgMenuID, visiteDate } = bgStoreJson
                                        if (!isBGDataExists) {
                                            BgWindowData(allWindowsData)
                                        }

                                        setInputChange(inputChangeFlag)
                                        // setWindowData(allWindowsData);
                                        setWindows(arr);
                                        console.log("wind 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 getIRImages(window, storeData1, menu1, type = "1") {
        // let allImages=[];
        let res = { allImages: [], zoomIRImages: [] }

        return new Promise((resolve, reject) => {

            db.transaction(async function (txn) {

                let q = `select IMAGE1 as Image1 from ${AppTables.WINDOW_IR_IMAGES} where STORE_ID='${storeData1.StoreId}' and MENU_ID='${menu1.MenuId}' and VISIT_DATE='${d2}'`;
                q += type == '1' ? ` and WINDOW_HEADER_ID='${window.windowHeaderId}'` : '';

                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 as Sess_PhotoType FROM ${AppTables.WINDOW_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 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.WINDOW_IMAGES} where WINDOW_HEADER_ID='${window.windowHeaderId}' and  STORE_ID='${storeData1.StoreId}' and MENU_ID='${menu1.MenuId}' `;

                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.WINDOW_HEADER_ID)
                            let isImage1 = window.WindowImage1 == 'true' || window.WindowImage1 == 1 ? 1 : 0;
                            let isImage2 = window.WindowImage2 == 'true' || window.WindowImage2 == 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 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 WindowQuestionId,q.QUESTION_CODE as WindowQuestionCode,wq.WindowQuestionName,wq.QuestionType,wq.WQShowCamera,wq.WQCameraMandatory,wq.WQLengthValidationRequired,wq.WQMinimumChar,wq.WQMaximumChar,wq.WQDecimalPoint,wq.WQDateRangeMin,wq.WQDateRangeMax,wq.WQVoiceLengthInMinutes,wq.WQDefaultQuestionEnable,q.ANSWER as Answer,q.ANSWER_ID as AnswerId,q.MULTI_OPTIONS_IDS as multi_op_ids,q.IMAGE_ALLOW1 as WAShowCamera,q.IMAGE1 as Image1  `;
                    join2 = ` inner join Mapping_WindowQuestion mq on mq.WindowQuestionId=wq.WindowQuestionId `;
                    join = ` inner join Master_WindowQuestion wq on wq.WindowQuestionId=q.QUESTION_ID `;
                    q = `select ${selectlist} from ${AppTables.WINDOW_CHILD_DATA} q ${join} ${join2} where q.STORE_ID='${storeData1.StoreId}' and MENU_ID='${menu1.MenuId}' and q.WINDOW_DEFINITION_ID='${window.WindowDefinitionId}' and q.WINDOW_ID='${window.WindowId}' order by wq.WindowQuestionSequence  `;
                }
                else {
                    selectlist = ` DISTINCT  wq.WindowQuestionId,wq.WindowQuestionCode,wq.WindowQuestionName,wq.QuestionType,wq.WQShowCamera,wq.WQCameraMandatory,wq.WQLengthValidationRequired,wq.WQMinimumChar,wq.WQMaximumChar,wq.WQDecimalPoint,wq.WQDateRangeMin,wq.WQDateRangeMax,wq.WQVoiceLengthInMinutes,wq.WQDefaultQuestionEnable `;
                    join = ` inner join Mapping_WindowQuestion mq on mq.WindowQuestionId=wq.WindowQuestionId `;
                    q = `select ${selectlist} from  Master_WindowQuestion wq  ${join} where mq.WindowDefinitionId='${window.WindowDefinitionId}' order by wq.WindowQuestionSequence  `;
                }

                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.WQDefaultQuestionEnable = data.WQDefaultQuestionEnable == 1 || data.WQDefaultQuestionEnable == 'true' ? true : false;

                            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.WindowQuestionId + '_AnswerId';
                            let ans_key = data.WindowQuestionId + '_Answer';
                            let multi_key = data.WindowQuestionId + '_MultiOption';
                            let date_key = data.WindowQuestionId + '_Date';
                            let img_key = data.WindowQuestionId + '_ImagePath1';
                            let imgname_key = data.WindowQuestionId + '_ImageName1';
                            let rating_key = data.WindowQuestionId + '_Rating';


                            let showImageTag = (data.WQShowCamera == 'true' || data.WQShowCamera == 1);

                            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.WAShowCamera == 1 || ansss.WAShowCamera == '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  WindowAnswerId as AnswerId,WindowAnswerName as Answer,WAShowCamera,WACameraMandatory,WAQuestionEnable,WAQuestionDisable `;
                q = `select ${selectlist} from  Master_WindowQuestion  where WindowQuestionId='${qtn.WindowQuestionId}'  order by WASequence  `;

                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 [];
        });
    }


    //start IR functions 
    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;
        obj["photo_type"] = windIRParams.photo_type || '';

        let st1 = JSON.stringify(obj);
        let TempSessionId = await IRLogin.StartIRSession(st1);
        console.log(' StartCameraSession TempSessionId,task_name:', TempSessionId, ",", task_name);
        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"];
                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 = { 'WindowId': wind.WindowId, 'WindowDefinitionId': wind.WindowDefinitionId };
                const win_index = allData.findIndex(i => i.WindowId == wind.WindowId && i.WindowDefinitionId == wind.WindowDefinitionId);
                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);
                WindowIRImages.current = IRCamImages;

                // 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 = { 'WindowId': wind.WindowId, 'WindowDefinitionId': wind.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == wind.WindowId && i.WindowDefinitionId == wind.WindowDefinitionId);
        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 = { 'WindowId': wind.WindowId, 'WindowDefinitionId': wind.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == wind.WindowId && i.WindowDefinitionId == wind.WindowDefinitionId);
        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 = { 'WindowId': wind.WindowId, 'WindowDefinitionId': wind.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == wind.WindowId && i.WindowDefinitionId == wind.WindowDefinitionId);
        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.WINDOW_IRUPLOAD, AppTables.WINDOW_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.WINDOW_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.WINDOW_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.WINDOW_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;
        })



    }


    //End IR functions

    async function focusToNext(WindowStocks, windowIndex, stockProd, index) {
        console.log('focusToNext is call');

        if (index == WindowStocks.length - 1) {
            return;
        }
        try {
            console.log('next 1 call', 'input1_' + WindowStocks[index + 1].WindowDefinitionId + '_' + WindowStocks[index + 1].WindowStockDefinitionId)
            let refIn2 = inputRefs.current['input1_' + WindowStocks[index + 1].WindowDefinitionId + '_' + WindowStocks[index + 1].WindowStockDefinitionId];

            if (refIn2 != null) {
                refIn2.focus();
            }
        }
        catch (err) {
            console.log(err);
        }

    }

    async function getWindowStockData(window, storeData1, isInserted = false, menu1 = {}) {
        let obj = { 'WStocks': [], 'WStocksData': [] }
        let { StateId, ChainId, StoreTypeId, StoreClassId, StoreCategoryId } = storeData1;
        return new Promise((resolve, reject) => {
            db.transaction(async function (txn) {
                var q = '', selectlist = '', join = '';
                let checkassrt = window.WindowElementCheckAssortment == 'true' || window.WindowElementCheckAssortment == 1 ? true : false;

                if (isInserted == true) {
                    if (checkassrt) {
                        join = ` inner join Mapping_ProductAssortmentStorewise a on a.ProductId=s.WINDOW_STOCK_VALUE and a.StoreId='${storeData1.StoreId}' `;
                    }
                    selectlist = `  s.WINDOW_STOCK_DEFINITION_ID as WindowStockDefinitionId, s.WINDOW_DEFINITION_ID as WindowDefinitionId,s.WINDOW_STOCK_TABLE as WindowStockTable,s.WINDOW_STOCK_FIELD as WindowStockField,s.WINDOW_STOCK_VALUE as WindowStockValue,s.WINDOW_STOCK_MBQ as WindowStockMBQ,s.PRODUCT_NAME as ProductName, s.STOCK as Stock,s.IS_WIND_PRESENT as isWindPresent `;
                    q = `select ${selectlist} from  ${AppTables.WINDOW_STOCK_DATA} s ${join} where s.WINDOW_DEFINITION_ID='${window.WindowDefinitionId}' and s.STORE_ID='${storeData1.StoreId}' and MENU_ID='${menu1.MenuId}'  `;
                } else {
                    if (checkassrt) {
                        join = ` inner join Mapping_ProductAssortmentStorewise a on a.ProductId=s.WindowStockValue and a.StoreId='${storeData1.StoreId}'`;
                    }
                    selectlist = `  s.WindowStockDefinitionId, s.WindowDefinitionId,s.WindowStockTable,s.WindowStockField,s.WindowStockValue,s.WindowStockMBQ,s.ProductName `;
                    q = `select ${selectlist} from  Master_WindowStockDefinition s ${join} where s.WindowDefinitionId='${window.WindowDefinitionId}'   `;
                }
                if (checkassrt) {
                    q += ` and a.StoreId='${storeData1.StoreId}' `;
                }
                q += isInserted ? ` order by s.PRODUCT_NAME ` : ` order by s.ProductName `;



                await txn.executeSql(q, [], async function (txn2, txnres2) {
                    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);
                            if (isInserted == true && data.Stock != null) {
                                inputRefs.current['input1_' + data.WindowDefinitionId + "_" + data.WindowStockDefinitionId] = '';
                                let stockData_obj = { 'ProductId': data.WindowStockValue, 'Stock': data.Stock, 'isWindPresent': (data.isWindPresent != null ? data.isWindPresent : 0) }
                                WStocksData.push(stockData_obj);
                            }
                            if (data.isWindPresent == null || data.isWindPresent == 0 || data.isWindPresent == '0' || data.isWindPresent == '') {
                                isAllChecked = 0;
                            }
                            arr.push(data);
                            if (i == txnres2.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) },);
            });
        }).then((val) => {
            return val
        }).catch((err) => {
            console.log(err);
            return obj;
        });
    }

    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('Camera unavailable');
        }
        else if (typeof imgdata == 'object' && imgdata.uri != null) {
            const img = imgdata;
            const imgurl = img.uri, imgWidth = img.width, imgHeight = img.ExtendedHeight;
            console.log("actuual ht :", img.height, ',extended ht :', 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.WindowDefinitionId + '_' + window.WindowId + '_' + (props.UserId || '') + '_WindowImg-' + calculate_tym_date_for_filename + '.jpg';

            let allData = WindowData;
            let defData = { 'WindowId': window.WindowId, 'WindowDefinitionId': window.WindowDefinitionId };
            const wind_index = allData.findIndex(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
            let wind = wind_index >= 0 ? allData[wind_index] : defData;

            let camera1Label = window.WindowImage1Lable || '';
            let camera2Label = window.WindowImage2Lable || '';
            let extraLabel = '';

            if (cameraType == '2') {
                var QD = wind.WindowQA || {};
                var image_key = qtn.WindowQuestionId + '_ImageName1';
                var image_key_path = qtn.WindowQuestionId + '_ImagePath1';
                QD[image_key] = filename;
                extraLabel = 'Qtn Id: ' + qtn.WindowQuestionId;
            }
            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 + ' | WindowDef Id:' + window.WindowDefinitionId + (extraLabel != '' ? ' (' + extraLabel + ')' : '') + ' | Image Type: ' + currentMenu.MenuName + ' | Date:' + calculate_tym_date_over_img;

            let imagePath = `${ImageFolderPath + currentMenu.ScreenName}/${filename}`;
            await RNFS.copyFile(imgurl, imagePath)
                .then(async (resn) => {
                    // render data with clicked image
                    let uri = 'file://' + imagePath;
                    console.log('image marker:', uri);

                    if (cameraType == '2') {
                        QD[image_key_path] = uri;
                        wind.WindowQA = QD;
                        wind_index >= 0 ? allData[wind_index] = wind : allData.push(wind);
                        // setWindowData(allData);
                        BgWindowData(allData)
                        BgUnsavedChanges(true)
                        // setHasUnsavedChanges(true);
                        setrerenderdata3(!rerenderdata3);
                    }
                    else if (cameraType == '3') {
                        wind[image_key_path] = uri;
                        wind_index >= 0 ? allData[wind_index] = wind : allData.push(wind);
                        // setWindowData(allData);
                        BgWindowData(allData)
                        BgUnsavedChanges(true)
                        // setHasUnsavedChanges(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);
                        BgWindowData(allData)
                        BgUnsavedChanges(true)
                        setrerenderdata2(!rerenderdata2);
                    }

                    let objIndex = InputChange.findIndex(obj => obj.WindowId == window.WindowId && obj.WindowDefinitionId == window.WindowDefinitionId);
                    let winArr = [...InputChange]
                    winArr[objIndex].Flag = true
                    console.log("changeValue---------1", winArr)
                    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);
                });


        }
    }

    async function openCamera(window, splitItem, splitItemIndex, type = '1', cameraType = '1', qtn = {}) {
        let GridAllow = cameraType == '1' ? (type === '1' ? (window.WindowImage1CameraGrid === 'true' || window.WindowImage1CameraGrid == true) : (window.WindowImage2CameraGrid === 'true' || window.WindowImage2CameraGrid == true)) : false
        console.log("window.WindowImage1CameraGrid----------------", window.WindowImage1CameraGrid)
        console.log("window.WindowImage2CameraGrid----------------", window.WindowImage2CameraGrid, GridAllow)
        setGridValue(GridAllow);
        setGetImageProps({ 'window': window, 'splitItem': splitItem, 'splitItemIndex': splitItemIndex, 'type': type, 'cameraType': cameraType, 'qtn': qtn });
        setShowCamera(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('Saving Data...');
        setProcessing(true);
        let d1n = new Date();
        let d3 = moment(d1n).format('MM/DD/YYYY');


        try {
            let { StoreId, ChainId, StateId, StoreTypeId } = storeData;

            let isKPIIREnableI = KPIFields.findIndex(i => i.KPIFieldName == 'KPIIREnable')
            let isKPIIREnableObj = isKPIIREnableI >= 0 ? KPIFields[isKPIIREnableI] : {};
            let isKPIIREnable = isKPIIREnableI >= 0 ? isKPIIREnableObj['KPIFieldEnable'] : false;

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



            await db.transaction(async function (txn) {

                //  remove old data
                await txn.executeSql(`DELETE FROM ${AppTables.WINDOW_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');
                }, function (txnE, txnerr) { console.log(txnerr); },);
                await txn.executeSql(`DELETE FROM ${AppTables.WINDOW_CHILD_DATA} WHERE STORE_ID='${StoreId}'  and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `, [], async function (txn2, txnres) {
                    console.log('window child data deleted');
                }, function (txnE, txnerr) { console.log(txnerr); },);
                await txn.executeSql(`DELETE FROM ${AppTables.WINDOW_IMAGES} WHERE STORE_ID='${StoreId}'  and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `, [], async function (txn2, txnres) {
                    console.log('window images data deleted');
                }, function (txnE, txnerr) { console.log(txnerr); },);
                await txn.executeSql(`DELETE FROM ${AppTables.WINDOW_STOCK_DATA} WHERE STORE_ID='${StoreId}'  and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `, [], async function (txn2, txnres) {
                    console.log('window stock data deleted');
                }, function (txnE, txnerr) { console.log(txnerr); },);
                await txn.executeSql(`DELETE FROM ${AppTables.WINDOW_IR_IMAGES} WHERE STORE_ID='${StoreId}'  and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `, [], async function (txn2, txnres) {
                    console.log('window IR images deleted');
                }, function (txnE, txnerr) { console.log(txnerr); },);
                await txn.executeSql(`DELETE FROM ${AppTables.WINDOW_IRUPLOAD} WHERE STORE_ID='${StoreId}'  and MENU_ID='${currentMenu.MenuId}' and VISIT_DATE='${d2}' `, [], async function (txn2, txnres) {
                    console.log('window IR upload data deleted');
                }, function (txnE, txnerr) { console.log(txnerr); },);

                // add data
                var values = '', childV = '', imageV = '', stockV = '', IRImageV = '', IRStatusV = '';

                for (const wi in Windows) {
                    const window = Windows[wi];
                    let isImage1 = window.WindowImage1 == 'true' || window.WindowImage1 == 1 ? 1 : 0;
                    let isImage2 = window.WindowImage2 == 'true' || window.WindowImage2 == 1 ? 1 : 0;
                    let isNAImageAvl = window.WindowNotExistCamera == 'true' || window.WindowNotExistCamera == 1 ? 1 : 0;
                    let isNAReasonEnable = window.WindowNotExistReasonEnable == 'true' || window.WindowNotExistReasonEnable == 1 ? 1 : 0;
                    let isReasonEnable = window.WindowExistReasonEnable == 'true' || window.WindowExistReasonEnable == 1 ? 1 : 0;
                    let isStockReq = window.WindowElementStockRequired == 'true' || window.WindowElementStockRequired == 1 ? 1 : 0;
                    let WindowQuestions = window.WindowQuestions || [];
                    let WindowStocks = window.WindowStocks || [];


                    const wind = WindowData.find(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
                    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 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 WINDOW_HEADER_ID = 'WIND' + wi + (Math.floor(Math.random() * 1000) + 1);
                    let { WindowDefinitionId, WindowId, WindowName, WindowTable, WindowField, WindowValue, ChildName } = window;


                    values += values != '' ? ' , ' : '';
                    values += ` ('${WINDOW_HEADER_ID}','${StoreId}','${d3}','${WindowDefinitionId}','${WindowId}','${WindowName}','${WindowTable}','${WindowField}','${WindowValue}','${ChildName}','${isPresent}','${NAImage1}','${ReasonId}','${Reason}','${currentMenu.MenuId}','${d3}') `;


                    if (isKPIIREnable && !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 != '' ? ' , ' : '';
                            IRImageV += ` ('${WINDOW_HEADER_ID}','${StoreId}','${d3}','${WindowDefinitionId}','${WindowId}','${Image1}','','${TempSessionId}','','${currentMenu.MenuId}','${d3}') `;
                        }
                        IRStatusV += IRStatusV != '' ? ' , ' : '';
                        IRStatusV += ` ('${WINDOW_HEADER_ID}','${StoreId}','${d3}','${WindowDefinitionId}','${WindowId}','${TempSessionId}','','0','','${currentMenu.MenuId}','${Sess_StoreCode}','${Sess_TaskName}','${Sess_CatName}','${Sess_PhotoType}','${d3}') `;

                    }

                    if (isPresent == 1) {
                        for (const qtnIndex in WindowQuestions) {
                            const qtn = WindowQuestions[qtnIndex];

                            let selansid = '', selanswer = '', selimg = '', showImageTag = false;
                            let id_key = qtn.WindowQuestionId + '_AnswerId';
                            let ans_key = qtn.WindowQuestionId + '_Answer';
                            let multi_key = qtn.WindowQuestionId + '_MultiOption';
                            let date_key = qtn.WindowQuestionId + '_Date';
                            let img_key = qtn.WindowQuestionId + '_ImagePath1';
                            let imgname_key = qtn.WindowQuestionId + '_ImageName1';
                            let rating_key = qtn.WindowQuestionId + '_Rating';
                            let list_mcdata = [];

                            let { WindowQuestionId, WindowQuestionCode, QuestionType, WAShowCamera } = qtn
                            let answer = QD[ans_key] || 0;
                            let answerId = QD[id_key] || '';
                            let multi_options_ids = QD[multi_key] || '';
                            let isImage1All = WAShowCamera == 'true' || WAShowCamera == 1 ? 1 : 0;
                            let Image1 = isImage1All == 1 ? QD[imgname_key] : '';


                            childV += childV != '' ? ' , ' : '';
                            childV += ` ('${WINDOW_HEADER_ID}','${StoreId}','${d3}','${WindowDefinitionId}','${WindowId}','${WindowQuestionId}','${WindowQuestionCode}','${QuestionType}','${answer}','${answerId}','${multi_options_ids}','${Image1}','${isImage1All}','${currentMenu.MenuId}','${d3}') `;
                        }
                        if (!isKPIIREnable) { // Add images of normal camera only if IR not enabled
                            for (const splitItemIndex in WindowSplits) {
                                const splitItem = WindowSplits[splitItemIndex];
                                let Image1Name = splitItem['Image1Name'] != null && splitItem['Image1Name'] != '' ? splitItem['Image1Name'] : '';
                                let Image2Name = splitItem['Image2Name'] != null && splitItem['Image2Name'] != '' ? splitItem['Image2Name'] : '';
                                Image1Name = isImage1 == 1 ? Image1Name : '';
                                Image2Name = isImage2 == 1 ? Image2Name : '';

                                imageV += imageV != '' ? ' , ' : '';
                                imageV += ` ('${WINDOW_HEADER_ID}','${StoreId}','${d3}','${WindowDefinitionId}','${WindowId}','${Image1Name}','${Image2Name}','${currentMenu.MenuId}','${d3}') `;
                            }
                        }

                        for (const stockProdIndex in WindowStocks) {
                            const stockProd = WindowStocks[stockProdIndex];
                            let sd = WStocksData.find(i => i.ProductId == stockProd.WindowStockValue) || {};
                            let stock = sd.Stock != null ? sd.Stock : (sd.Stock == 0 ? sd.Stock : '');
                            let isWindPresent = sd.isWindPresent != null ? sd.isWindPresent : 0;
                            let { WindowStockDefinitionId, WindowDefinitionId, WindowStockTable, WindowStockField, WindowStockValue, WindowStockMBQ, ProductName } = stockProd
                            stockV += stockV != '' ? ' , ' : '';
                            stockV += ` ('${WINDOW_HEADER_ID}','${StoreId}','${d3}','${WindowDefinitionId}','${WindowId}','${WindowStockDefinitionId}','${WindowStockTable}','${WindowStockField}','${WindowStockValue}','${WindowStockMBQ}','${ProductName}','${stock}','${isWindPresent}','${currentMenu.MenuId}','${d3}') `;
                        }

                    }
                }

                if (isKPIIREnable && 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}') `;

                }

                console.log('values:', values);


                let add_hdr_data = `INSERT INTO ${AppTables.WINDOW_HDR_DATA} (WINDOW_HEADER_ID,STORE_ID,VISIT_DATE,WINDOW_DEFINITION_ID,WINDOW_ID,WINDOW_NAME,WINDOW_TABLE,WINDOW_FIELD,WINDOW_VALUE,CHILD_NAME,IS_PRESENT,WINDOW_NA_IMAGE,REASON_ID,REASON,MENU_ID,ADDED_DATE) VALUES ${values} `;
                let add_child_data = `INSERT INTO ${AppTables.WINDOW_CHILD_DATA} (WINDOW_HEADER_ID,STORE_ID,VISIT_DATE,WINDOW_DEFINITION_ID,WINDOW_ID,QUESTION_ID,QUESTION_CODE,QUESTION_TYPE,ANSWER,ANSWER_ID,MULTI_OPTIONS_IDS,IMAGE1,IMAGE_ALLOW1,MENU_ID,ADDED_DATE) VALUES ${childV} `;
                let add_images_data = `INSERT INTO ${AppTables.WINDOW_IMAGES} (WINDOW_HEADER_ID,STORE_ID,VISIT_DATE,WINDOW_DEFINITION_ID,WINDOW_ID,IMAGE1,IMAGE2,MENU_ID,ADDED_DATE) VALUES ${imageV} `;
                let add_stock_data = `INSERT INTO ${AppTables.WINDOW_STOCK_DATA} (WINDOW_HEADER_ID,STORE_ID,VISIT_DATE,WINDOW_DEFINITION_ID,WINDOW_ID,WINDOW_STOCK_DEFINITION_ID,WINDOW_STOCK_TABLE,WINDOW_STOCK_FIELD,WINDOW_STOCK_VALUE,WINDOW_STOCK_MBQ,PRODUCT_NAME,STOCK,IS_WIND_PRESENT,MENU_ID,ADDED_DATE) VALUES ${stockV} `;
                let add_IRImage_data = `INSERT INTO ${AppTables.WINDOW_IR_IMAGES} (WINDOW_HEADER_ID,STORE_ID,VISIT_DATE,WINDOW_DEFINITION_ID,WINDOW_ID,IMAGE1,IMAGE2,TEMP_SESSION_ID,UN_SESSION_ID,MENU_ID,ADDED_DATE) VALUES ${IRImageV} `;
                let add_IRStatus_data = `INSERT INTO ${AppTables.WINDOW_IRUPLOAD} (WINDOW_HEADER_ID,STORE_ID,VISIT_DATE,WINDOW_DEFINITION_ID,WINDOW_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('window 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 split window images');
                    }
                    else if (!isStockAdded) {
                        setProcessing(false); notify('Cannot add window stock data');
                    }
                    else if (!isChildAdded) {
                        setProcessing(false); notify('Cannot add window 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('Window data 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 window data'); },);
            });
        } catch (err) {
            console.log(err);
        }
    }

    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 isKPIIREnableI = KPIFields.findIndex(i => i.KPIFieldName == 'KPIIREnable')
        let isKPIIREnableObj = isKPIIREnableI >= 0 ? KPIFields[isKPIIREnableI] : {};
        let isKPIIREnable = isKPIIREnableI >= 0 ? isKPIIREnableObj['KPIFieldEnable'] : false;

        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) => {
            let isAllNotPresent = true;
            for (const wi in Windows) {
                const window = Windows[wi];
                let isImage1 = window.WindowImage1 == 'true' || window.WindowImage1 == 1 ? 1 : 0;
                let isImage2 = window.WindowImage2 == 'true' || window.WindowImage2 == 1 ? 1 : 0;
                let isNAImageAvl = window.WindowNotExistCamera == 'true' || window.WindowNotExistCamera == 1 ? 1 : 0;
                let isNAReasonEnable = window.WindowNotExistReasonEnable == 'true' || window.WindowNotExistReasonEnable == 1 ? 1 : 0;
                let isReasonEnable = window.WindowExistReasonEnable == 'true' || window.WindowExistReasonEnable == 1 ? 1 : 0;
                let isStockReq = window.WindowElementStockRequired == 'true' || window.WindowElementStockRequired == 1 ? 1 : 0;
                let StockQtyRequired = window.StockQtyRequired == 'true' || window.StockQtyRequired == 1 ? 1 : 0;
                let WindowQuestions = window.WindowQuestions || [];
                let WindowStocks = window.WindowStocks || [];


                const wind = WindowData.find(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
                let isPresent = wind.isPresent != null && wind.isPresent != '' ? wind.isPresent : '0';
                let ReasonId = wind.ReasonId != null ? wind.ReasonId : '';
                let Reason = wind.Reason != null ? wind.Reason : '';
                let NAImage1 = wind.NAImage1 != null ? wind.NAImage1 : '';
                let NAImage1Path = wind.NAImage1Path != null ? wind.NAImage1Path : '';
                let WindowSplits = wind.WindowSplits || [];
                let QD = wind.WindowQA || {};
                let windIRImages = wind.IRImages != null ? wind.IRImages : [];
                let TempSessionId = wind.TempSessionId != null ? wind.TempSessionId : "";
                let WStocksData = wind.WStocksData || [];

                if (isKPIIREnable && StoreCameraAllow && !CameraIROnceOnly && (windIRImages.length <= 0 || TempSessionId == '')) {
                    notify(`Please click Images for ${window.VisibilityName}`, 'SHORT');
                    resolve(false); return;
                }
                else {
                    if (isPresent == '1') {
                        isAllNotPresent = false; // Any paid visibility data exists
                        if (isReasonEnable == true && ReasonId == '') {
                            notify(`Please select reason for ${window.WindowName} `, 'LONG');
                            resolve(false); return;
                        }
                        else {
                            if (!isKPIIREnable && StoreCameraAllow && (window.NoOfSplit > 0 && WindowSplits.length > 0 && (isImage1 == 1 || isImage2 == 1))) {
                                for (const splitItemIndex in WindowSplits) {
                                    const splitItem = WindowSplits[splitItemIndex];
                                    let Image1Name = splitItem['Image1Name'] != null && splitItem['Image1Name'] != '' ? splitItem['Image1Name'] : '';
                                    let Image2Name = splitItem['Image2Name'] != null && splitItem['Image2Name'] != '' ? splitItem['Image2Name'] : '';
                                    console.log('Image2Name', Image2Name, isImage2);
                                    if (isImage1 == 1 && Image1Name == '') {
                                        notify(`Please click all images for ${window.WindowName}`, 'LONG');
                                        resolve(false); return;
                                    }
                                    else if (isImage2 == 1 && Image2Name == '') {
                                        notify(`Please click all images for ${window.WindowName}`, 'LONG');
                                        resolve(false); return;
                                    }
                                }
                            }

                            if (isStockReq == 1) {
                                let isProductSelected = false;
                                for (const stockProdIndex in WindowStocks) {
                                    const stockProd = WindowStocks[stockProdIndex];
                                    let sd = WStocksData.find(i => i.ProductId == stockProd.WindowStockValue) || {};
                                    let stock = sd.Stock != null ? sd.Stock : (sd.Stock == 0 ? sd.Stock : '');
                                    let isWindPresent = sd.isWindPresent != null ? sd.isWindPresent : 0;

                                    if (isWindPresent == 1) {
                                        isProductSelected = true;
                                    }

                                    // if((isListedSKUEnable==true && isWindPresent==1 && stock=='') || (isListedSKUEnable!=true && (stock==null || stock==''))){
                                    //     notify(`Please enter stock for ${window.WindowName} ( ${stockProd.ProductName} ) `,'LONG');
                                    //     resolve(false);return;
                                    // }

                                    if ((isListedSKUEnable == true && isWindPresent == 1 && StockQtyRequired == 1 && stock == '') || (isListedSKUEnable != true && (stock == null || stock == ''))) {
                                        notify(`${ST.Pleaseenterstockfor} ${window.PromoName} ( ${stockProd.ProductName} ) `, 'LONG');
                                        resolve(false); return;
                                    }

                                    if (isListedSKUEnable == true && stockProdIndex == WindowStocks.length - 1) {
                                        if (!isProductSelected) {
                                            notify(`${ST.PleaseselectatleastoneSKUfor} ${window.WindowName} `, 'LONG');
                                            resolve(false); return;
                                        }
                                    }
                                }
                            }

                            if (WindowQuestions.length > 0) {
                                for (const qtnIndex in WindowQuestions) {
                                    const qtn = WindowQuestions[qtnIndex];

                                    let selansid = '', selanswer = '', selimg = '', showImageTag = false;
                                    let id_key = qtn.WindowQuestionId + '_AnswerId';
                                    let ans_key = qtn.WindowQuestionId + '_Answer';
                                    let multi_key = qtn.WindowQuestionId + '_MultiOption';
                                    let date_key = qtn.WindowQuestionId + '_Date';
                                    let img_key = qtn.WindowQuestionId + '_ImagePath1';
                                    let imgname_key = qtn.WindowQuestionId + '_ImageName1';
                                    let rating_key = qtn.WindowQuestionId + '_Rating';
                                    let list_mcdata = [];

                                    let isImgAllowed = (qtn.WQShowCamera == 'true' || qtn.WQShowCamera == 1);
                                    let checkForAnsKey = (qtn.QuestionType == 'Decimal' || qtn.QuestionType == 'Number' || qtn.QuestionType == 'Text' || qtn.QuestionType == 'Date' || qtn.QuestionType == 'Rating');
                                    if (qtn.QuestionType == 'Single choice list') {
                                        selansid = QD[id_key];
                                    }
                                    else if (qtn.QuestionType == 'Multi choice list') {
                                        selansid = QD[multi_key] != null && QD[multi_key] != '' ? QD[multi_key].split(',') : [];
                                    }

                                    //validate only if qtn is enabled or showing
                                    if (qtn.isDisabled == false) {
                                        if (qtn.QuestionType == 'Multi choice list' && selansid.length <= 0) {
                                            notify(`Please select options for the required field in ${window.WindowName}`, 'SHORT');
                                            resolve(false); return;
                                        }
                                        else if (checkForAnsKey && (Object.keys(QD).indexOf(ans_key) < 0 || (Object.keys(QD).indexOf(ans_key) >= 0 && QD[ans_key] === ''))) {
                                            let msg = (qtn.QuestionType == 'Date' ? `Please pick a date for the required field in ${window.WindowName}` : (qtn.QuestionType == 'Rating' ? `Please select rating for the required field in ${window.WindowName}` : `Please fill all the required field in ${window.WindowName}`));
                                            notify(msg, 'SHORT');
                                            resolve(false); return;
                                        }
                                        else if (Object.keys(QD).indexOf(id_key) < 0 || (Object.keys(QD).indexOf(id_key) >= 0 && (QD[id_key] === ''))) {
                                            notify(`Please fill all the required field in ${window.WindowName}`, 'SHORT');
                                            resolve(false); return;
                                        }
                                        else if (!isKPIIREnable && StoreCameraAllow && isImgAllowed && (Object.keys(QD).indexOf(img_key) < 0 || (Object.keys(QD).indexOf(img_key) >= 0 && QD[img_key] === ''))) {
                                            notify(`Please add images in ${window.WindowName}`, 'SHORT');
                                            resolve(false); return;
                                        } else {
                                            console.log('no condition found');
                                        }


                                        if ((qtn.QuestionType == 'Single choice list' || qtn.QuestionType == 'Multi choice list')) {
                                            if (qtn.Answers && qtn.Answers.length > 0) {
                                                for (var j = 0; j < qtn.Answers.length; j++) {
                                                    let ansss = qtn.Answers[j];
                                                    let isandImgAl = (ansss.WAShowCamera == 'true' || ansss.WAShowCamera == 1);
                                                    if (qtn.QuestionType == 'Single choice list' && (isandImgAl && ansss.AnswerId == selansid)) {
                                                        showImageTag = true;
                                                    }
                                                    else if (qtn.QuestionType == 'Multi choice list' && (isandImgAl && selansid.indexOf(ansss.AnswerId) >= 0)) {
                                                        showImageTag = true;
                                                    }
                                                }
                                            }
                                        }

                                    }

                                    if (!isKPIIREnable && StoreCameraAllow && showImageTag && (Object.keys(QD).indexOf(img_key) < 0 || (Object.keys(QD).indexOf(img_key) >= 0 && QD[img_key] === ''))) {
                                        notify(`Please add images in ${window.WindowName}`, 'SHORT');
                                        resolve(false); return;
                                    }
                                }
                            }

                        }
                    }
                    else {
                        if (isNAReasonEnable == true && ReasonId == '') {
                            notify(`Please select reason for ${window.WindowName} `, 'LONG');
                            resolve(false); return;
                        }
                        else if (!isKPIIREnable && StoreCameraAllow && isNAImageAvl == true && NAImage1 == '') {
                            notify(`Please click image for ${window.WindowName}`, 'LONG');
                            resolve(false); return;
                        }
                    }
                }

                if (wi == (Windows.length - 1)) {
                    // isAllNotPresent : check only of Any paid visibility data exists
                    if (isKPIIREnable && StoreCameraAllow && CameraIROnceOnly && !isAllNotPresent && (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 onselectionChange(option, keyLbl, keyVal, otherData) {
        let item = otherData.window;
        let allData = WindowData;
        let defData = { 'WindowId': item.WindowId, 'WindowDefinitionId': item.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == item.WindowId && i.WindowDefinitionId == item.WindowDefinitionId);
        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.WindowId == item.WindowId && i.WindowDefinitionId == item.WindowDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        console.log("changeValue---------1", winArr)
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function onselectionChange2(option, qtn, window) {
        let allData = WindowData;
        let defData = { 'WindowId': window.WindowId, 'WindowDefinitionId': window.WindowDefinitionId };
        const wind_index = allData.findIndex(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        let wind = wind_index >= 0 ? allData[wind_index] : defData;
        let data = wind.WindowQA || {};
        let id_key = qtn.WindowQuestionId + '_AnswerId';
        let ans_key = qtn.WindowQuestionId + '_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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        console.log("changeValue---------1", winArr)
        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.WAQuestionEnable != null && ans_obj.WAQuestionEnable != '' ? ans_obj.WAQuestionEnable.replace(' ', '').split(',') : [];
        let DQtns = ans_obj.WAQuestionDisable != null && ans_obj.WAQuestionDisable != '' ? ans_obj.WAQuestionDisable.replace(' ', '').split(',') : [];

        let sqtns = window.WindowQuestions || []

        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.WindowQuestionId == 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.WindowQuestionId + '_AnswerId';
                        let ans_key = s_qtn.WindowQuestionId + '_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.WindowDefinitionId == window.WindowDefinitionId && i.WindowId == window.WindowId)
                if (windowIndex > 0) {
                    window['WindowQuestions'] = sqtns;
                    allwindows[windowIndex] = window;
                    // setWindowData(allData);
                    BgWindowData(allData)
                    setWindows(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.WindowQuestionId == qid) || {};
                let s_qtn = sqtns[s_qtnindex];
                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) {
                disableQtns(sqtns, DQtns, data, wind, wind_index, allData, window)
            }
            else {
                let allwindows = Windows;
                let windowIndex = allwindows.findIndex(i => i.WindowDefinitionId == window.WindowDefinitionId && i.WindowId == window.WindowId)
                if (windowIndex > 0) {
                    window['WindowQuestions'] = sqtns;
                    allwindows[windowIndex] = window;
                    setWindows(allwindows);
                    // setHasUnsavedChanges(true);
                    BgUnsavedChanges(true)
                    setrerenderdata(!rerenderdata);
                }
            }
        })
    }

    async function setMultiSelectValue(selectedItems = [], qtn = {}, window = {}) {
        console.log('setMultiSelectValue', selectedItems);
        let id_key = qtn.WindowQuestionId + '_AnswerId';
        let ans_key = qtn.WindowQuestionId + '_Answer';
        let multi_key = qtn.WindowQuestionId + '_MultiOption';

        let allData = WindowData;
        let defData = { 'WindowId': window.WindowId, 'WindowDefinitionId': window.WindowDefinitionId };
        const wind_index = allData.findIndex(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        console.log("changeValue---------1", winArr)
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function setTextValue(value, qtn, window, type = '') {
        if (value != '') {
            let isValid = validateNumber(value, type);
            if (!isValid) {
                return;
            }
        }
        let id_key = qtn.WindowQuestionId + '_AnswerId';
        let ans_key = qtn.WindowQuestionId + '_Answer';

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

        if (qtn.QuestionType == 'Date') {
            let date_key = qtn.WindowQuestionId + '_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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        console.log("changeValue---------1", winArr)
        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.WindowQuestionId == qtn.WindowQuestionId);

        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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId) || {};
            allWindows[winIndex] = window;
            setWindows(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.WindowQuestionId + '_AnswerId';
        let ans_key = qtn.WindowQuestionId + '_Answer';
        let rating_key = qtn.WindowQuestionId + '_Rating';
        let ids = [], anss = [];
        RatingOrder.map((item, index) => {
            ids.push(item.AnswerId);
            anss.push(item.Answer);
        })

        let allData = WindowData;
        let defData = { 'WindowId': window.WindowId, 'WindowDefinitionId': window.WindowDefinitionId };
        const wind_index = allData.findIndex(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        console.log("changeValue---------7", winArr)

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


    function onChoiceSelect(item, val, key, animatedChoice) {
        console.log('onChoiceSelect---1', animatedChoice)
        let win_index = InputChange.find(i => i.WindowId == item.WindowId && i.WindowDefinitionId == item.WindowDefinitionId)
        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 = { 'WindowId': item.WindowId, 'WindowDefinitionId': item.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == item.WindowId && i.WindowDefinitionId == item.WindowDefinitionId);
        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.WindowId == item.WindowId && i.WindowDefinitionId == item.WindowDefinitionId);
            let winArr = [...InputChange]
            winArr[objIndex].Flag = true
            setInputChange(winArr)
        }
        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true);
        setrerenderdata(!rerenderdata);
    }

    function onWindowDataClean() {

        if (DataCleanAnim != null) {
            let anim = isPresentClean == 1 ? 1 : '';
            Animated.timing(DataCleanAnim, {
                toValue: anim,
                duration: 400,
                useNativeDriver: false,
            }).start();
        }
        let allData = WindowData;
        // let defData={'CategoryId':item.CategoryId,'CategoryDefinitionId':item.CategoryDefinitionId};

        // let defData={'WindowId':item.WindowId,'WindowDefinitionId':item.WindowDefinitionId};
        // const win_index=allData.findIndex(i=>i.WindowId==item.WindowId && i.WindowDefinitionId==item.WindowDefinitionId);
        // let wind=win_index>=0?(allData[win_index] || defData) : defData;
        // wind[key]=val;

        let WindowSplits = [];
        for (var s = 0; s < DataCleanItem.NoOfSplit; s++) {
            let obj = { 'Image1Name': '', 'Image1': '', 'Image2Name': '', 'Image2': '', img1Required: true, img2Required: true };
            WindowSplits.push(obj);
        }
        // let defData={'CategoryId':DataCleanItem.CategoryId,'CategoryDefinitionId':DataCleanItem.CategoryDefinitionId,'WindowSplits':WindowSplits,'WindowQA':{},'WStocksData':[],'isAllSKUChecked':0};

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

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


        let objIndex = InputChange.findIndex(i => i.WindowId == DataCleanItem.WindowId && i.WindowDefinitionId == DataCleanItem.WindowDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = false
        console.log("changeValue---------7", winArr)
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true);
        setDataCleanModal(false)
        setrerenderdata(!rerenderdata);
    }


    async function setWindowStockVal(val, window, stockProd, key, type = '') {
        if (val != '') {
            let isValid = validateNumber(val, type);
            if (!isValid) {
                return;
            }
        }

        let allData = WindowData;
        let defData = { 'WindowId': window.WindowId, 'WindowDefinitionId': window.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        let wind = win_index >= 0 ? (allData[win_index] || defData) : defData;
        let WStocksData = wind['WStocksData'] || [];
        let sdIndex = WStocksData.findIndex(i => i.ProductId == stockProd.WindowStockValue);
        let sd = sdIndex >= 0 ? WStocksData[sdIndex] : { 'ProductId': stockProd.WindowStockValue, '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 == 'isWindPresent') {
            let isAllChecked = await verifyAllChecked(val, window, stockProd, key);
            wind['isAllSKUChecked'] = isAllChecked;
        }


        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata4(!rerenderdata4);
    }

    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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
            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.WindowStockValue);
                    let sd1 = sdIndex1 >= 0 ? WStocksData[sdIndex1] : {};
                    let isWindPresent = sd1.isWindPresent;
                    if (isWindPresent == null || isWindPresent == '' || isWindPresent == 0 || isWindPresent == '0') {
                        isAllChecked = 0
                    }

                    if (i == WindowStocks.length - 1) {
                        resolve(isAllChecked);
                    }
                }
            }
            else {
                resolve(0);
            }

        }).catch((err) => {
            console.log(err);
            return 0;
        });
    }

    function checkAllSKUs(val, window) {

        let WindowStocks = window.WindowStocks || [];
        let allData = WindowData;
        let defData = { 'WindowId': window.WindowId, 'WindowDefinitionId': window.WindowDefinitionId };
        const win_index = allData.findIndex(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
        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.WindowStockValue);
            let sd = sdIndex >= 0 ? WStocksData[sdIndex] : { 'ProductId': stockProd.WindowStockValue, 'Stock': '' };
            let isWindPresent = (val == 1 || val == '1') ? 1 : 0;
            sd['isWindPresent'] = isWindPresent;

            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.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId);
            const windData = windDataIndex >= 0 ? windData[windDataIndex] : {};
            let zoomIRImages = windData.zoomIRImages != null && windData.zoomIRImages != "" ? windData.zoomIRImages : [];
            setZoomImageUrl2(zoomIRImages);
        }
        setrefImageIndex2(ImageIndex);
        UpdateShow_zoomImageRef2(true);
    }

    function renderRatingView() {
        let qtn = RatingQtn;
        let Answers = qtn.Answers;
        let id_key = qtn.WindowQuestionId + '_AnswerId';
        let ans_key = qtn.WindowQuestionId + '_Answer';
        let rating_key = qtn.WindowQuestionId + '_Rating';

        let newarr = RatingOrder;
        if (RatingOrder.length <= 0) {
            newarr = Answers;
        }

        return (
            <View style={customStyle.RatingModal}>
                <View style={customStyle.RatingModalCon}>
                    <Text style={customStyle.VRModalHeding}>Drag Items In Order</Text>
                    <Text style={customStyle.VRSubHeding}>Press and hold to drag</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}>Cancel</Text>
                        </TouchableOpacity>
                        <TouchableOpacity style={customStyle.RModal_Btnsave} onPress={() => { onRatingSave() }}>
                            <Text style={customStyle.RModal_BtnTextsave}>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 : '-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)}
            />
        );
    }

    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 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 isKPIIREnableI = KPIFields.findIndex(i => i.KPIFieldName == 'KPIIREnable')
        let isKPIIREnableObj = isKPIIREnableI >= 0 ? KPIFields[isKPIIREnableI] : {};
        let isKPIIREnable = isKPIIREnableI >= 0 ? isKPIIREnableObj['KPIFieldEnable'] : false;

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

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

    }



    function _renderWindow() {

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

        let isKPIIREnableI = KPIFields.findIndex(i => i.KPIFieldName == 'KPIIREnable')
        let isKPIIREnableObj = isKPIIREnableI >= 0 ? KPIFields[isKPIIREnableI] : {};
        let isKPIIREnable = isKPIIREnableI >= 0 ? isKPIIREnableObj['KPIFieldEnable'] : false;

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


        return (
            <FlatList
                data={Windows}
                extraData={rerenderdata}
                contentContainerStyle={customStyle.Win_scroll}
                ListHeaderComponent={_renderIRCameraOnce}
                style={customStyle.Win_scrollO}
                listKey={(item, index) => `window_${index.toString()}`}
                renderItem={({ item, index }) => {
                    const window = item;
                    let windowIndex = index;

                    let isImage1 = window.WindowImage1 == 'true' || window.WindowImage1 == 1 ? 1 : 0;
                    let isImage2 = window.WindowImage2 == 'true' || window.WindowImage2 == 1 ? 1 : 0;
                    let isNAImageAvl = window.WindowNotExistCamera == 'true' || window.WindowNotExistCamera == 1 ? 1 : 0;
                    let isNAReasonEnable = window.WindowNotExistReasonEnable == 'true' || window.WindowNotExistReasonEnable == 1 ? 1 : 0;
                    let isReasonEnable = window.WindowExistReasonEnable == 'true' || window.WindowExistReasonEnable == 1 ? 1 : 0;
                    let isStockReq = window.WindowElementStockRequired == 'true' || window.WindowElementStockRequired == 1 ? 1 : 0;
                    let StockQtyRequired = window.StockQtyRequired == 'true' || window.StockQtyRequired == 1 ? 1 : 0;

                    // let isStock_CheckAssrt=window.WindowElementCheckAssortment=='true' || window.WindowElementCheckAssortment==1?1:0;
                    let RefImage = window.WindowRefImage;
                    let camera1Label = window.WindowImage1Lable || '';
                    let camera2Label = window.WindowImage2Lable || '';
                    let WindowQuestions = window.WindowQuestions || [];
                    let WindowStocks = window.WindowStocks || [];

                    const wind = WindowData.find(i => i.WindowId == window.WindowId && i.WindowDefinitionId == window.WindowDefinitionId) || {};
                    let isPresent = wind.isPresent != null && wind.isPresent != '' ? wind.isPresent : '0';
                    let ReasonId = wind.ReasonId != null ? wind.ReasonId : '';
                    let Reason = wind.Reason != null ? wind.Reason : '';
                    let NAImage1 = wind.NAImage1 != null ? wind.NAImage1 : '';
                    let NAImage1Path = wind.NAImage1Path != null ? wind.NAImage1Path : '';
                    let WindowSplits = wind.WindowSplits || [];
                    let QuestionsData = wind.WindowQA || {};
                    let WStocksData = wind.WStocksData || [];
                    let isAllSKUChecked = wind.isAllSKUChecked == 1 || wind.isAllSKUChecked == "1";
                    let windIRImages = wind.IRImages != null ? wind.IRImages : [];
                    let TempSessionId = wind.TempSessionId != null ? wind.TempSessionId : "";

                    // console.log('camera2Label:',window.WindowId,window.WindowDefinitionId,camera2Label);

                    // console.log("isPresent in render:",window.WindowId,isPresent);
                    var xpos = 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}>
                                <LinearGradient colors={[PageTheme.$primary_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.WItem_Hdrbg}>
                                    <Text style={customStyle.WItem_HdrText}>{window.WindowName}</Text>
                                    <Text style={[customStyle.WItem_Hdrname2]}>{window.ChildName}</Text>

                                    <TouchableOpacity style={customStyle.WItem_RefImgBtn} onPress={() => { openImageRefView(index) }}>
                                        <Entypo name='image-inverted' size={24} color={'#1f7dbc'} />
                                    </TouchableOpacity>
                                </LinearGradient>
                            </View>

                            <View style={customStyle.WForm}>
                                <View style={[customStyle.openStk_prd_cols, customStyle.mt10]}>
                                    <View style={[customStyle.openStk_prd_colflex, customStyle.mb10]}>
                                        <Text style={[customStyle.openStk_prd_label, customStyle.openStk_prd_flexlabel]}>{'Is Present'}</Text>
                                        <View style={customStyle.openStk_prd_choiceBoxCon}>
                                            <View style={customStyle.openStk_prd_choiceBox}>
                                                <Animated.View style={[customStyle.openStkCh_absolutebg, customStyle.openStkCh_con_active, (isPresent == '1' ? customStyle.openStkCh_con_green : customStyle.openStkCh_con_red),
                                                { transform: [{ translateX: xpos }], }]}></Animated.View>
                                                <TouchableOpacity style={customStyle.openStkCh_con1} onPress={() => { onChoiceSelect(window, 1, 'isPresent', window.animatedChoice) }}>
                                                    <Text style={[customStyle.openStkCh_text, (isPresent == '1' ? customStyle.openStkCh_textactive : {})]}>Yes</Text>
                                                </TouchableOpacity>
                                                <TouchableOpacity style={[customStyle.openStkCh_con1]} onPress={() => { onChoiceSelect(window, 0, 'isPresent', window.animatedChoice) }}>
                                                    <Text style={[customStyle.openStkCh_text, (isPresent == '0' ? customStyle.openStkCh_textactive : {})]}>No</Text>
                                                </TouchableOpacity>
                                            </View>
                                        </View>
                                    </View>
                                    {((isPresent != '1' && isNAReasonEnable == true) || (isPresent == '1' && isReasonEnable == true)) &&
                                        <View style={[customStyle.openStk_prd_colflex, customStyle.openStk_prd_borderT, customStyle.pt10, customStyle.mb10]}>
                                            <Text style={[customStyle.openStk_prd_label, customStyle.openStk_prd_flexlabel]}>Select Reason</Text>
                                            {<CustomPicker2 {...props} Pickerdata={reasons_list} label_key={'Reason'} value_key={'ReasonId'} onchangeKeyLbl={'Reason'} onchangeKey={'ReasonId'} onChange={onselectionChange} selected_data={{ value: Reason, otherData: { window: window } }} InputStyle={customStyle.PV_selectInputStyle} selectStyle={customStyle.PV_selectStyle} />}
                                        </View>
                                    }


                                    {(!isKPIIREnable && (isPresent != '1' && isNAImageAvl == true)) &&
                                        <View>
                                            <View style={[customStyle.openStk_prd_borderT, customStyle.pt10, customStyle.mb10]}>
                                                <LinearGradient colors={[PageTheme.$secondary_color_light, PageTheme.$bg_color, PageTheme.$fourth_color, PageTheme.$bg_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                    <Text style={customStyle.windhdrText}>{'Capture Image'}</Text>
                                                </LinearGradient>


                                                <View style={[customStyle.openStk_prdCameras, customStyle.WSCameraWrap]}>
                                                    <View style={[customStyle.openStkCameraCon, customStyle.WSCameraCon]}>
                                                        {(NAImage1Path == '' || NAImage1Path == null) &&
                                                            <TouchableOpacity style={[customStyle.osCat_action_openCam, customStyle.osCat_actn_margin]} onPress={() => { openCamera(window, {}, 0, '1', '3') }}>
                                                                <CameraImg width={80} height={80}/>
                                                            </TouchableOpacity>
                                                        }
                                                        {(NAImage1Path != '' && NAImage1Path != null) &&
                                                            <View style={customStyle.osCatImageView}>
                                                                <Image style={customStyle.osCatImage} source={{ uri: NAImage1Path }} />
                                                                <TouchableOpacity style={[customStyle.osCat_action_reCap]} onPress={() => { openCamera(window, {}, 0, '1', '3') }}>
                                                                    <MaterialCommunityIcons name='camera-retake' size={20} color={PageTheme.$accent_color} />
                                                                </TouchableOpacity>
                                                            </View>
                                                        }
                                                    </View>
                                                </View>
                                            </View>
                                        </View>
                                    }

                                    {isKPIIREnable && !CameraIROnceOnly &&
                                        _renderIRCamera(window, windIRImages, TempSessionId, '1', windowIndex)
                                    }

                                    {(isPresent == '1') &&
                                        <View>

                                            {(isStockReq == true && WindowStocks.length > 0) &&
                                                <View style={[customStyle.openStk_prd_borderT, customStyle.pt10]}>
                                                    <LinearGradient colors={[PageTheme.$secondary_color_light, PageTheme.$bg_color, PageTheme.$fourth_color, PageTheme.$bg_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                        <Text style={customStyle.windhdrText}>{'Enter Stocks'}</Text>
                                                    </LinearGradient>
                                                    {isListedSKUEnable == true &&
                                                        <View style={customStyle.windhdr_checkAllBtnCon}>
                                                            <TouchableOpacity style={customStyle.windhdr_checkAllBtn} onPress={() => { checkAllSKUs((isAllSKUChecked == 1 ? 0 : 1), window) }}>
                                                                <CheckBox
                                                                    boxType='square'
                                                                    value={isAllSKUChecked}
                                                                    onValueChange={(val) => { let val1 = (val == true) ? 1 : 0; checkAllSKUs(val1, window) }}
                                                                    style={[customStyle.WStkHdr_checkbox, (Platform.OS == 'ios' ? { height: 20, width: 20, marginLeft: 5 } : {})]}
                                                                    tintColors={{ true: PageTheme.$primary_color, false: PageTheme.$text_color_light }}
                                                                />
                                                                <Text style={customStyle.windhdr_checkAllBtnText}>{ST.SelectAll}</Text>
                                                            </TouchableOpacity>
                                                        </View>}
                                                    <FlatList
                                                        data={WindowStocks}
                                                        extraData={rerenderdata4}
                                                        listKey={(item, index) => `wstock_${index.toString()}`}
                                                        renderItem={({ item, index }) => {
                                                            let stockProd = item;
                                                            let stockProdIndex = index;
                                                            let sd = WStocksData.find(i => i.ProductId == stockProd.WindowStockValue) || {};
                                                            let stock = sd.Stock != null ? sd.Stock : '';
                                                            let isWindPresent = sd.isWindPresent != null ? sd.isWindPresent : 0;
                                                            return (
                                                                <View style={[customStyle.WStkWrap]} key={'WSTock+' + stockProdIndex}>
                                                                    {isListedSKUEnable != true && <Text style={[customStyle.WStkHdrText3]}>{stockProd.ProductName}</Text>}
                                                                    {isListedSKUEnable == true &&
                                                                        <View style={customStyle.WStkHdr_checkboxWrap}>
                                                                            <View style={customStyle.WStkHdr_checkboxCon}>
                                                                                <CheckBox
                                                                                    boxType='square'
                                                                                    value={(isWindPresent == 1 || isWindPresent == '1')}
                                                                                    onValueChange={(val) => { let val1 = (val == true) ? 1 : 0; setWindowStockVal(val1, window, stockProd, 'isWindPresent') }}
                                                                                    style={[customStyle.WStkHdr_checkbox, (Platform.OS == 'ios' ? { height: 20, width: 20, marginTop: 5, marginLeft: 5, } : {})]}
                                                                                    tintColors={{ true: PageTheme.$primary_color, false: PageTheme.$text_color_light }}
                                                                                />
                                                                            </View>
                                                                            <Text style={[customStyle.WStkHdrText2, customStyle.WStkHdr_checkboxpName]}>{stockProd.ProductName}</Text>
                                                                        </View>}
                                                                    {((isListedSKUEnable == true && StockQtyRequired == 1 && isWindPresent == 1) || isListedSKUEnable != true) &&
                                                                        <View style={[customStyle.openStk_prd_colflex, customStyle.WStkHdr_PrdcontentWrap]} >
                                                                            <View style={[customStyle.openStk_prd_col50, customStyle.openStk_prd_col50_1]}>
                                                                                <Text style={customStyle.openStk_prd_flexlabel}>Stock</Text>
                                                                            </View>
                                                                            <View style={[customStyle.openStk_prd_col50, customStyle.openStk_prd_col50_2]}>
                                                                                <TextInput
                                                                                    style={[customStyle.WStkInputStyle]}
                                                                                    ref={(reff) => { inputRefs.current['input1_' + stockProd.WindowDefinitionId + '_' + stockProd.WindowStockDefinitionId] = reff; }}
                                                                                    placeholder=""
                                                                                    autoComplete='off'
                                                                                    placeholderTextColor={PageTheme.$placeholder_color}
                                                                                    keyboardType={'number-pad'}
                                                                                    returnKeyType="next"
                                                                                    blurOnSubmit={false}
                                                                                    value={stock + ''}
                                                                                    onSubmitEditing={() => { focusToNext(WindowStocks, windowIndex, stockProd, index) }}
                                                                                    onChangeText={(val) => { setWindowStockVal(val, window, stockProd, 'Stock', 'numeric') }}
                                                                                />
                                                                            </View>
                                                                        </View>}
                                                                </View>
                                                            );
                                                        }}
                                                    />
                                                </View>
                                            }
                                            {(!isKPIIREnable && (window.NoOfSplit > 0 && WindowSplits.length > 0 && (isImage1 == 1 || isImage2 == 1))) &&
                                                <View style={[customStyle.openStk_prd_borderT, customStyle.pt10, customStyle.mb10]}>
                                                    <LinearGradient colors={[PageTheme.$secondary_color_light, PageTheme.$bg_color, PageTheme.$fourth_color, PageTheme.$bg_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                        <Text style={customStyle.windhdrText}>{'Capture Window Images'}</Text>
                                                    </LinearGradient>
                                                    <FlatList
                                                        data={WindowSplits}
                                                        extraData={rerenderdata2}
                                                        listKey={(item, index) => `spliItem_${index.toString()}`}
                                                        renderItem={({ item, index }) => {
                                                            let splitItem = item;
                                                            let splitItemIndex = index;
                                                            let Image1Name = splitItem['Image1Name'] != null && splitItem['Image1Name'] != '' ? splitItem['Image1Name'] : '';
                                                            let Image2Name = splitItem['Image2Name'] != null && splitItem['Image2Name'] != '' ? splitItem['Image2Name'] : '';
                                                            let Image1 = splitItem['Image1'] != null && splitItem['Image1'] != '' ? splitItem['Image1'] : '';
                                                            let Image2 = splitItem['Image2'] != null && splitItem['Image2'] != '' ? splitItem['Image2'] : '';
                                                            let isImg1mad = splitItem['img1Required'] || false;
                                                            let isImg2mad = splitItem['img2Required'] || false;

                                                            return (
                                                                <View style={[customStyle.openStk_prdCameras, customStyle.WSCameraWrap]} key={'SplitItem+' + splitItemIndex}>
                                                                    {isImage1 == 1 &&
                                                                        <View style={[customStyle.openStkCameraCon, customStyle.WSCameraCon]}>
                                                                            {/* { (Image1=='' || Image1==null) && 
                                                        <TouchableOpacity style={[customStyle.osCat_action_openCam,customStyle.osCat_actn_margin]} onPress={()=>{openCamera(window,splitItem,splitItemIndex,'1')}}>
                                                            <SvgXml width={80} height={80} xml={cameraImg}/>                                     
                                                        </TouchableOpacity>
                                                    }
                                                    { (Image1!='' && Image1!=null) && 
                                                        <View style={customStyle.osCatImageView}>
                                                            <Image style={customStyle.osCatImage} source={{uri:Image1}}/>
                                                            <TouchableOpacity style={[customStyle.osCat_action_reCap]} onPress={()=>{openCamera(window,splitItem,splitItemIndex,'1')}}>
                                                                <MaterialCommunityIcons name='camera-retake' size={20} color={PageTheme.$accent_color}/>                                   
                                                            </TouchableOpacity>
                                                        </View>                                    
                                                    }        */}

                                                                            {((Image1 == '' || Image1 == null) && isImg1mad) ?
                                                                                <TouchableOpacity onPress={() => { openCamera(window, splitItem, splitItemIndex, '1') }}>
                                                                                    <CameraImg5 width={50} height={50}  />
                                                                                </TouchableOpacity> : (Image1 == '' || Image1 == null) ?
                                                                                    <TouchableOpacity onPress={() => { openCamera(window, splitItem, splitItemIndex, '1') }}>
                                                                                        <CameraImg2 width={50} height={50}  />
                                                                                    </TouchableOpacity> : (Image1 != '' || Image1 != null) ?
                                                                                        <TouchableOpacity onPress={() => { OpenImgModal(Image1, window, splitItem, splitItemIndex, '1') }}>
                                                                                            <CameraImg3 width={50} height={50}  />
                                                                                        </TouchableOpacity> : null
                                                                            }
                                                                            <Text style={customStyle.WSCameraLabel}>{camera1Label}</Text>
                                                                        </View>
                                                                    }
                                                                    {isImage2 == 1 &&
                                                                        <View style={customStyle.openStkCameraCon}>
                                                                            {/* { (Image2=='' || Image2==null) && 
                                                        <TouchableOpacity style={[customStyle.osCat_action_openCam,customStyle.osCat_actn_margin]} onPress={()=>{openCamera(window,splitItem,splitItemIndex,'2')}}>
                                                            <SvgXml width={80} height={80} xml={cameraImg}/>                                     
                                                        </TouchableOpacity>
                                                    }
                                                    { (Image2!='' && Image2!=null)  && 
                                                        <View style={customStyle.osCatImageView}>
                                                            <Image style={customStyle.osCatImage} source={{uri:Image2}}/>
                                                            <TouchableOpacity style={[customStyle.osCat_action_reCap]} onPress={()=>{openCamera(window,splitItem,splitItemIndex,'2')}}>
                                                                <MaterialCommunityIcons name='camera-retake' size={20} color={PageTheme.$accent_color}/>                                   
                                                            </TouchableOpacity>
                                                        </View>                                    
                                                    }       */}
                                                                            {((Image2 == '' || Image2 == null) && isImg2mad) ?
                                                                                <TouchableOpacity onPress={() => { openCamera(window, splitItem, splitItemIndex, '2') }}>
                                                                                    <CameraImg5 width={50} height={50} />
                                                                                </TouchableOpacity> : (Image2 == '' || Image2 == null) ?
                                                                                    <TouchableOpacity onPress={() => { openCamera(window, splitItem, splitItemIndex, '2') }}>
                                                                                        <CameraImg2 width={50} height={50} />
                                                                                    </TouchableOpacity> : (Image2 != '' || Image2 != null) ?
                                                                                        <TouchableOpacity onPress={() => { OpenImgModal(Image2, window, splitItem, splitItemIndex, '2') }}>
                                                                                            <CameraImg3 width={50} height={50}  />
                                                                                        </TouchableOpacity> : null
                                                                            }
                                                                            {console.log('camera2Label 2:', camera2Label)}
                                                                            <Text style={customStyle.WSCameraLabel}>{camera2Label}</Text>
                                                                        </View>
                                                                    }
                                                                </View>
                                                            );
                                                        }}
                                                    />
                                                </View>
                                            }

                                            {(WindowQuestions.length > 0) &&
                                                <View style={[customStyle.openStk_prd_borderT, customStyle.pt10, customStyle.mb10]}>
                                                    <LinearGradient colors={[PageTheme.$secondary_color_light, PageTheme.$bg_color, PageTheme.$fourth_color, PageTheme.$bg_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                        <Text style={customStyle.windhdrText}>{'Window Questions'}</Text>
                                                    </LinearGradient>
                                                    {WindowQuestions.map((item, index) => {

                                                        let qtn = item;
                                                        let qtnIndex = index;
                                                        let selansid = '', selanswer = '', selimg = '', showImageTag = false;
                                                        let id_key = qtn.WindowQuestionId + '_AnswerId';
                                                        let ans_key = qtn.WindowQuestionId + '_Answer';
                                                        let multi_key = qtn.WindowQuestionId + '_MultiOption';
                                                        let date_key = qtn.WindowQuestionId + '_Date';
                                                        let img_key = qtn.WindowQuestionId + '_ImagePath1';
                                                        let imgname_key = qtn.WindowQuestionId + '_ImageName1';
                                                        let rating_key = qtn.WindowQuestionId + '_Rating';

                                                        let list_mcdata = [];

                                                        if (qtn.QuestionType == 'Single choice list') {
                                                            selansid = QuestionsData[id_key] != null ? QuestionsData[id_key] : '';
                                                            selanswer = QuestionsData[ans_key] != null ? QuestionsData[ans_key] : '';
                                                        }
                                                        else if (qtn.QuestionType == 'Multi choice list') {
                                                            if (qtn.Answers != null) {
                                                                for (var i = 0; i < qtn.Answers.length; i++) {
                                                                    let obj = { 'AnswerId': parseInt(qtn.Answers[i].AnswerId), 'Answer': qtn.Answers[i].Answer };
                                                                    list_mcdata.push(obj);
                                                                }
                                                            }
                                                            selansid = QuestionsData[multi_key] != null && QuestionsData[multi_key] != '' ? QuestionsData[multi_key].split(',') : [];
                                                            // if(selansid!=null && selansid.length>0){
                                                            //     let arr=[];
                                                            //     for(var i=0;i<selansid.length;i++){
                                                            //         arr.push(parseInt(selansid[i]));
                                                            //     }
                                                            //     selansid=arr;
                                                            // }
                                                        }
                                                        else if (qtn.QuestionType == 'Number' || qtn.QuestionType == 'Text' || qtn.QuestionType == 'Decimal' || qtn.QuestionType == 'Date') {
                                                            selansid = QuestionsData[ans_key];
                                                            selanswer = (qtn.QuestionType == 'Date') ? (QuestionsData[date_key] || moment().format('MM/DD/YYYY')) : '';
                                                            showImageTag = (qtn.WQShowCamera == 1 || qtn.WQShowCamera == 'true');
                                                        }
                                                        else if (qtn.QuestionType == 'Rating') {
                                                            selanswer = QuestionsData[ans_key] ? QuestionsData[ans_key] : '';
                                                        }


                                                        if ((qtn.QuestionType == 'Single choice list' || qtn.QuestionType == 'Multi choice list')) {
                                                            if (qtn.Answers && qtn.Answers.length > 0) {
                                                                for (var i = 0; i < qtn.Answers.length; i++) {
                                                                    let ansss = qtn.Answers[i];
                                                                    let isandImgAl = (ansss.WAShowCamera == 'true' || ansss.WAShowCamera == 1);

                                                                    if (qtn.QuestionType == 'Single choice list' && (isandImgAl && ansss.AnswerId == selansid)) {
                                                                        showImageTag = true;
                                                                    }
                                                                    else if (qtn.QuestionType == 'Multi choice list' && (isandImgAl && selansid.indexOf(ansss.AnswerId) >= 0)) {
                                                                        showImageTag = true;
                                                                    }

                                                                }
                                                            }
                                                        }

                                                        if (showImageTag) {
                                                            selimg = QuestionsData[img_key] != null && QuestionsData[img_key] != '' ? 'file://' + QuestionsData[img_key] : '';
                                                        }

                                                        return (
                                                            <View style={[customStyle.sform_group2,]} key={'Qtn_' + qtnIndex} >
                                                                <Text style={[customStyle.sform_label3]}>{qtn.WindowQuestionName}</Text>
                                                                {qtn.QuestionType == 'Single choice list' && qtn.Answers &&
                                                                    render_Picker('Answer', 'AnswerId', onselectionChange2, { value: selanswer, qtn: qtn, window: window })
                                                                }
                                                                {qtn.QuestionType == 'Multi choice list' && qtn.Answers &&
                                                                    <MultiSelect
                                                                        items={list_mcdata}
                                                                        uniqueKey="AnswerId"
                                                                        onSelectedItemsChange={(selectedItems) => { setMultiSelectValue(selectedItems, qtn, window) }} //setMultiSelectValue(selectedItems,qtn)
                                                                        selectedItems={selansid}
                                                                        selectText="Pick Items"
                                                                        searchInputPlaceholderText="Search Items..."
                                                                        // onChangeInput={ (text)=> console.log(text)}
                                                                        tagRemoveIconColor={PageTheme.$primary_color}
                                                                        tagBorderColor={PageTheme.$primary_color}
                                                                        tagTextColor={PageTheme.$primary_color}
                                                                        selectedItemTextColor={PageTheme.$primary_color}
                                                                        selectedItemIconColor={PageTheme.$primary_color}
                                                                        itemTextColor={PageTheme.$text_color}
                                                                        displayKey="Answer"
                                                                        searchInputStyle={{ color: '#CCC' }}
                                                                        submitButtonColor={PageTheme.$primary_color}
                                                                        submitButtonText="Submit"
                                                                    />
                                                                }
                                                                {(qtn.QuestionType == 'Number' || qtn.QuestionType == 'Decimal' || qtn.QuestionType == 'Text') &&
                                                                    <TextInput
                                                                        style={[customStyle.WQ_InputStyle]}
                                                                        placeholder=""
                                                                        autoComplete='off'
                                                                        placeholderTextColor={PageTheme.$placeholder_color}
                                                                        // keyboardType={'ascii-capable'}
                                                                        keyboardType={(qtn.QuestionType == 'Decimal' ? 'decimal-pad' : (qtn.QuestionType == 'Text' ? 'default' : 'number-pad'))}
                                                                        value={selansid}
                                                                        onChangeText={(val) => { setTextValue(val, qtn, window, (qtn.QuestionType == 'Decimal' ? 'decimal' : (qtn.QuestionType == 'Text' ? 'text' : 'numeric'))) }}
                                                                    />
                                                                }
                                                                {
                                                                    (qtn.QuestionType == 'Date') &&
                                                                    <View style={customStyle.surveyQtn_datePicker_con}>
                                                                        <Text style={customStyle.WQ_datePicker_text}>{selansid != '' ? selansid : 'MM/YYYY'}</Text>
                                                                        <TouchableOpacity style={[customStyle.surveyQtn_datePicker]} onPress={() => { setDateValue(selanswer); showQtnDatePicker(qtn, window, true) }}>
                                                                            <Fontisto size={20} color={PageTheme.$accent_color} name="date" />
                                                                        </TouchableOpacity>
                                                                    </View>
                                                                }
                                                                {((qtn.showDatePicker == true || qtn.showDatePicker == 'true') && (qtn.QuestionType == 'Date')) &&
                                                                    renderDatePicker(qtn, window)
                                                                }
                                                                {
                                                                    (qtn.QuestionType == 'Rating') &&
                                                                    <View style={customStyle.surveyQtn_datePicker_con}>
                                                                        <Text style={customStyle.surveyQtn_datePicker_text}>{selanswer}</Text>
                                                                        <TouchableOpacity style={[customStyle.surveyQtnRatingIcon]} onPress={() => { setRatingQtn(qtn); setRatingWindow(window); setShowRating(true); }}>
                                                                            <MaterialCommunityIcons size={25} color={PageTheme.$accent_color} name="drag" />
                                                                        </TouchableOpacity>
                                                                    </View>
                                                                }

                                                                {
                                                                    // (qtn.QuestionType=='Audio') && 
                                                                    // <View style={customStyle.surveyQtn_datePicker_con}>
                                                                    //     <Text style={customStyle.surveyQtn_datePicker_text}>{selanswer}</Text>
                                                                    //     <TouchableOpacity style={[customStyle.surveyQtnRatingIcon]} onPress={()=>{show_recorder(qtn);}}>
                                                                    //         <FontAwesome size={25} color={PageTheme.$accent_color} name="microphone"/>
                                                                    //     </TouchableOpacity> 
                                                                    // </View>    
                                                                }

                                                                {
                                                                    (!isKPIIREnable && (showImageTag)) &&
                                                                    <View style={[customStyle.store_audit_img_con,]}>
                                                                        <Image source={(selimg != '' && selimg != null) ? { uri: selimg } : require('../assets/image/greybg.jpg')} style={[customStyle.store_audit_image, ((selimg != '' && selimg != null) ? { resizeMode: 'contain' } : { width: 100, height: 150, resizeMode: 'stretch', alignSelf: 'center' })]} />
                                                                        <TouchableOpacity style={customStyle.store_audit_pickimg_btn} onPress={() => { openCamera(window, {}, 0, '1', '2', qtn) }}>
                                                                            <Entypo name="camera" color={PageTheme.$text_color} size={28} />
                                                                        </TouchableOpacity>
                                                                    </View>
                                                                }


                                                            </View>
                                                        )
                                                    })}
                                                </View>
                                            }


                                        </View>
                                    }



                                </View>
                            </View>
                        </View>
                    );
                }}
            />
        )
    }



    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 = () => {
        console.log("onclear---------", DataCleanItem)
        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'} BottomText={'Store Name:' + storeData.StoreName + ' | Store Id:' + storeData.StoreId + ' | User Id:' + storeData.EmpId + ' | Image Type: ' + currentMenu.MenuName} gridEnable={GridValue} onImageCaptured={(imgData) => { setShowCamera(false); getImage(imgData) }} showCamera={showCamera} onHideCamera={() => { setShowCamera(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]}>
                    {Object.keys(storeData).length > 0 &&
                        <View style={customStyle.Windows_Wrap}>
                            {_renderWindow()}
                        </View>
                    }
                    {_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)(WindowIR);