private async Task SaveToLocalDB(MobileFormData data, FormSaveResponse response, int rowId)
        {
            try
            {
                LastSyncInfo syncInfo = App.Settings.SyncInfo;
                if (syncInfo.LastOfflineSaveTs > DateTime.Now)
                {
                    response.Message = "Sync required. Device date time is incorrect.";
                }
                else
                {
                    List <DbParameter> dbParameters = new List <DbParameter>();

                    string query = data.GetQuery(dbParameters, rowId);

                    int rowAffected = App.DataDB.DoNonQuery(query, dbParameters.ToArray());
                    int lastRowId   = (rowId != 0) ? rowId : Convert.ToInt32(App.DataDB.DoScalar($"SELECT MAX(id) FROM {TableName}"));
                    response.PushResponse = new PushResponse()
                    {
                        RowId = lastRowId
                    };

                    if (HasFileSelect && rowAffected > 0)
                    {
                        if (lastRowId > 0)
                        {
                            await WriteFilesToLocal(lastRowId);
                        }
                    }

                    response.Status = rowAffected > 0;

                    if (response.Status)
                    {
                        response.Message = "Data stored locally :)";
                        App.Settings.SyncInfo.LastOfflineSaveTs = DateTime.Now;
                        await Store.SetJSONAsync(AppConst.LAST_SYNC_INFO, App.Settings.SyncInfo);
                    }
                    else
                    {
                        throw new Exception("Failed to store data locally");
                    }
                }
            }
            catch (Exception ex)
            {
                response.Message = "Failed to store data locally";

                EbLog.Error("Exception at [EbMobileForm] while [SaveToLocalDB] method : " + ex.Message);
            }
        }
        private async Task SaveToCloudDB(MobileFormData data, FormSaveResponse response, int rowId, string pageRefId)
        {
            try
            {
                WebformData webFormData = data.ToWebFormData();

                foreach (MobileTable table in data.Tables)
                {
                    if (table.Files.Any())
                    {
                        table.InitFilesToUpload();

                        bool status = await this.SendAndFillFupData(webFormData, table);

                        if (!status)
                        {
                            throw new Exception("Image Upload faild, breaking form save");
                        }
                    }
                }

                int locid = App.Settings.CurrentLocId;

                EbLog.Info($"saving record in location {locid}");

                PushResponse pushResponse = await FormService.Instance.SendFormDataAsync(pageRefId, webFormData, rowId, this.WebFormRefId, locid);

                this.LogPushResponse(pushResponse);

                if (pushResponse.RowAffected > 0)
                {
                    response.Status       = true;
                    response.Message      = "Saved successfully :)";
                    response.PushResponse = pushResponse;
                }
                else
                {
                    throw new Exception(pushResponse.Message);
                }
            }
            catch (Exception ex)
            {
                response.Status  = false;
                response.Message = ex.Message;
                EbLog.Error(ex.Message);
            }
        }
        private async Task <MobileFormData> GetFormData(int RowId)
        {
            MobileFormData formData = new MobileFormData(this.TableName);

            MobileTable table = formData.CreateTable();

            MobileTableRow row = table.CreateRow(RowId);

            foreach (KeyValuePair <string, EbMobileControl> pair in this.ControlDictionary)
            {
                EbMobileControl ctrl = pair.Value;

                if (ctrl is IFileUploadControl)
                {
                    await this.GetFileData(ctrl, table, row);
                }
                else if (ctrl is EbMobileDataGrid dataGrid)
                {
                    formData.Tables.Add(dataGrid.GetValue <MobileTable>());
                }
                else
                {
                    MobileTableColumn Column = ctrl.GetMobileTableColumn();

                    if (Column != null)
                    {
                        row.Columns.Add(Column);
                    }
                }
            }

            if (RowId <= 0)
            {
                row.AppendEbColValues(NetworkType == NetworkMode.Offline, true);
            }
            ;
            return(formData);
        }
        public async Task <FormSaveResponse> Save(int rowId, string pageRefId)
        {
            FormSaveResponse response = new FormSaveResponse();

            try
            {
                MobileFormData data = await this.GetFormData(rowId);

                data.SortByMaster();

                if (NetworkType == NetworkMode.Online)
                {
                    await this.SaveToCloudDB(data, response, rowId, pageRefId);
                }
                else if (NetworkType == NetworkMode.Offline)
                {
                    await this.SaveToLocalDB(data, response, rowId);
                }
                else
                {
                    if (Utils.HasInternet)
                    {
                        await this.SaveToCloudDB(data, response, rowId, pageRefId);
                    }
                    else
                    {
                        await this.SaveToLocalDB(data, response, rowId);
                    }
                }
            }
            catch (Exception ex)
            {
                EbLog.Error("Error in [EbMobileForm.Save] " + ex.Message);
            }
            return(response);
        }