public async Task <ObservationUpdateResponse> ObservationUpdate(string email, int observationId, int indicatorId, int siteId, DateTime begin, DateTime end)
        {
            var request = new ObservationUpdateRequest
            {
                user_email     = email,
                observation_id = observationId,
                indicator_id   = indicatorId,
                site_id        = siteId,
                begin_date     = begin,
                end_date       = end
            };
            var response = await WebServiceClientBase.Post <ObservationUpdateRequest, ObservationUpdateResponse>(Constants.OperationUpdateUri, request, true);

            return(response);
        }
        //
        public static async Task <ObservationUpdateResponse> PostObservation(string requestURI, ObservationUpdateRequest requestModel, bool addAuthHeader = false)
        {
            try                    //TODO: let caller handle exceptions?
            {
                if (addAuthHeader) //add header
                {
                    AddAuthHeader();
                }

                var obs = JsonConvert.SerializeObject(requestModel);
                //var response = await GfscClient.PostAsync(requestURI, json).ConfigureAwait(false);
                var response = await GfscClient.PostAsync(requestURI, new StringContent(obs, Encoding.UTF8, "application/json"));

                if (addAuthHeader)                 //remove header
                {
                    RemoveAuthHeader();
                }

                if (response.IsSuccessStatusCode)
                {
                    var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    if (!string.IsNullOrWhiteSpace(json))
                    {
                        var returnT = JsonConvert.DeserializeObject <List <ObservationUpdateResponse> >(json);
                        return(returnT[0]);
                    }
                }
                else
                {
                    return(new ObservationUpdateResponse
                    {
                        ErrorStatusCode = (int)response.StatusCode
                    });
                }
            }
            catch (Exception e)
            {
                if (addAuthHeader)                 //remove header
                {
                    RemoveAuthHeader();
                }
                return(new ObservationUpdateResponse());
            }

            return(default(ObservationUpdateResponse));
        }
        public async Task <ObservationSaveResponse> ObservationSave(string email, Observation observation)
        {
            //need to call all the saves
            ObservationSaveResponse returnValue = new ObservationSaveResponse();

            //observation
            var request = new ObservationUpdateRequest
            {
                user_email     = email,
                observation_id = observation.Observation_id,
                indicator_id   = observation.Indicator_id,
                site_id        = observation.Site_id,
                begin_date     = (System.DateTime)observation.Begin_Date,
                end_date       = (System.DateTime)observation.End_Date
            };


            var response = await WebServiceClientBase.Post <ObservationUpdateRequest, ObservationUpdateResponse>(Constants.OperationUpdateUri, request, true);

            if (response != null)
            {
                observation.Observation_id  = response.observation_id;
                observation.ModifiedLocally = false;

                //save observation entry
                foreach (ObservationEntry entry in observation.ObservationEntries)
                {
                    var entryRes = await ObservationEntryUpdate(entry.ObservationEntryId == null? 0 : (int)entry.ObservationEntryId,
                                                                observation.Observation_id,
                                                                entry.Indicator_Age_Range_Id == null? 0 : (int)entry.Indicator_Age_Range_Id,
                                                                entry.Indicator_Gender,
                                                                entry.Numerator == null? 0 : (int)entry.Numerator,
                                                                entry.Denominator == null? 0 : (int)entry.Denominator,
                                                                entry.Count == null? 0 : (int)entry.Count,
                                                                entry.Rate == null? 0 : (int)entry.Rate,
                                                                entry.Yes_No == null?false : (bool)entry.Yes_No,
                                                                email);

                    if (entryRes != null)
                    {
                        entry.ObservationEntryId = entryRes.observation_entry_id;
                        entry.ModifiedLocally    = false;
                    }
                }

                //save observation change
                foreach (ObservationChange change in observation.Changes)
                {
                    var changeRes = await ObservationChangeUpdate(change.Description, observation.Observation_id, change.ChangeId, email);

                    if (changeRes != null)
                    {
                        change.ChangeId        = changeRes.observation_change_id;
                        change.ModifiedLocally = false;
                    }
                }

                //save observation comment
                foreach (ObservationComment comment in observation.Comments)
                {
                    var commentRes = await ObservationCommentUpdate(comment.Comment, observation.Observation_id, comment.CommentId, email);

                    if (commentRes != null)
                    {
                        comment.CommentId       = commentRes.observation_comment_id;
                        comment.ModifiedLocally = false;
                    }
                }

                //save observation attachment
                foreach (ObservationAttachment attach in observation.Attachments)
                {
                    //byte[] file = new byte[attach.Bytes.Length];
                    //int result = fileBytes.InputStream.Read(file, 0, fileBytes.ContentLength);
                    //attachment.attachment = file;
                    //attachment.approved = false;
                    //attachment.createdby_userid = CurrentUser.Id;
                    //attachment.created_date = DateTime.Now;
                    //db.t_observation_attachment.Add(attachment);
                    //db.SaveChanges();
                    var buffer = attach.Bytes;
                    if (buffer != null)
                    {
                        string s = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);

                        var attachRes = await ObservationAttachmentUpdate(attach.Bytes, s, attach.Attachment_File_Name, observation.Observation_id, attach.AttachmentId, email);

                        if (attachRes != null)
                        {
                            attach.AttachmentId    = attachRes.observation_attachment_id;
                            attach.ModifiedLocally = false;
                        }
                    }
                }
            }
            else
            {
                returnValue.ErrorStatusCode = 500;
            }

            returnValue.observation = observation;
            return(returnValue);
        }