import React, { useState, useEffect, useRef } from 'react';
import Container from '../components/container';
import { CurrentRenderContext, 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, Keyboard } from 'react-native';
import { ReactReduxContext, connect, useSelector, useDispatch } from 'react-redux';
import { mapStateToProps, mapDispatchToProps } from '../reducers/contextProvider';
import { notify } from '../components/notify';
import moment from 'moment';
import { getDownloadJson, getKPIFields, marktext1, marktext2, resizeImage, 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 addImg from '../assets/performics/add_image.svg';
import CustomModal from '../components/CustomModal';
import { Q_getpaidvisibility } from '../constants/ConstantQueries';
import { Picker } from '@react-native-picker/picker';
import { ConfirmSaveAlert } from '../components/alert';
import ModalSelector from 'react-native-modal-selector'
import { CustomPicker, CustomPicker2 } from '../components/CustomPicker';
import CustomCamera from '../components/Camera';
import ImageViewer from 'react-native-image-zoom-viewer';
import DateTimePicker from '@react-native-community/datetimepicker';
import CheckBox from '@react-native-community/checkbox';

import MultiSelect from 'react-native-multiple-select';

import CameraImg3 from '../assets/performics/camera_tick.svg';
import CameraImg2 from '../assets/performics/camera_icon.svg';
import CameraImg5 from '../assets/image/astrickcamera.svg';
import { PageTheme } from '../styles/Themes';

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

    // get all theme styles acc to current theme set 
    const PageTheme = GetPageTheme(props.DarkMode, route.name);
    const customStyle = customStyles(props.DarkMode, route.name);
    const animatedChoice = useRef(new Animated.Value(0)).current;

    const [processing, setProcessing] = useState(true);
    const [loaderTitle, setLoaderTitle] = useState();
    const [isAdhocScreen, setIsAdhocScreen] = useState(false);
    const [storeData, setStoreData] = useState({});
    const [StoreCameraAllow, setStoreCameraAllow] = useState(true);
    const [currentMenu, setCurrentMenu] = useState({});
    const [rerenderdata, setrerenderdata] = useState(0);
    const [rerenderdata2, setrerenderdata2] = useState(0);
    const [rerenderdata3, setrerenderdata3] = useState(0);
    const [rerenderdata4, setrerenderdata4] = useState(0);

    const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);

    const [WindowData, setWindowData] = useState([]);
    const [reasons_list, setReasons_list] = useState([]);
    const [Windows, setWindows] = useState([]);
    const [show_zoomImage, setShow_zoomImage] = useState(false);
    const [refImageIndex, setrefImageIndex] = useState(0);
    const [showAlert, setShowAlert] = useState(false);
    const [zoomImageUrl, setZoomImageUrl] = useState([]);
    const [showCamera, setShowCamera] = useState(false);
    const [getImageProps, setGetImageProps] = useState({});
    const zoomView = 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 [searchedItem, setSearchedItem] = useState('');
    const [globalWindows, setGlobalWindows] = useState([]);
    const [KPIFields, setKPIFields] = useState([]);
    const [showSwitchCamera, setShowSwitchCamera] = useState(false);
    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 [ItemsInView, setItemsInView] = useState([]);

    const hasUnsavedChangesRef = React.useRef(hasUnsavedChanges);
    const WindowDataRef = React.useRef(WindowData);
    const StoreIdRef = React.useRef(null);
    const ScreenNameRef = React.useRef('');
    const QARef = useRef(Windows);


    const onViewableItemsChanged = ({ viewableItems, }) => {
        // Do stuff
        console.log("onViewableItemsChanged called:")
        setItemsInView(viewableItems);
    };

    const FlatLConfCallbackPairs = useRef([{ viewabilityConfig: { itemVisiblePercentThreshold: 50 }, onViewableItemsChanged }]);

    // error field states
    const [errorfield, setErrorField] = useState({});
    const [error, setError] = useState(false);



    const inputRefs = useRef({});

    const d1 = new Date();
    const d2 = moment(d1).format('MM/DD/YYYY');


    useEffect(() => {

        setLoaderTitle(ST.Loading + '...')
        let params = props.route.params ? props.route.params : {};
        let storeData1 = params.storeData || {};
        let menu1 = params.menu || {};
        let cameraAllow = storeData1.CameraAllow == 'true' || storeData1.CameraAllow == 1 ? true : false;
        setStoreCameraAllow(cameraAllow);

        let isAdhoc = params.isAdhoc || false;
        setIsAdhocScreen(isAdhoc);
        setStoreData(storeData1);
        setCurrentMenu(menu1);

        StoreIdRef.current = storeData1.StoreId
        ScreenNameRef.current = menu1.ScreenName
        getData(storeData1, menu1);

        const AppStateSubscription = AppState.addEventListener('change', (pro) => { _handleAppStateChange(pro) });
        const unsubscribe = props.navigation.addListener('beforeRemove', onBeforeRemove);

        return function cleanup() {
            AppStateSubscription.remove();
            // AppState.removeEventListener('change', (pro)=>{ _handleAppStateChange(WindowData,pro)});      
            return unsubscribe;
        };
    }, []);

    const _handleAppStateChange = async (nextAppState) => {
        if (nextAppState == 'background' && hasUnsavedChangesRef.current == true) {

            let newData = {
                storeBGData: WindowDataRef.current,
                menuName: ScreenNameRef.current,
                StoreId1: StoreIdRef.current,
                QARef: QARef.current,
                visiteDate: d2
            }
            let WindowsStr = JSON.stringify(newData)
            await set_item('storeData', WindowsStr);
        }
    }

    useEffect(() => {
        const unsubscribe = props.navigation.addListener('beforeRemove', onBeforeRemove);
        return unsubscribe;
        // AppState.removeEventListener('change',(pro)=>{ _handleAppStateChange(WindowData,pro)});
        // AppState.addEventListener('change',(pro)=>{ _handleAppStateChange(WindowData,pro)});
    }, [hasUnsavedChanges]);

    // useEffect(() => {
    //     AppState.removeEventListener('change',(pro)=>{ _handleAppStateChange(WindowData,pro)});
    //     AppState.addEventListener('change',(pro)=>{ _handleAppStateChange(WindowData,pro)});
    // }, [WindowData]); 

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

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

    function onBeforeRemove(e) {
        if (showCamera == true) {
            e.preventDefault();
            setShowCamera(false);
        }
        else if (show_zoomImage == true) {
            e.preventDefault();
            setShow_zoomImage(false);
        }
        else {
            if (hasUnsavedChanges == true) {
                e.preventDefault(); // Prevent default behavior of leaving the screen
                onRemoveScreen(e);
            }
            else {
                return;
            }
        }
    }

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

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

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


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

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

            // set switch camera flag as defined in mapping menu flag (if exists)
            let SwitchingCameraI = AllKPIFields.findIndex(i => i.KPIFieldName == 'SwitchingCamera');
            let SwitchingCameraObj = SwitchingCameraI >= 0 ? AllKPIFields[SwitchingCameraI] : {};
            let SwitchingCamera = SwitchingCameraI >= 0 ? SwitchingCameraObj['KPIFieldEnable'] : false;
            setShowSwitchCamera(SwitchingCamera);

            let inputChangeFlag = [], storeBGData1 = [], bgStoreJson = {}, isBgDataExists = false;
            let windData = await get_item('storeData')
            if (windData != null && windData != '') {
                let StoreJson = JSON.parse(windData)
                let { storeBGData, menuName, StoreId1, visiteDate } = StoreJson
                if (storeBGData.length > 0 && menuName == menu1.ScreenName && StoreId1 == StoreId && visiteDate == d2) {
                    isBgDataExists = true;
                    storeBGData1 = storeBGData;
                    bgStoreJson = StoreJson
                    // setWindowData(storeBGData);
                    BgUnsavedChanges(true)
                    BgWindowData(storeBGData)
                }
            }
            await db.transaction(async function (txn) {


                let q3 = `Select distinct CategoryReasonId as ReasonId,CategoryReason as Reason From Master_CategoryReason`;
                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 selectlist = ` distinct w.STORE_ID as StoreId,w.CAT_HEADER_ID as CatHeaderId,wd.CategoryDefinitionId,wd.CategoryId,wd.CategoryName,wd.CategoryRefImage,wd.CategoryRefImagePopUp,wd.CategoryElementCheckAssortment,wd.CategoryElementStockRequired,w.IS_PRESENT as IsPresent,wd.CategoryNotExistCamera,w.CATE_NA_IMAGE as CatNAImage,wd.CategoryExistReasonEnable,wd.CategoryNotExistReasonEnable,w.REASON_ID as ReasonId,w.REASON as Reason,w.REMARK as Remark,wd.NoOfSplit,wd.CategoryImage1,wd.CategoryImage2,wd.CategoryImage1Lable,wd.CategoryImage2Lable,wd.CategoryImage1CameraGrid,wd.CategoryImage2CameraGrid,wd.StockQtyRequired`;
                let join = ` inner join Master_CategoryDefinition wd on w.CAT_DEFINITION_ID=wd.CategoryDefinitionId `;
                let q = ` Select ${selectlist} from ${AppTables.CATEXE_HDR_DATA} w  ${join} where w.STORE_ID='${StoreId}' order by wd.CatDefSequence `;

                // else pick data from masters
                let selectlist2 = ` distinct s.StoreId,w.CategoryDefinitionId,w.CategoryId,w.CategoryName,w.CategoryRefImage,w.CategoryRefImagePopUp,w.CategoryElementCheckAssortment,w.CategoryElementStockRequired,'' as IsPresent,w.CategoryNotExistCamera,'' as CatNAImage,w.CategoryExistReasonEnable,w.CategoryNotExistReasonEnable,'' as ReasonId,'' as Reason,w.NoOfSplit,w.CategoryImage1,w.CategoryImage2,w.CategoryImage1Lable,w.CategoryImage2Lable,w.CategoryImage1CameraGrid,w.CategoryImage2CameraGrid,w.StockQtyRequired`;
                let join2 = ` inner join Mapping_StoreCategory s on w.CategoryDefinitionId=s.CategoryDefinitionId  `;
                let q2 = ` Select ${selectlist2} from Master_CategoryDefinition w  ${join2} where s.StoreId='${StoreId}' order by w.CatDefSequence `;

                // console.log('Promotion ',q);
                await txn.executeSql(q, [], async function (txn2, txnres2) {
                    console.log('catexec items', txnres2.rows.length);
                    if (txnres2.rows.length > 0) {
                        let arr = []; let images = [];
                        let allWindowsData = []

                        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.VisibilityId==data.VisibilityId && i.VisibilityDefinitionId==data.VisibilityDefinitionId)
                                // let storeBgObj=storeBgIndex>=0?storeBGData1[storeBgIndex]:{};
                                // isPresent=storeBgObj.isPresent

                                let storeBgIndex = storeBGData1.findIndex(i => i.CategoryId == data?.CategoryId && i.CategoryDefinitionId == data?.CategoryDefinitionId);
                                let storeBgObj = storeBgIndex >= 0 ? storeBGData1[storeBgIndex] : null;
                                isPresent = storeBgObj.isPresent == 1 ? 1 : 0;
                            }
                            let isPresentValue = ((isPresent == 1) || (isPresent == true)) ? true : false
                            let animatedChoice = new Animated.Value(isPresent);
                            let animatedHeight = new Animated.Value(450);
                            data.animatedHeight = animatedHeight
                            data.animatedChoice = animatedChoice;

                            data.NoOfSplit = parseInt(data.NoOfSplit);

                            let NoOfSplit = data.NoOfSplit;

                            let isStockReq = data.CategoryElementStockRequired == 'true' || data.CategoryElementStockRequired == 1 ? 1 : 0;

                            let imgObj = { imgIndex: (i + 1), url: data.CategoryRefImage, props: {} }
                            images.push(imgObj);
                            let WindowSplits = await getWindowSplits(NoOfSplit, data, storeData1, menu1);
                            let WQr = await getWindowQuestions(data, storeData1, isPresentValue, menu1, isBgDataExists);
                            let WindowQuestions = WQr['WindowQuestions'] || [];
                            let WindowQA = WQr['WindowQA'] || {};
                            let WSd = isStockReq == true ? await getWindowStockData(data, storeData1, isPresent) : { 'WStocks': [], 'WStocksData': [] };

                            let WStocks = WSd['WStocks'] || [];
                            let WStocksData = WSd['WStocksData'] || [];
                            let isAllChecked = WSd['isAllChecked'] != null ? WSd['isAllChecked'] : 0;

                            let isNAImageAvl = data.CategoryNotExistCamera == 'true' || data.CategoryNotExistCamera == 1 ? 1 : 0;
                            let NAImage1 = isNAImageAvl == 1 && data.CatNAImage != null ? data.CatNAImage : '';
                            let NAImage1Path = NAImage1 != '' ? `file://${ImageFolderPath + menu1.ScreenName}/` + NAImage1 : '';


                            let windowDataObj = { 'CategoryId': data.CategoryId, 'CategoryDefinitionId': data.CategoryDefinitionId, 'WindowSplits': WindowSplits, 'WindowQA': WindowQA, 'WStocksData': WStocksData, 'NAImage1': NAImage1, 'NAImage1Path': NAImage1Path, 'ReasonId': data.ReasonId, 'Reason': data.Reason, 'isPresent': isPresent, 'isAllSKUChecked': isAllChecked, 'remark': (data.Remark != null ? data.Remark : '') };
                            data['WindowQuestions'] = WindowQuestions;
                            data['WindowStocks'] = WStocks;

                            let changesFlag = { CategoryId: data.CategoryId, CategoryDefinitionId: data.CategoryDefinitionId, Flag: true }
                            inputChangeFlag.push(changesFlag)

                            arr.push(data);

                            allWindowsData.push(windowDataObj);
                            if (i == txnres2.rows.length - 1) {

                                if (!isBgDataExists) {
                                    BgWindowData(allWindowsData)
                                }
                                setInputChange(inputChangeFlag)
                                // setWindowData(allWindowsData);
                                setWindows(arr);
                                setGlobalWindows(arr);

                                setZoomImageUrl(images);
                                setProcessing(false);
                            }
                        }
                    }
                    else {

                        await txn.executeSql(q2, [], async function (txn2, txnres2) {
                            console.log('catexec items load', txnres2.rows.length);
                            if (txnres2.rows.length > 0) {
                                let arr = [], images = [], allWindowsData = [];
                                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.VisibilityId==data?.VisibilityId && i.VisibilityDefinitionId==data.VisibilityDefinitionId)
                                    //     // let storeBgIndex=storeBGData1.findIndex(i=>i.CategoryId==data?.CategoryId && i.CategoryDefinitionId==data.CategoryDefinitionId)
                                    //     let storeBgObj=storeBgIndex>=0?storeBGData1[storeBgIndex]:{};
                                    //     isPresent=storeBgObj?.isPresent ;
                                    // }
                                    if (isBgDataExists) {
                                        let storeBgIndex = storeBGData1.findIndex(
                                            i => i.CategoryId == data?.CategoryId && i.CategoryDefinitionId == data?.CategoryDefinitionId
                                        );

                                        let storeBgObj = storeBgIndex >= 0 ? storeBGData1[storeBgIndex] : null;
                                        isPresent = storeBgObj.isPresent == 1 ? 1 : 0;
                                    }

                                    let animatedChoice = new Animated.Value(isPresent);
                                    let animatedHeight = new Animated.Value(450);
                                    data.animatedHeight = animatedHeight
                                    data.animatedChoice = animatedChoice;

                                    data.NoOfSplit = parseInt(data.NoOfSplit);
                                    let isStockReq = data.CategoryElementStockRequired == 'true' || data.CategoryElementStockRequired == 1 ? 1 : 0;

                                    let imgObj = { imgIndex: (i + 1), url: data.CategoryRefImage, 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, isBgDataExists);
                                    let WindowQuestions = WQr['WindowQuestions'] || [];
                                    let WindowQA = WQr['WindowQA'] || {};
                                    let WSd = isStockReq == true ? await getWindowStockData(data, storeData1, false) : { 'WStocks': [], 'WStocksData': [] };

                                    let WStocks = WSd['WStocks'] || [];
                                    let WStocksData = WSd['WStocksData'] || [];
                                    let isAllChecked = WSd['isAllChecked'] != null ? WSd['isAllChecked'] : 0;

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

                                    let changesFlag = { CategoryId: data.CategoryId, CategoryDefinitionId: data.CategoryDefinitionId, Flag: false }
                                    inputChangeFlag.push(changesFlag)

                                    arr.push(data);
                                    allWindowsData.push(windowDataObj);
                                    if (i == txnres2.rows.length - 1) {
                                        if (!isBgDataExists) {
                                            BgWindowData(allWindowsData)
                                            QARef.current = arr
                                        }

                                        setInputChange(inputChangeFlag)
                                        // setWindowData(allWindowsData);
                                        setWindows(arr);
                                        setGlobalWindows(arr);
                                        setZoomImageUrl(images);
                                        setProcessing(false);
                                    }
                                }
                            }
                            else {
                                setProcessing(false);
                            }
                        }, function (txnE, txnerr) { console.log(txnerr); setProcessing(false); },);
                    }
                }, function (txnE, txnerr) { console.log(txnerr); setProcessing(false); },);

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

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

            db.transaction(async function (txn) {

                let q = `select * from ${AppTables.CATEXE_IMAGES} where CAT_HEADER_ID='${window.CatHeaderId}' and  STORE_ID='${storeData1.StoreId}' `;

                await txn.executeSql(q, [], async function (txn2, txnres2) {
                    console.log('cat exec images:', window.CatHeaderId, txnres2.rows.length);
                    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.CAT_HEADER_ID)
                            let isImage1 = window.CategoryImage1 == 'true' || window.CategoryImage1 == 1 ? 1 : 0;
                            let isImage2 = window.CategoryImage2 == 'true' || window.CategoryImage2 == 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 : '';

                            console.log('cat exec images:', Image1, 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, isBgDataExists = false) {
        let obj = { 'WindowQA': {}, 'WindowQuestions': [] }
        return new Promise((resolve, reject) => {

            db.transaction(async function (txn) {
                var q = '', selectlist = '', join = '', join2 = '';
                console.log("CategoryName-----", window?.CategoryName)
                if ((isInserted == true) && (!isBgDataExists)) {
                    selectlist = ` DISTINCT  q.QUESTION_ID as CategoryQuestionId,q.QUESTION_CODE as CategoryQuestionCode,wq.CategoryQuestionName,wq.QuestionType,wq.CQShowCamera,wq.CQCameraMandatory,wq.CQLengthValidationRequired,wq.CQMinimumChar,wq.CQMaximumChar,wq.CQDecimalPoint,wq.CQDateRangeMin,wq.CQDateRangeMax,wq.CQVoiceLengthInMinutes,wq.CQDefaultQuestionEnable,q.IS_DISABLED,q.ANSWER as Answer,q.ANSWER_ID as AnswerId,q.MULTI_OPTIONS_IDS as multi_op_ids,q.IMAGE_ALLOW1 as CAShowCamera,q.IMAGE1 as Image1  `;
                    join2 = ` inner join Mapping_CategoryQuestion mq on mq.CategoryQuestionId=wq.CategoryQuestionId `;
                    join = ` inner join Master_CategoryQuestion wq on wq.CategoryQuestionId=q.QUESTION_ID `;
                    q = `select ${selectlist} from ${AppTables.CATEXE_CHILD_DATA} q ${join} ${join2} where q.STORE_ID='${storeData1.StoreId}' and q.CAT_DEFINITION_ID='${window.CategoryDefinitionId}' and q.CAT_ID='${window.CategoryId}' order by wq.CategoryQuestionSequence  `;
                }
                else {
                    selectlist = ` DISTINCT  wq.CategoryQuestionId,wq.CategoryQuestionCode,wq.CategoryQuestionName,wq.QuestionType,wq.CQShowCamera,wq.CQCameraMandatory,wq.CQLengthValidationRequired,wq.CQMinimumChar,wq.CQMaximumChar,wq.CQDecimalPoint,wq.CQDateRangeMin,wq.CQDateRangeMax,wq.CQVoiceLengthInMinutes,wq.CQDefaultQuestionEnable `;
                    join = ` inner join Mapping_CategoryQuestion mq on mq.CategoryQuestionId=wq.CategoryQuestionId `;
                    q = `select ${selectlist} from Master_CategoryQuestion wq  ${join} where mq.CategoryDefinitionId='${window.CategoryDefinitionId}' order by wq.CategoryQuestionSequence  `;
                }

                await txn.executeSql(q, [], async function (txn2, txnres2) {
                    // console.log("qtn count:",txnres2.rows.length,q)
                    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.CQDefaultQuestionEnable = data.CQDefaultQuestionEnable == 1 || data.CQDefaultQuestionEnable == 'true' ? true : false;
                            if (isInserted) {
                                data['isDisabled'] = data.IS_DISABLED == true || data.IS_DISABLED == "true" ? true : false;
                            }
                            else {
                                data['isDisabled'] = !data.CQDefaultQuestionEnable;
                            }

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


                            let showImageTag = (data.CQShowCamera == 'true' || data.CQShowCamera == 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.CAShowCamera == 1 || ansss.CAShowCamera == '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  CategoryAnswerId as AnswerId,CategoryAnswerName as Answer,CAShowCamera,CACameraMandatory,CAQuestionEnable,CAQuestionDisable `;
                q = `select ${selectlist} from  Master_CategoryQuestion  where CategoryQuestionId='${qtn.CategoryQuestionId}'  order by CASequence  `;

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

    async function getWindowStockData(window, storeData1, isInserted = false) {
        let obj = { 'WStocks': [], 'WStocksData': [], 'isAllChecked': 0 }
        let { StateId, ChainId, StoreTypeId, StoreClassId, StoreCategoryId } = storeData1;
        return new Promise((resolve, reject) => {
            db.transaction(async function (txn) {
                let checkassrt = window.CategoryElementCheckAssortment == 'true' || window.CategoryElementCheckAssortment == 1 ? true : false;
                let join = '', join2 = '';
                if (checkassrt) {
                    join = ` inner join Mapping_ProductAssortmentStorewise a on a.ProductId=s.CAT_STOCK_VALUE and a.StoreId='${storeData1.StoreId}' `;
                }
                let selectlist1 = `  s.CAT_STOCK_DEFINITION_ID as CategoryStockDefinitionId, s.CAT_DEFINITION_ID as CategoryDefinitionId,s.CAT_STOCK_TABLE as CategoryStockTable,s.CAT_STOCK_FIELD as CategoryStockField,s.CAT_STOCK_VALUE as CategoryStockValue,s.CAT_STOCK_MBQ as CategoryStockMBQ,s.PRODUCT_NAME as ProductName, s.STOCK as Stock,s.IS_CAT_PRESENT as isCatPresent `;
                let q = `select ${selectlist1} from  ${AppTables.CATEXE_STOCK_DATA} s ${join} where s.CAT_DEFINITION_ID='${window.CategoryDefinitionId}' and s.STORE_ID='${storeData1.StoreId}'  `;
                if (checkassrt) {
                    q += ` and a.StoreId='${storeData1.StoreId}' `;
                }
                q += ` order by s.PRODUCT_NAME `;

                if (checkassrt) {
                    join2 = ` inner join Mapping_ProductAssortmentStorewise a on a.ProductId=s.CategoryStockValue  and a.StoreId='${storeData1.StoreId}'`;
                }
                let selectlist2 = `  s.CategoryStockDefinitionId, s.CategoryDefinitionId,s.CategoryStockTable,s.CategoryStockField,s.CategoryStockValue,s.CategoryStockMBQ,s.ProductName `;
                let q2 = `select ${selectlist2} from  Master_CategoryStockDefinition s ${join2} where s.CategoryDefinitionId='${window.CategoryDefinitionId}'    `;

                if (checkassrt) {
                    q2 += ` and a.StoreId='${storeData1.StoreId}' `;
                }
                q2 += ` order by s.ProductName `;


                console.log(q);
                await txn.executeSql(q, [], async function (txn2, txnres2) {
                    console.log('All stocks:', txnres2.rows.length)
                    if (txnres2.rows.length > 0) {
                        let arr = [], WStocksData = [];
                        let isAllChecked = 1;
                        for (var i = 0; i < txnres2.rows.length; i++) {
                            let data = txnres2.rows.item(i);
                            if (isInserted == true && data.Stock != null) {
                                inputRefs.current['input1_' + data.CategoryDefinitionId + "_" + data.CategoryStockDefinitionId] = '';
                                let stockData_obj = { 'ProductId': data.CategoryStockValue, 'Stock': data.Stock, 'isCatPresent': (data.isCatPresent != null ? data.isCatPresent : 0) }
                                WStocksData.push(stockData_obj);

                            }
                            if (data.isCatPresent == null || data.isCatPresent == 0 || data.isCatPresent == '0' || data.isCatPresent == '') {

                                isAllChecked = 0;
                            }
                            arr.push(data);
                            if (i == txnres2.rows.length - 1) {
                                obj['WStocks'] = arr;
                                obj['WStocksData'] = WStocksData;
                                obj['isAllChecked'] = isAllChecked;
                                resolve(obj)
                            }
                        }
                    }
                    else {
                        await txn.executeSql(q2, [], async function (txn2, txnres3) {
                            console.log('All stocks load:', txnres3.rows.length)
                            if (txnres3.rows.length > 0) {
                                let arr = [], WStocksData = [];
                                let isAllChecked = 1;
                                for (var i = 0; i < txnres3.rows.length; i++) {
                                    let data = txnres3.rows.item(i);
                                    if (isInserted == true && data.Stock != null) {
                                        inputRefs.current['input1_' + data.CategoryDefinitionId + "_" + data.CategoryStockDefinitionId] = '';
                                        let stockData_obj = { 'ProductId': data.CategoryStockValue, 'Stock': data.Stock, 'isCatPresent': (data.isCatPresent != null ? data.isCatPresent : 0) }
                                        WStocksData.push(stockData_obj);
                                    }
                                    if (data.isCatPresent == null || data.isCatPresent == 0 || data.isCatPresent == '0' || data.isCatPresent == '') {
                                        isAllChecked = 0;
                                    }
                                    arr.push(data);
                                    if (i == txnres3.rows.length - 1) {
                                        obj['WStocks'] = arr;
                                        obj['WStocksData'] = WStocksData;
                                        obj['isAllChecked'] = isAllChecked;
                                        resolve(obj)
                                    }
                                }
                            }
                            else {
                                resolve(obj);
                            }
                        }, function (txnE, txnerr) { console.log(txnerr); resolve(obj) },);
                    }
                }, function (txnE, txnerr) { console.log(txnerr); resolve(obj) },);
            });
        }).then((val) => {
            return val
        }).catch((err) => {
            console.log(err);
            return obj;
        });
    }

    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].CategoryDefinitionId+'_'+WindowStocks[index+1].CategoryStockDefinitionId)
            let refIn2 = inputRefs.current['input1_' + WindowStocks[index + 1].CategoryDefinitionId + '_' + WindowStocks[index + 1].CategoryStockDefinitionId];
            if (refIn2 != null) {
                refIn2.focus();
            }
        }
        catch (err) {
            console.log(err);
        }

    }

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

        if (typeof imgdata == 'object' && imgdata.errorCode == 'camera_unavailable') {
            notify(ST.Cameraunavailable);
        }
        else if (typeof imgdata == 'object' && imgdata.uri != null) {
            const img = imgdata;
            console.log("imageee:", img)
            const imgurl = img.uri, imgWidth = img.width, imgHeight = img.ExtendedHeight;
            let isImgFromGallery = img.fromGallery != null ? img.fromGallery : false;
            let picture_clickedd = isImgFromGallery == true ? img.datetime : new Date();
            ////change by jeevanp
            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);
            ////change by jeevanp
            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.CategoryDefinitionId + '_' + window.CategoryId + '_' + (props.UserId || '') + '_CEImg-' + calculate_tym_date_for_filename + '.jpg';
            console.log(filename, "file_name");
            console.log("imageeeee:", filename)
            let allData = WindowData;
            let defData = { 'CategoryId': window.CategoryId, 'CategoryDefinitionId': window.CategoryDefinitionId };
            const wind_index = allData.findIndex(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
            let wind = wind_index >= 0 ? allData[wind_index] : defData;

            let camera1Label = window.CategoryImage1Lable || '';
            let camera2Label = window.CategoryImage2Lable || '';
            let extraLabel = '';

            if (cameraType == '2') {
                var QD = wind.WindowQA || {};
                var image_key = qtn.CategoryQuestionId + '_ImageName1';
                var image_key_path = qtn.CategoryQuestionId + '_ImagePath1';
                QD[image_key] = filename;
                extraLabel = 'Qtn Id: ' + qtn.CategoryQuestionId;
            }
            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 + ' | CatName:' + window.CategoryName + "(" + window.CategoryDefinitionId + ")" + (extraLabel != '' ? ' (' + extraLabel + ')' : '') + ' | Image Type: ' + currentMenu.MenuName + ' | Date:' + calculate_tym_date_over_img;
            console.log(mark_text1 + "\n" + mark_text2, "mark_text2");


            let imagePath = `${ImageFolderPath + currentMenu.ScreenName}/${filename}`;
            RNFS.copyFile(imgurl, imagePath)
                .then(async (resn) => {
                    // render data with clicked image
                    let uri = 'file://' + imagePath;
                    if (cameraType == '2') {
                        QD[image_key_path] = uri;
                        wind.WindowQA = QD;
                        wind_index >= 0 ? allData[wind_index] = wind : allData.push(wind);
                        BgWindowData(allData)
                        BgUnsavedChanges(true)
                        setrerenderdata3(!rerenderdata3);
                    }
                    else if (cameraType == '3') {
                        wind[image_key_path] = uri;
                        wind_index >= 0 ? allData[wind_index] = wind : allData.push(wind);
                        BgWindowData(allData)
                        BgUnsavedChanges(true)
                        setrerenderdata(!rerenderdata);
                    }
                    else {
                        console.log('split image updated');
                        splitItem[image_key_path] = uri;
                        splitItemIndex >= 0 ? WindowSplits[splitItemIndex] = splitItem : WindowSplits.push(splitItem);
                        wind.WindowSplits = WindowSplits;
                        wind_index >= 0 ? allData[wind_index] = wind : allData.push(wind);
                        BgWindowData(allData)
                        BgUnsavedChanges(true)
                        setrerenderdata2(!rerenderdata2);
                    }

                    let objIndex = InputChange.findIndex((obj => obj.CategoryId == window.CategoryId && obj.CategoryDefinitionId == window.CategoryDefinitionId));
                    let winArr = [...InputChange]
                    winArr[objIndex].Flag = true
                    setSelectedImg(uri)
                    setInputChange(winArr)
                    // add metdata then resize image and restored back to the imagePath
                    let restore_data = { "destFilePath": imagePath, "imgurl": imgurl, imgWidth, imgHeight, mark_text1, mark_text2 }
                    let is_restored = await restore_ImageWithMetaData(restore_data, imgdata);
                    console.log("image restored:", is_restored);
                })
                .catch(err => {
                    console.log('ERROR: image file write failed!!!');
                    console.log(err.message, err.code);
                });
        }
    }

    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 })
    }

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

    async function openCamera(window, splitItem, splitItemIndex, type = '1', cameraType = '1', qtn = {}) {
        setErrorField({});
        setError(false);
        let GridAllow = cameraType == '1' ? (type === '1' ? (window.CategoryImage1CameraGrid === 'true' || window.CategoryImage1CameraGrid == true) : (window.CategoryImage2CameraGrid === 'true' || window.CategoryImage2CameraGrid == true)) : false
        console.log("cat exexc GridAllow:", 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(ST.SavingData + '...');
        setProcessing(true);
        let d1n = new Date();
        let d3 = moment(d1n).format('MM/DD/YYYY');
        try {
            let { StoreId, ChainId, StateId, StoreTypeId } = storeData;
            await db.transaction(async function (txn) {

                //  remove old data
                await txn.executeSql(`DELETE FROM ${AppTables.CATEXE_HDR_DATA} WHERE STORE_ID='${StoreId}' 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.CATEXE_CHILD_DATA} WHERE STORE_ID='${StoreId}' 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.CATEXE_IMAGES} WHERE STORE_ID='${StoreId}' 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.CATEXE_STOCK_DATA} WHERE STORE_ID='${StoreId}' and VISIT_DATE='${d2}' `, [], async function (txn2, txnres) {
                    console.log('window stock data deleted');
                }, function (txnE, txnerr) { console.log(txnerr); },);



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

                for (const wi in globalWindows) {
                    const window = globalWindows[wi];
                    let isImage1 = window.CategoryImage1 == 'true' || window.CategoryImage1 == 1 ? 1 : 0;
                    let isImage2 = window.CategoryImage2 == 'true' || window.CategoryImage2 == 1 ? 1 : 0;
                    let isNAImageAvl = window.CategoryNotExistCamera == 'true' || window.CategoryNotExistCamera == 1 ? 1 : 0;
                    let isNAReasonEnable = window.CategoryNotExistReasonEnable == 'true' || window.CategoryNotExistReasonEnable == 1 ? 1 : 0;
                    let isReasonEnable = window.CategoryExistReasonEnable == 'true' || window.CategoryExistReasonEnable == 1 ? 1 : 0;
                    let isStockReq = window.CategoryElementStockRequired == 'true' || window.CategoryElementStockRequired == 1 ? 1 : 0;
                    let WindowQuestions = window.WindowQuestions || [];
                    let WindowStocks = window.WindowStocks || [];


                    const wind = WindowData.find(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
                    let isPresent = wind.isPresent != null && wind.isPresent != '' ? wind.isPresent : '0';
                    let ReasonId = wind.ReasonId != null ? wind.ReasonId : 0;
                    let Reason = wind.Reason != null ? wind.Reason : '';
                    let NAImage1 = wind.NAImage1 != null ? wind.NAImage1 : '';
                    let NAImage1Path = wind.NAImage1Path != null ? wind.NAImage1Path : '';
                    let remark = wind.remark != null ? wind.remark : '';
                    let WindowSplits = wind.WindowSplits || [];
                    let QD = wind.WindowQA || {};
                    let WStocksData = wind.WStocksData || [];

                    let CAT_HEADER_ID = 'WIND' + wi + (Math.floor(Math.random() * 1000) + 1);
                    let { CategoryDefinitionId, CategoryId, CategoryName } = window;


                    values += values != '' ? ' , ' : '';
                    values += ` ('${CAT_HEADER_ID}','${StoreId}','${d3}','${CategoryDefinitionId}','${CategoryId}','${CategoryName}','${isPresent}','${NAImage1}','${ReasonId}','${Reason}','${(remark || '')}','${d3}') `;

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

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

                            let { CategoryQuestionId, CategoryQuestionCode, QuestionType, CQShowCamera } = qtn
                            let answer = QD[ans_key] || 0;
                            let answerId = QD[id_key] == 0 ? 0 : (QD[id_key] || '');
                            let multi_options_ids = QD[multi_key] || '';

                            if (qtn.QuestionType == 'Number' || qtn.QuestionType == 'Text' || qtn.QuestionType == 'Decimal' || qtn.QuestionType == 'Date') {
                                showImageTag = (qtn.CQShowCamera == 1 || qtn.CQShowCamera == 'true');
                            }
                            else 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.CAShowCamera == 'true' || ansss.CAShowCamera == 1);
                                        if (qtn.QuestionType == 'Single choice list' && (isandImgAl && ansss.AnswerId == answerId)) {
                                            showImageTag = true;
                                        }
                                        else if (qtn.QuestionType == 'Multi choice list' && (isandImgAl && answerId.indexOf(ansss.AnswerId) >= 0)) {
                                            showImageTag = true;
                                        }

                                    }
                                }
                            }

                            let Image1 = showImageTag == 1 ? QD[imgname_key] : '';


                            childV += childV != '' ? ' , ' : '';
                            childV += ` ('${CAT_HEADER_ID}','${StoreId}','${d3}','${CategoryDefinitionId}','${CategoryId}','${CategoryQuestionId}','${CategoryQuestionCode}','${QuestionType}','${answer}','${answerId}','${multi_options_ids}','${Image1}','${showImageTag}','${d3}','${isDisabled}') `;
                        }
                        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 += ` ('${CAT_HEADER_ID}','${StoreId}','${d3}','${CategoryDefinitionId}','${CategoryId}','${Image1Name}','${Image2Name}','${d3}') `;

                        }
                        for (const stockProdIndex in WindowStocks) {
                            const stockProd = WindowStocks[stockProdIndex];
                            let sd = WStocksData.find(i => i.ProductId == stockProd.CategoryStockValue) || {};
                            let stock = sd.Stock != null ? sd.Stock : (sd.Stock == 0 ? sd.Stock : '');
                            let isCatPresent = sd.isCatPresent != null ? sd.isCatPresent : 0;
                            let { CategoryStockDefinitionId, CategoryDefinitionId, CategoryStockTable, CategoryStockField, CategoryStockValue, CategoryStockMBQ, ProductName } = stockProd
                            stockV += stockV != '' ? ' , ' : '';
                            stockV += ` ('${CAT_HEADER_ID}','${StoreId}','${d3}','${CategoryDefinitionId}','${CategoryId}','${CategoryStockDefinitionId}','${CategoryStockTable}','${CategoryStockField}','${CategoryStockValue}','${CategoryStockMBQ}','${ProductName}','${stock}','${isCatPresent}','${d3}') `;
                        }

                    }
                }

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


                let add_hdr_data = `INSERT INTO ${AppTables.CATEXE_HDR_DATA} (CAT_HEADER_ID,STORE_ID,VISIT_DATE,CAT_DEFINITION_ID,CAT_ID,CAT_NAME,IS_PRESENT,CATE_NA_IMAGE,REASON_ID,REASON,REMARK,ADDED_DATE) VALUES ${values} `;
                let add_child_data = `INSERT INTO ${AppTables.CATEXE_CHILD_DATA} (CAT_HEADER_ID,STORE_ID,VISIT_DATE,CAT_DEFINITION_ID,CAT_ID,QUESTION_ID,QUESTION_CODE,QUESTION_TYPE,ANSWER,ANSWER_ID,MULTI_OPTIONS_IDS,IMAGE1,IMAGE_ALLOW1,ADDED_DATE,IS_DISABLED) VALUES ${childV} `;
                let add_images_data = `INSERT INTO ${AppTables.CATEXE_IMAGES} (CAT_HEADER_ID,STORE_ID,VISIT_DATE,CAT_DEFINITION_ID,CAT_ID,IMAGE1,IMAGE2,ADDED_DATE) VALUES ${imageV} `;
                let add_stock_data = `INSERT INTO ${AppTables.CATEXE_STOCK_DATA} (CAT_HEADER_ID,STORE_ID,VISIT_DATE,CAT_DEFINITION_ID,CAT_ID,CAT_STOCK_DEFINITION_ID,CAT_STOCK_TABLE,CAT_STOCK_FIELD,CAT_STOCK_VALUE ,CAT_STOCK_MBQ,PRODUCT_NAME,STOCK,IS_CAT_PRESENT,ADDED_DATE) VALUES ${stockV} `;




                await txn.executeSql(add_hdr_data, [], async function (txn2, txnres) {
                    console.log('st header data added');
                    var isSplitImageAdded = true, isStockAdded = true, isChildAdded = 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 (!isSplitImageAdded) {
                        setProcessing(false); notify('Cannot add category execution images');
                    }
                    else if (!isStockAdded) {
                        setProcessing(false); notify('Cannot add category execution stock data');
                    }
                    else if (!isChildAdded) {
                        setProcessing(false); notify('Cannot add category execution questions data');
                    }
                    else {
                        // clear store data in local storage to avoiding re-set data for the store  
                        clear_item('storeData')
                        setProcessing(false); notify('Category Execution updated successfully');
                        props.navigation.goBack();
                    }

                }, function (txnE, txnerr) { console.log(txnerr); setProcessing(false); notify('Cannot add category execution 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;

    //     function showError(obj,isErr){
    //         setErrorField(obj);
    //         setError(isErr);
    //     }

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

    //         for (const wi in globalWindows){
    //             const window=globalWindows[wi];
    //             let isImage1=window.CategoryImage1=='true' || window.CategoryImage1==1?1:0;
    //             let isImage2=window.CategoryImage2=='true' || window.CategoryImage2==1?1:0;
    //             let isNAImageAvl=window.CategoryNotExistCamera=='true' || window.CategoryNotExistCamera==1?1:0;
    //             let isNAReasonEnable=window.CategoryNotExistReasonEnable=='true' || window.CategoryNotExistReasonEnable==1? 1:0;
    //             let isReasonEnable=window.CategoryExistReasonEnable=='true' || window.CategoryExistReasonEnable==1? 1:0;
    //             let isStockReq=window.CategoryElementStockRequired=='true' || window.CategoryElementStockRequired==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.CategoryId==window.CategoryId && i.CategoryDefinitionId==window.CategoryDefinitionId);
    //             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 remark=wind.remark!=null?wind.remark:'';
    //             let WindowSplits=wind.WindowSplits || [];
    //             let QD=wind.WindowQA || {};
    //             let WStocksData=wind.WStocksData || [];

    //             let errorobj = {'EF_Window':window};

    //             if(isPresent=='1'){
    //                 if(isReasonEnable==true && ReasonId=='' ){
    //                     errorobj['EF_NExistReason']="NExistReason";
    //                     showError(errorobj,true);
    //                     notify(`${ST.Pleaseselectreasonfor} ${window.CategoryName} `,'LONG');
    //                     resolve(false);return;
    //                 }
    //                 // else if(remark==''){
    //                 //     notify(`Please enter remark for ${window.CategoryName} `,'LONG');
    //                 //     resolve(false);return;
    //                 // }
    //                 else{
    //                     if(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==''){
    //                                 errorobj['EF_splitImage1']="splitImage1";
    //                                 errorobj['EF_splitItemIndex']=splitItemIndex;
    //                                 showError(errorobj,true);
    //                                 notify(`${ST.Pleaseclickallimagesfor} ${window.CategoryName}`,'LONG');
    //                                 resolve(false);return;
    //                             }
    //                             else if(isImage2==1 && Image2Name==''){
    //                                 errorobj['EF_splitImage2']="splitImage2";
    //                                 errorobj['EF_splitItemIndex']=splitItemIndex;
    //                                 showError(errorobj,true);
    //                                 notify(`${ST.Pleaseclickallimagesfor} ${window.CategoryName}`,'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.CategoryStockValue) || {};
    //                             let stock=sd.Stock!=null?sd.Stock:(sd.Stock==0?sd.Stock:'');
    //                             let isCatPresent=sd.isCatPresent!=null?sd.isCatPresent:0;

    //                             if(isCatPresent==1){
    //                                 isProductSelected=true;
    //                             }

    //                             if((isListedSKUEnable==true && isCatPresent==1 && StockQtyRequired==1 && stock=='') || (isListedSKUEnable!=true && (stock==null || stock==''))){
    //                                 errorobj['EF_stock']="input1_";
    //                                 errorobj['EF_stockProd']=stockProd;
    //                                 let refIn1=inputRefs.current['input1_'+window.CategoryDefinitionId+'_'+stockProd.CategoryStockDefinitionId];
    //                                 if(refIn1!=null){
    //                                     refIn1.focus();
    //                                 }
    //                                 showError(errorobj,true);
    //                                 notify(`${ST.Pleaseenterstockfor} ${window.CategoryName} ( ${stockProd.ProductName} ) `,'LONG');
    //                                 resolve(false);return;
    //                             }

    //                             if(isListedSKUEnable==true && stockProdIndex==WindowStocks.length-1){
    //                                 if(!isProductSelected){
    //                                     errorobj['EF_isProductSelected']="isProductSelected";
    //                                     showError(errorobj,true);
    //                                     notify(`${ST.PleaseselectatleastoneSKUfor} ${window.CategoryName} `,'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.CategoryQuestionId+'_AnswerId'; 
    //                             let ans_key=qtn.CategoryQuestionId+'_Answer'; 
    //                             let multi_key=qtn.CategoryQuestionId+'_MultiOption';
    //                             let date_key=qtn.CategoryQuestionId+'_Date';
    //                             let img_key=qtn.CategoryQuestionId+'_ImagePath1';
    //                             let imgname_key=qtn.CategoryQuestionId+'_ImageName1';
    //                             let rating_key=qtn.CategoryQuestionId+'_Rating'; 
    //                             let list_mcdata=[];
    //                             errorobj['EF_qtn']=qtn;

    //                             let isImgAllowed=(qtn.CQShowCamera=='true' || qtn.CQShowCamera==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(','):[];
    //                             }

    //                             let isDisabled=qtn.isDisabled;
    //                             if(!isDisabled){
    //                                 if(qtn.QuestionType=='Multi choice list' && selansid.length<=0){
    //                                     errorobj['EF_Qtn_MultiChoice']='Qtn_MultiChoice';
    //                                     showError(errorobj,true);
    //                                     notify(`${Pleaseselectoptionsfortherequiredfield} ${ST.In} ${window.CategoryName}`,'SHORT');
    //                                     resolve(false);return;
    //                                 }
    //                                 else if( checkForAnsKey && (Object.keys(QD).indexOf(ans_key)<0 || (Object.keys(QD).indexOf(ans_key)>=0 && QD[ans_key]===''))){
    //                                     errorobj['EF_Qtn_Date']='Qtn_Date';
    //                                     showError(errorobj,true);
    //                                     let msg=( qtn.QuestionType=='Date'?`${ST.Pleasepickadatefortherequiredfield} ${ST.In} ${window.CategoryName}`:(qtn.QuestionType=='Rating'?`${Pleaseselectratingfortherequiredfield} ${ST.In} ${window.CategoryName}`:`${ST.Pleasefillalltherequiredfield} ${ST.In} ${window.CategoryName}`));
    //                                     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]==='' )){
    //                                     errorobj['EF_Qtn_Input']='Qtn_Input';
    //                                     showError(errorobj,true);
    //                                     notify(`${ST.Pleasefillalltherequiredfield} ${ST.In} ${window.CategoryName}`,'SHORT');

    //                                     resolve(false);return;
    //                                 }
    //                                 else if(isImgAllowed && (Object.keys(QD).indexOf(img_key)<0 || (Object.keys(QD).indexOf(img_key)>=0 && QD[img_key]===''))){
    //                                     errorobj['EF_Qtn_Image']='Qtn_Image';
    //                                     showError(errorobj,true);
    //                                     notify(`${ST.Pleaseaddimages} ${ST.In} ${window.CategoryName}`,'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.CAShowCamera=='true' || ansss.CAShowCamera==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 && (Object.keys(QD).indexOf(img_key)<0 || (Object.keys(QD).indexOf(img_key)>=0 && QD[img_key]===''))){
    //                                 errorobj['EF_Qtn_Image']='Qtn_Image';
    //                                 showError(errorobj,true);
    //                                 notify(`${ST.Pleaseaddimages} ${ST.In} ${window.CategoryName}`,'SHORT');
    //                                 resolve(false);return;
    //                             }
    //                         }
    //                     }

    //                 }
    //             }
    //             else{
    //                 if(isNAReasonEnable==true && ReasonId=='' ){
    //                     errorobj['EF_NExistReason']="NExistReason";
    //                     showError(errorobj,true);
    //                     notify(`${ST.Pleaseselectreasonfor} ${window.CategoryName} `,'LONG');
    //                     resolve(false);return;
    //                 }
    //                 else if(StoreCameraAllow && isNAImageAvl==true && NAImage1=='' ){
    //                     errorobj['EF_NExistImage']="NExistImage";
    //                     showError(errorobj,true);
    //                     notify(`${ST.Pleaseclickimagefor} ${window.CategoryName}`,'LONG');
    //                     resolve(false);return;
    //                 }
    //             }

    //             if(wi==(Windows.length-1)){
    //                 resolve(true);return;
    //             }

    //         }

    //     }).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;

        function showError(obj, isErr) {
            setErrorField(obj);
            setError(isErr);
        }

        return new Promise((resolve, reject) => {
            for (const [wi, window] of globalWindows.entries()) {
                let isImage1 = window.CategoryImage1 == 'true' || window.CategoryImage1 == 1 ? 1 : 0;
                let isImage2 = window.CategoryImage2 == 'true' || window.CategoryImage2 == 1 ? 1 : 0;
                let isNAImageAvl = window.CategoryNotExistCamera == 'true' || window.CategoryNotExistCamera == 1 ? 1 : 0;
                let isNAReasonEnable = window.CategoryNotExistReasonEnable == 'true' || window.CategoryNotExistReasonEnable == 1 ? 1 : 0;
                let isReasonEnable = window.CategoryExistReasonEnable == 'true' || window.CategoryExistReasonEnable == 1 ? 1 : 0;
                let isStockReq = window.CategoryElementStockRequired == 'true' || window.CategoryElementStockRequired == 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.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
                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 remark = wind.remark != null ? wind.remark : '';
                let WindowSplits = wind.WindowSplits || [];
                let QD = wind.WindowQA || {};
                let WStocksData = wind.WStocksData || [];

                let errorobj = { 'EF_Window': window };

                if (isPresent == '1') {
                    if (isReasonEnable == true && ReasonId == '') {
                        errorobj['EF_NExistReason'] = "NExistReason";
                        showError(errorobj, true);
                        notify(`${ST.Pleaseselectreasonfor} ${window.CategoryName} `, 'LONG');
                        resolve(false);
                        return;
                    } else {
                        if (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'] : '';
                                if (isImage1 == 1 && Image1Name == '') {
                                    errorobj['EF_splitImage1'] = "splitImage1";
                                    errorobj['EF_splitItemIndex'] = splitItemIndex;
                                    showError(errorobj, true);
                                    notify(`${ST.Pleaseclickallimagesfor} ${window.CategoryName}`, 'LONG');
                                    resolve(false);
                                    return;
                                } else if (isImage2 == 1 && Image2Name == '') {
                                    errorobj['EF_splitImage2'] = "splitImage2";
                                    errorobj['EF_splitItemIndex'] = splitItemIndex;
                                    showError(errorobj, true);
                                    notify(`${ST.Pleaseclickallimagesfor} ${window.CategoryName}`, '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.CategoryStockValue) || {};
                                let stock = sd.Stock != null ? sd.Stock : (sd.Stock == 0 ? sd.Stock : '');
                                let isCatPresent = sd.isCatPresent != null ? sd.isCatPresent : 0;

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

                                if ((isListedSKUEnable == true && isCatPresent == 1 && StockQtyRequired == 1 && stock == '') || (isListedSKUEnable != true && (stock == null || stock == ''))) {
                                    errorobj['EF_stock'] = "input1_";
                                    errorobj['EF_stockProd'] = stockProd;
                                    let refIn1 = inputRefs.current['input1_' + window.CategoryDefinitionId + '_' + stockProd.CategoryStockDefinitionId];
                                    if (refIn1 != null) {
                                        refIn1.focus();
                                    }
                                    showError(errorobj, true);
                                    notify(`${ST.Pleaseenterstockfor} ${window.CategoryName} ( ${stockProd.ProductName} ) `, 'LONG');
                                    resolve(false);
                                    return;
                                }

                                if (isListedSKUEnable == true && stockProdIndex == WindowStocks.length - 1) {
                                    if (!isProductSelected) {
                                        errorobj['EF_isProductSelected'] = "isProductSelected";
                                        showError(errorobj, true);
                                        notify(`${ST.PleaseselectatleastoneSKUfor} ${window.CategoryName} `, 'LONG');
                                        resolve(false);
                                        return;
                                    }
                                }
                            }
                        }

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

                                // console.log(qtn?.Answers, "question Answers-------------");

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

                                // let isImgAllowed = (qtn.CQShowCamera == 'true' || qtn.CQShowCamera == 1); // need to change acc to the ans allow camera


                                let isImgAllowed = false;

                                console.log(isImgAllowed, "Beforeeee--------");

                                if (qtn.QuestionType == 'Single choice list') {
                                    selansid = QD[id_key];

                                    for (let i = 0; i < qtn.Answers.length; i++) {
                                        if (qtn.Answers[i].AnswerId == selansid) {
                                            isImgAllowed = (qtn.Answers[i].CACameraMandatory == 'true' || qtn.Answers[i].CACameraMandatory == 1);
                                            break;
                                        }
                                    }

                                } else if (qtn.QuestionType == 'Multi choice list') {
                                    selansid = QD[multi_key] != null && QD[multi_key] != '' ? QD[multi_key].split(',') : [];

                                    for (let i = 0; i < qtn.Answers.length; i++) {
                                        if (selansid.indexOf(qtn.Answers[i].AnswerId.toString()) >= 0 && (qtn.Answers[i].CACameraMandatory == 'true' || qtn.Answers[i].CACameraMandatory == 1)) {
                                            isImgAllowed = true;
                                            break;
                                        }
                                    }
                                }

                                console.log(isImgAllowed, "Afterrrrr--------");

                                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(',') : [];
                                }

                                let isDisabled = qtn.isDisabled;
                                if (!isDisabled) {
                                    if (qtn.QuestionType == 'Multi choice list' && selansid.length <= 0) {
                                        errorobj['EF_Qtn_MultiChoice'] = 'Qtn_MultiChoice';
                                        showError(errorobj, true);
                                        notify(`${ST.Pleaseselectoptionsfortherequiredfield} ${ST.In} ${window.CategoryName}`, 'SHORT');
                                        resolve(false);
                                        return;
                                    } else if (checkForAnsKey && (Object.keys(QD).indexOf(ans_key) < 0 || (Object.keys(QD).indexOf(ans_key) >= 0 && QD[ans_key] === ''))) {
                                        errorobj['EF_Qtn_Date'] = 'Qtn_Date';
                                        showError(errorobj, true);
                                        let msg = (qtn.QuestionType == 'Date' ? `${ST.Pleasepickadatefortherequiredfield} ${ST.In} ${window.CategoryName}` : (qtn.QuestionType == 'Rating' ? `${ST.Pleaseselectratingfortherequiredfield} ${ST.In} ${window.CategoryName}` : `${ST.Pleasefillalltherequiredfield} ${ST.In} ${window.CategoryName}`));
                                        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] === '')) {
                                        errorobj['EF_Qtn_Input'] = 'Qtn_Input';
                                        showError(errorobj, true);
                                        notify(`${ST.Pleasefillalltherequiredfield} ${ST.In} ${window.CategoryName}`, 'SHORT');
                                        resolve(false);
                                        return;
                                    } else if (isImgAllowed && (Object.keys(QD).indexOf(img_key) < 0 || (Object.keys(QD).indexOf(img_key) >= 0 && QD[img_key] === ''))) {
                                        errorobj['EF_Qtn_Image'] = 'Qtn_Image';
                                        showError(errorobj, true);
                                        notify(`${ST.Pleaseaddimages} ${ST.In} ${window.CategoryName}`, '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.CAShowCamera == 'true' || ansss.CAShowCamera == 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 && (Object.keys(QD).indexOf(img_key) < 0 || (Object.keys(QD).indexOf(img_key) >= 0 && QD[img_key] === ''))) {
                                    errorobj['EF_Qtn_Image'] = 'Qtn_Image';
                                    showError(errorobj, true);
                                    notify(`${ST.Pleaseaddimages} ${ST.In} ${window.CategoryName}`, 'SHORT');
                                    resolve(false);
                                    return;
                                }
                            }
                        }
                    }
                } else {
                    if (isNAReasonEnable == true && ReasonId == '') {
                        errorobj['EF_NExistReason'] = "NExistReason";
                        showError(errorobj, true);
                        notify(`${ST.Pleaseselectreasonfor} ${window.CategoryName} `, 'LONG');
                        resolve(false);
                        return;
                    } else if (StoreCameraAllow && isNAImageAvl == true && NAImage1 == '') {
                        errorobj['EF_NExistImage'] = "NExistImage";
                        showError(errorobj, true);
                        notify(`${ST.Pleaseclickimagefor} ${window.CategoryName}`, 'LONG');
                        resolve(false);
                        return;
                    }
                }

                if (wi == (globalWindows.length - 1)) {
                    resolve(true);
                    return;
                }
            }
        }).then((val) => { return val })
            .catch((err) => { console.log(err); return false });
    }


    function onselectionChange(option, keyLbl, keyVal, otherData) {
        setErrorField({});
        setError(false);
        let item = otherData.window;
        let allData = WindowData;
        let defData = { 'CategoryId': item.CategoryId, 'CategoryDefinitionId': item.CategoryDefinitionId };
        const win_index = allData.findIndex(i => i.CategoryId == item.CategoryId && i.CategoryDefinitionId == item.CategoryDefinitionId);
        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.CategoryId == item.CategoryId && i.CategoryDefinitionId == item.CategoryDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true

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

    function onselectionChange2(option, qtn, window) {
        setErrorField({});
        setError(false);
        let allData = WindowData;
        let defData = { 'CategoryId': window.CategoryId, 'CategoryDefinitionId': window.CategoryDefinitionId };
        const wind_index = allData.findIndex(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
        let wind = wind_index >= 0 ? allData[wind_index] : defData;
        let data = wind.WindowQA || {};
        let id_key = qtn.CategoryQuestionId + '_AnswerId';
        let ans_key = qtn.CategoryQuestionId + '_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.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData)

        let aq_ans = qtn.Answers != null ? qtn.Answers : [];
        let ans_obj = aq_ans.find(i => i.AnswerId == option.value) || {};
        let EQtns = ans_obj.CAQuestionEnable != null && ans_obj.CAQuestionEnable != '' ? ans_obj.CAQuestionEnable.replace(' ', '').split(',') : [];
        let DQtns = ans_obj.CAQuestionDisable != null && ans_obj.CAQuestionDisable != '' ? ans_obj.CAQuestionDisable.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.CategoryQuestionId == 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.CategoryQuestionId + '_AnswerId';
                        let ans_key = s_qtn.CategoryQuestionId + '_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.CategoryDefinitionId == window.CategoryDefinitionId && i.CategoryId == window.CategoryId)
                if (windowIndex > 0) {
                    window['WindowQuestions'] = sqtns;
                    allwindows[windowIndex] = window;
                    // setWindowData(allData);
                    BgWindowData(allData)
                    setWindows(allwindows);
                    setGlobalWindows(allwindows);
                    // setHasUnsavedChanges(true);
                    BgUnsavedChanges(true)
                    setrerenderdata(!rerenderdata);
                }

            })
        }
    }

    async function enableQtns(sqtns, EQtns, DQtns, data, wind = {}, wind_index = -1, allData = [], window = {}) {
        new Promise.all(
            EQtns.map((qid, q_index) => {
                let s_qtnindex = sqtns.findIndex(i => i.CategoryQuestionId == 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.CategoryDefinitionId == window.CategoryDefinitionId && i.CategoryId == window.CategoryId)
                if (windowIndex > 0) {
                    window['WindowQuestions'] = sqtns;
                    allwindows[windowIndex] = window;
                    setWindows(allwindows);
                    setGlobalWindows(allwindows);
                    // setHasUnsavedChanges(true);
                    BgUnsavedChanges(true)
                    setrerenderdata(!rerenderdata);
                }
            }
        })
    }

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

        let allData = WindowData;
        let defData = { 'CategoryId': window.CategoryId, 'CategoryDefinitionId': window.CategoryDefinitionId };
        const wind_index = allData.findIndex(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
        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.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        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;
            }
        }
        setErrorField({});
        setError(false);
        let id_key = qtn.CategoryQuestionId + '_AnswerId';
        let ans_key = qtn.CategoryQuestionId + '_Answer';

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

        if (qtn.QuestionType == 'Date') {
            let date_key = qtn.CategoryQuestionId + '_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.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
        let winArr = [...InputChange]
        winArr[objIndex].Flag = true
        setInputChange(winArr)
        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }

    function showQtnDatePicker(qtn, window, show = false) {
        let allQtns = window.WindowQuestions || [];
        let newqtnIndex = allQtns.findIndex(q => q.CategoryQuestionId == qtn.CategoryQuestionId);

        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.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId) || {};
            allWindows[winIndex] = window;
            setWindows(allWindows);
            setGlobalWindows(allwindows);
            if (show == true) setrerenderdata(!rerenderdata);
        }
    }

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

    function onRatingCancel() {
        setShowRating(false);
    }

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

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

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


    function onChoiceSelect(item, val, key, animatedChoice) {
        let win_index = InputChange.find(i => i.CategoryId == item.CategoryId && i.CategoryDefinitionId == item.CategoryDefinitionId)
        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 = { 'CategoryId': item.CategoryId, 'CategoryDefinitionId': item.CategoryDefinitionId };
        const win_index = allData.findIndex(i => i.CategoryId == item.CategoryId && i.CategoryDefinitionId == item.CategoryDefinitionId);
        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((obj => obj.PosmId == item.PosmId && obj.POSMDefinitionId == item.POSMDefinitionId));
            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 WindowSplits = [];
        for (var s = 0; s < DataCleanItem.NoOfSplit; s++) {
            let obj = { 'Image1Name': '', 'Image1': '', 'Image2Name': '', 'Image2': '' };
            WindowSplits.push(obj);
        }
        let defData = { 'CategoryId': DataCleanItem.CategoryId, 'CategoryDefinitionId': DataCleanItem.CategoryDefinitionId, 'WindowSplits': WindowSplits, 'WindowQA': {}, 'WStocksData': [], 'isAllSKUChecked': 0, isPresent: isPresentClean };
        const win_index = allData.findIndex(i => i.CategoryId == DataCleanItem.CategoryId && i.CategoryDefinitionId == DataCleanItem.CategoryDefinitionId);

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

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


    async function setWindowStockVal(val, window, stockProd, key, type = '') {
        setErrorField({});
        setError(false);
        if (type == 'numeric' && val != '') {
            const regex = new RegExp(/^\d+$/);
            let isNUmeric = regex.test(val);
            if (!isNUmeric) {
                notify(ST.Pleaseenterwholenumbersonly, 'SHORT');
                return;
            }
        }

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

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

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

        win_index >= 0 ? allData[win_index] = wind : allData.push(wind);
        // setWindowData(allData);
        BgWindowData(allData)
        // setHasUnsavedChanges(true);
        BgUnsavedChanges(true)
        setrerenderdata(!rerenderdata);
    }


    async function verifyAllChecked(val, window, stockProd, key) {
        return await new Promise((resolve, reject) => {
            let WindowStocks = window.WindowStocks || [];
            let allData = WindowData;
            const win_index = allData.findIndex(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
            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.CategoryStockValue);
                    let sd1 = sdIndex1 >= 0 ? WStocksData[sdIndex1] : {};
                    let isCatPresent = sd1.isCatPresent;
                    if (isCatPresent == null || isCatPresent == '' || isCatPresent == 0 || isCatPresent == '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 = { 'CategoryId': window.CategoryId, 'CategoryDefinitionId': window.CategoryDefinitionId };
        const win_index = allData.findIndex(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
        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.CategoryStockValue);
            let sd = sdIndex >= 0 ? WStocksData[sdIndex] : { 'ProductId': stockProd.CategoryStockValue, 'Stock': '' };
            let isCatPresent = (val == 1 || val == '1') ? 1 : 0;
            sd['isCatPresent'] = isCatPresent;

            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 openImageRefView(windowIndex = 0) {
        setrefImageIndex(windowIndex);
        setShow_zoomImage(true);
    }

    function FilterStores(searchedQry) {
        searchedQry = searchedQry.toLowerCase();
        console.log('searchedQry', searchedQry);
        let arr = [];
        let newWindows = [];
        if (searchedQry != null && searchedQry != '') {

            for (let i = 0; i < globalWindows.length; i++) {
                let item = globalWindows[i];
                let { CategoryName } = item;
                if (CategoryName.toLowerCase().includes(searchedQry)) {
                    newWindows.push(item);
                }

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

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

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

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

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

    function render_Picker(label_key, value_key, onChange = () => { }, selected_data = {}) {
        var data = [];
        let qtn = selected_data.qtn || {};
        let window = selected_data.window || {};
        let EStyle_Qtn_Input = selected_data.EStyle_Qtn_Input || {};
        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 : {}), EStyle_Qtn_Input]}>{(selected_data.value != null && selected_data.value != '' ? selected_data.value : '-' + ST.select + '-')}</Text>
            </ModalSelector>
        )
    }

    function renderDatePicker(qtn, window) {
        let qtnn = qtn;
        let DateRange = qtn.DateRange;
        let maxDate = moment().add(10, 'years').format('MM/DD/YYYY');
        let minDate = moment().subtract(10, 'years').format('MM/DD/YYYY');
        if (DateRange == 'RFD') {
            maxDate = moment().format('MM/DD/YYYY');
        }
        else if (DateRange == 'RPD') {
            minDate = moment().format('MM/DD/YYYY');
        }

        return (
            <DateTimePicker
                testID="dateTimePicker"
                value={(dateValue != null && dateValue != '' ? new Date(dateValue) : new Date())}
                mode={'date'}
                display="default"
                onChange={(event, selectedDate) => { setTextValue(selectedDate, qtnn, window) }}
                maximumDate={new Date(maxDate)}
                minimumDate={new Date(minDate)}
            />
        );
    }


    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>
        )
    }


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

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

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

                    let isImage1 = window.CategoryImage1 == 'true' || window.CategoryImage1 == 1 ? 1 : 0;
                    let isImage2 = window.CategoryImage2 == 'true' || window.CategoryImage2 == 1 ? 1 : 0;
                    let isNAImageAvl = window.CategoryNotExistCamera == 'true' || window.CategoryNotExistCamera == 1 ? 1 : 0;
                    let isNAReasonEnable = window.CategoryNotExistReasonEnable == 'true' || window.CategoryNotExistReasonEnable == 1 ? 1 : 0;
                    let isReasonEnable = window.CategoryExistReasonEnable == 'true' || window.CategoryExistReasonEnable == 1 ? 1 : 0;
                    let isStockReq = window.CategoryElementStockRequired == 'true' || window.CategoryElementStockRequired == 1 ? 1 : 0;
                    let StockQtyRequired = window.StockQtyRequired == 'true' || window.StockQtyRequired == 1 ? 1 : 0;
                    let PromoTitleEnable = window.PromoDefinitionTitleEnable == 'true' || window.PromoDefinitionTitleEnable == 1 ? 1 : 0;
                    let CategoryRefImagePopUp = window.CategoryRefImagePopUp == 'true' || window.CategoryRefImagePopUp == true ? true : false;

                    let PromoTitle = window.PromoDefinitionTitle != null && window.PromoDefinitionTitle != 'undefined' ? window.PromoDefinitionTitle : "";

                    let isVisible = Boolean(ItemsInView.find(({ item: i, isViewable }) => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId && isViewable))
                    // console.log("RenderItemList ItemsInView2:",index,isVisible)

                    // let isStock_CheckAssrt=window.CategoryElementCheckAssortment=='true' || window.CategoryElementCheckAssortment==1?1:0;
                    let RefImage = window.CategoryRefImage;
                    let camera1Label = window.CategoryImage1Lable || '';
                    let camera2Label = window.CategoryImage2Lable || '';
                    let WindowQuestions = window.WindowQuestions || [];
                    let WindowStocks = window.WindowStocks || [];


                    const wind = WindowData.find(i => i.CategoryId == window.CategoryId && i.CategoryDefinitionId == window.CategoryDefinitionId);
                    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 remark = wind.remark != null ? wind.remark : '';
                    let WindowSplits = wind.WindowSplits || [];
                    let QuestionsData = wind.WindowQA || {};
                    let WStocksData = wind.WStocksData || [];
                    let isAllSKUChecked = wind.isAllSKUChecked == 1 || wind.isAllSKUChecked == "1";

                    // console.log('camera2Label:',window.CategoryId,window.CategoryDefinitionId,camera2Label);


                    var xpos = isPresent == '1' || isPresent == 1 ? -75 : 0;
                    if (window.animatedChoice != null) {
                        xpos = window.animatedChoice.interpolate({
                            inputRange: [0, 1],
                            outputRange: [0, -75],
                        });
                    }

                    if (isVisible && window.animatedHeight != null) {
                        setTimeout(() => {
                            Animated.timing(window.animatedHeight, {
                                toValue: 0,
                                duration: 800,
                                useNativeDriver: false,
                            }).start();
                            // animHight=window.animatedHeight.interpolate({
                            //     inputRange:[100,0],
                            //     outputRange:["100%","0%"],
                            // });
                        }, (props.RefImagePopUpTime || 0) * 1000)
                    }

                    let EF_Window = errorfield.EF_Window != null ? errorfield.EF_Window : {};
                    let show_errorhere = error == true && EF_Window.CategoryId == window.CategoryId && EF_Window.CategoryDefinitionId == window.CategoryDefinitionId;
                    // if not Present fields

                    // this will show error field in red (if window is present and exist reason is enabled and not filled ) or (if window is not present and Not exist reason is enabled and not filled ) 
                    let EF_NExistReason = errorfield.EF_NExistReason || '';
                    let EStyle_NExistReason = show_errorhere && EF_NExistReason == 'NExistReason' ? customStyle.stk_inptSTyle_error : {};

                    let EF_NExistImage = errorfield.EF_NExistImage || '';
                    let EStyle_NExistImage = show_errorhere && EF_NExistImage == 'NExistImage' ? customStyle.error_CatImage2 : {};


                    return (
                        <View style={customStyle.WItem_wrap} key={'window_' + index}>
                            <View style={customStyle.WItem_Hdr}>
                                <View style={customStyle.WItem_Hdrbg}>
                                    <Text style={customStyle.WItem_HdrText}>{window.CategoryName}</Text>
                                    {(PromoTitleEnable == 1 && PromoTitle != null && PromoTitle != '') && <Text style={customStyle.WItem_HdrSubTitleText}>{PromoTitle}</Text>}
                                    <TouchableOpacity style={customStyle.WItem_RefImgBtn} onPress={() => { openImageRefView(windowIndex) }}>
                                        <Entypo name='image-inverted' size={24} color={PageTheme.$accent_color} />
                                    </TouchableOpacity>
                                </View>
                            </View>
                            {CategoryRefImagePopUp && <Animated.View
                                style={[{
                                    backgroundColor: "#fff",
                                    width: "100%",
                                    // height: 300,
                                    height: window.animatedHeight,
                                    // borderRadius: 10,
                                    paddingBottom: 10,
                                    // shadowColor: "#000",
                                    // elevation: 5
                                }]}
                            >
                                <Image style={[{ width: "100%", height: '100%' }]} resizeMode='contain' source={{ uri: RefImage }} />

                            </Animated.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]}>{ST.IsPresent}</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 : {})]}>{ST.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 : {})]}>{ST.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]}>{ST.SelectReason}</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} ErrorStyle={EStyle_NExistReason} ShowError={error} />}
                                        </View>
                                    }


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


                                                <View style={[customStyle.openStk_prdCameras, customStyle.WSCameraWrap]}>
                                                    <View style={[customStyle.openStkCameraCon, customStyle.WSCameraCon]}>
                                                        {(NAImage1Path == '' || NAImage1Path == null) ?
                                                            <TouchableOpacity style={[EStyle_NExistImage]} onPress={() => { openCamera(window, {}, 0, '1', '3') }}>
                                                                <CameraImg2 width={50} height={50} />
                                                            </TouchableOpacity> : (NAImage1Path != '' && NAImage1Path != null) ?
                                                                <TouchableOpacity onPress={() => { OpenImgModal(NAImage1Path, window, {}, 0, '1', '3') }}>
                                                                    <CameraImg3 width={50} height={50} />
                                                                </TouchableOpacity> : null
                                                        }
                                                    </View>
                                                </View>
                                            </View>

                                        </View>
                                    }

                                    {console.log("isPresent-----", isPresent, window.CategoryName, WindowQuestions.length)}

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

                                            {(isStockReq == true && WindowStocks.length > 0) &&
                                                <View style={[customStyle.openStk_prd_borderT, customStyle.pt10]}>
                                                    <LinearGradient colors={[PageTheme.$secondary_color_light, PageTheme.$fourth_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                        <Text style={customStyle.windhdrText}>{(isListedSKUEnable == true ? ST.SelectProducts : '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.CategoryStockValue) || {};
                                                            let stock = sd.Stock != null ? sd.Stock : '';
                                                            let isCatPresent = sd.isCatPresent != null ? sd.isCatPresent : 0;

                                                            // highlight prd errors 
                                                            let EF_stockProd = errorfield.EF_stockProd != null ? errorfield.EF_stockProd : {};
                                                            let showPrdErrHere = EF_stockProd.CategoryStockDefinitionId == stockProd.CategoryStockDefinitionId;

                                                            let EF_stock = errorfield.EF_stock || '';
                                                            let EStyle_StockInput = show_errorhere && showPrdErrHere && EF_stock == 'input1_' ? customStyle.stk_inptSTyle_error : {};


                                                            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={(isCatPresent == 1 || isCatPresent == '1')}
                                                                                    onValueChange={(val) => { let val1 = (val == true) ? 1 : 0; setWindowStockVal(val1, window, stockProd, 'isCatPresent') }}
                                                                                    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 && isCatPresent == 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, EStyle_StockInput]}
                                                                                    ref={(reff) => { inputRefs.current['input1_' + stockProd.CategoryDefinitionId + '_' + stockProd.CategoryStockDefinitionId] = reff; }}
                                                                                    placeholder=""
                                                                                    autoComplete='off'
                                                                                    placeholderTextColor={PageTheme.$placeholder_color}
                                                                                    keyboardType={'number-pad'}
                                                                                    returnKeyType={(Platform.OS === 'ios') ? 'done' : 'next'}
                                                                                    blurOnSubmit={false}
                                                                                    value={stock + ''}
                                                                                    onSubmitEditing={() => { focusToNext(WindowStocks, windowIndex, stockProd, index) }}
                                                                                    onChangeText={(val) => { setWindowStockVal(val, window, stockProd, 'Stock', 'numeric') }}
                                                                                />
                                                                            </View>

                                                                        </View>
                                                                    }
                                                                </View>
                                                            );
                                                        }}
                                                    />
                                                </View>
                                            }
                                            {(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.$fourth_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                        <Text style={customStyle.windhdrText}>{'Category Execution 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;


                                                            let isImg1mad = splitItem['img1Required'] || true;
                                                            let isImg2mad = splitItem['img2Required'] || true;



                                                            // highlight split image box 
                                                            let EF_splitItemIndex = errorfield.EF_splitItemIndex || '';
                                                            let showSplitItemErrHere = EF_splitItemIndex == splitItemIndex;

                                                            let EF_splitImage1 = errorfield.EF_splitImage1 || '';
                                                            let EStyle_splitImage1 = show_errorhere && showSplitItemErrHere && EF_splitImage1 == 'splitImage1' ? customStyle.error_CatImage2 : {};

                                                            let EF_splitImage2 = errorfield.EF_splitImage2 || '';
                                                            let EStyle_splitImage2 = show_errorhere && showSplitItemErrHere && EF_splitImage2 == 'splitImage2' ? customStyle.error_CatImage2 : {};


                                                            return (
                                                                <View style={[customStyle.openStk_prdCameras, customStyle.WSCameraWrap]} key={'SplitItem+' + splitItemIndex}>
                                                                    {isImage1 == 1 &&
                                                                        <View style={[customStyle.openStkCameraCon, customStyle.WSCameraCon]}>

                                                                            {console.log("imagemadate---", isImg1mad)}

                                                                            {((Image1 == '' || Image1 == null) && isImg1mad) ?
                                                                                <TouchableOpacity style={[EStyle_splitImage1]} onPress={() => { openCamera(window, splitItem, splitItemIndex, '1') }}>
                                                                                    <CameraImg5 width={50} height={50} />

                                                                                </TouchableOpacity> : (Image1 == '' || Image1 == null) ?
                                                                                    <TouchableOpacity style={[EStyle_splitImage1]} 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) && isImg2mad) ?
                                                                                <TouchableOpacity style={[EStyle_splitImage2]} onPress={() => { openCamera(window, splitItem, splitItemIndex, '2') }}>
                                                                                    <CameraImg5 width={50} height={50} />
                                                                                </TouchableOpacity> : (Image2 == '' || Image2 == null) ?
                                                                                    <TouchableOpacity style={[EStyle_splitImage2]} 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
                                                                            }
                                                                            <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.$fourth_color, PageTheme.$secondary_color_light]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={customStyle.windhdrTextCon}>
                                                        <Text style={customStyle.windhdrText}>{'Category Execution Questions'}</Text>
                                                    </LinearGradient>
                                                    {WindowQuestions.map((item, index) => {
                                                        let qtn = item;
                                                        let qtnIndex = index;
                                                        let selansid = '', selanswer = '', selimg = '', showImageTag = false;
                                                        let id_key = qtn.CategoryQuestionId + '_AnswerId';
                                                        let ans_key = qtn.CategoryQuestionId + '_Answer';
                                                        let multi_key = qtn.CategoryQuestionId + '_MultiOption';
                                                        let date_key = qtn.CategoryQuestionId + '_Date';
                                                        let img_key = qtn.CategoryQuestionId + '_ImagePath1';
                                                        let imgname_key = qtn.CategoryQuestionId + '_ImageName1';
                                                        let rating_key = qtn.CategoryQuestionId + '_Rating';

                                                        let list_mcdata = [];
                                                        let CQDefaultQuestionEnable = qtn.CQDefaultQuestionEnable == 'true' || qtn.CQDefaultQuestionEnable == 1 || qtn.CQDefaultQuestionEnable == '1' ? true : false;
                                                        let isDisabled = qtn.isDisabled;
                                                        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.CQShowCamera == 1 || qtn.CQShowCamera == '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.CAShowCamera == 'true' || ansss.CAShowCamera == 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] : '';
                                                        }

                                                        let EF_qtn = errorfield.EF_qtn != null ? errorfield.EF_qtn : {};
                                                        let showQtnErrHere = EF_qtn.CategoryQuestionId == qtn.CategoryQuestionId;
                                                        //Qtn_MultiChoice
                                                        let EF_Qtn_MultiChoice = errorfield.EF_Qtn_MultiChoice || '';
                                                        let EStyle_Qtn_MultiChoice = show_errorhere && showQtnErrHere && EF_Qtn_MultiChoice == 'Qtn_MultiChoice' ? customStyle.stk_MultiSSTyle_error : customStyle.wind_MultiSearchInputStyle;


                                                        let EF_Qtn_Date = errorfield.EF_Qtn_Date || '';
                                                        let EStyle_Qtn_Date = show_errorhere && showQtnErrHere && EF_Qtn_Date == 'Qtn_Date' ? customStyle.stk_inptSTyle_error : {};

                                                        let EF_Qtn_Input = errorfield.EF_Qtn_Input || '';
                                                        let EStyle_Qtn_Input = show_errorhere && showQtnErrHere && EF_Qtn_Input == 'Qtn_Input' ? customStyle.stk_inptSTyle_error : {};

                                                        let EF_Qtn_Image = errorfield.EF_Qtn_Image || '';
                                                        let EStyle_Qtn_Image = show_errorhere && showQtnErrHere && EF_Qtn_Image == 'Qtn_Image' ? customStyle.stk_inptSTyle_error : {};

                                                        if (!isDisabled) {
                                                            return (
                                                                <View style={[customStyle.sform_group2,]} key={'Qtn_' + qtnIndex} >
                                                                    <Text style={[customStyle.sform_label3]}>{qtn.CategoryQuestionName}</Text>
                                                                    {qtn.QuestionType == 'Single choice list' && qtn.Answers &&
                                                                        render_Picker('Answer', 'AnswerId', onselectionChange2, { value: selanswer, qtn: qtn, window: window, EStyle_Qtn_Input })
                                                                    }
                                                                    {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={ST.SearchItems + "..."}
                                                                            // 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={EStyle_Qtn_MultiChoice}
                                                                            submitButtonColor={PageTheme.$primary_color}
                                                                            submitButtonText={ST.Submit}
                                                                        />
                                                                    }
                                                                    {(qtn.QuestionType == 'Number' || qtn.QuestionType == 'Decimal' || qtn.QuestionType == 'Text') &&
                                                                        <TextInput
                                                                            style={[customStyle.WQ_InputStyle, EStyle_Qtn_Input]}
                                                                            placeholder=""
                                                                            autoComplete='off'
                                                                            maxLength={Number(qtn.CQMaximumChar)}
                                                                            minLength={Number(qtn.CQMinimumChar)}
                                                                            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, EStyle_Qtn_Date]}>
                                                                            <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>    
                                                                    }

                                                                    {
                                                                        showImageTag &&
                                                                        <View style={[customStyle.store_audit_img_con, EStyle_Qtn_Image]}>
                                                                            <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>
                                                            )
                                                        }
                                                        else {
                                                            return null
                                                        }
                                                    })}
                                                </View>
                                            }
                                            {RemarkEnable == true &&
                                                <View style={[customStyle.openStk_prd_borderT, customStyle.pt10, customStyle.mb10]}>
                                                    <Text style={[customStyle.openStk_prd_label, customStyle.st_TextLbl]}>{ST.Remark}</Text>
                                                    <TextInput
                                                        style={[customStyle.WQ_InputStyle]}
                                                        value={remark}
                                                        autoComplete='off'
                                                        onChangeText={(val) => { onCatTextChange(window, 'remark', val) }}
                                                    />
                                                </View>
                                            }

                                        </View>
                                    }



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

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

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

    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',)}
            <CustomCamera cameraType={'back'} BottomText={'Store Name:' + storeData.StoreName + ' | Store Id:' + storeData.StoreId + ' | User Id:' + storeData.EmpId + ' | Image Type: ' + currentMenu.MenuName} enableCameraFlip={showSwitchCamera} 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]}>
                    <View style={customStyle.storel_searchbar}>
                        <TextInput
                            style={[customStyle.storel_searchInput]}
                            placeholder={ST.Searchby + ' ' + currentMenu.MenuName}
                            placeholderTextColor={PageTheme.$placeholder_color}
                            value={searchedItem}
                            autoComplete='off'
                            onChangeText={(val) => { setSearchedItem(val); FilterStores(val) }}
                        />
                        <TouchableOpacity style={customStyle.storel_searchBtn} onPress={() => { FilterStores(searchedItem) }}>
                            <AntDesign style={customStyle.storel_searchBtnIcon} name='search1' size={20} color={PageTheme.$accent_color} />
                        </TouchableOpacity>
                    </View>
                    {Object.keys(storeData).length > 0 &&
                        <View style={customStyle.Windows_Wrap}>
                            {_renderWindow()}
                        </View>
                    }
                    <View style={[customStyle.opening_Stock_btnWrap]}>
                        <GradientButton {...props} title={ST.Save} onPress={() => { onSubmitData() }} />
                    </View>
                </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={_renderHeader} renderIndicator={() => null}
                    />
                </View>
            }
        </Container>
    );
}


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