async Task SetData(AsanaTask task)
        {
            Task         = task;
            IsForSync    = task.IsForSync;
            Status       = Statuses.FirstOrDefault(x => x.name == task.assignee_status);
            Name         = task.name;
            Notes        = task.notes;
            IsUseDueDate = task.due_on.HasValue;
            DueDate      = task.due_on.HasValue ? task.due_on.Value : DateTime.Today;
            IsUseDueDate = task.due_on.HasValue;
            IsCompleted  = task.completed;
            ProjectId    = task.projectid;
            if (task.assigneeid > 0)
            {
                UserId = task.assigneeid;
            }

            SelectedFollowers = Followers.Where(x => task.GetFollowers().Contains(x.id)).ToList();
            OldFollowersIds   = SelectedFollowers.Select(x => x.id).ToList();


            var tags = await new StorageService().GetTagsByTask(task.id);

            OldTagsIds   = tags.Select(x => x.id).ToList();
            SelectedTags = Tags.Where(x => OldTagsIds.Contains(x.id)).ToList();
        }
        async System.Threading.Tasks.Task ProcessFollowers(AsanaTask task)
        {
            var currentFollowers = SelectedFollowers.Select(x => x.id).ToList();

            var followersToAdd    = new List <long>();
            var followersToRemove = new List <long>();

            foreach (var currentFollower in currentFollowers)
            {
                if (!OldFollowersIds.Contains(currentFollower))
                {
                    followersToAdd.Add(currentFollower);
                }
            }

            foreach (var oldFollowersId in OldFollowersIds)
            {
                if (!currentFollowers.Contains(oldFollowersId))
                {
                    followersToRemove.Add(oldFollowersId);
                }
            }

            var success = false;

            if (followersToAdd.Any())
            {
                var response = await new AsanaRespository().AddFollowers(task.id,
                                                                         followersToAdd);

                if (AsanaClient.ProcessResponse(response, true))
                {
                    success = true;
                }
                else
                {
                    return;
                }
            }


            if (followersToRemove.Any())
            {
                var response = await new AsanaRespository().RemoveFollowers(task.id,
                                                                            followersToRemove);

                if (AsanaClient.ProcessResponse(response, true))
                {
                    success = true;
                }
                else
                {
                    return;
                }
            }

            if (success)
            {
                task.SetFollowers(currentFollowers);
            }

            task.followers = null;
            if (followersToAdd.Any() || followersToRemove.Any())
            {
                await PrepareAndSaveTaskToDb(task);
            }
        }
        async void SaveTask()
        {
            if (IsBusy || IsBlockingProgress)
            {
                return;
            }

            if (string.IsNullOrEmpty(Name))
            {
                MessageBox.Show("Specify name");
                return;
            }



            if (Project == null)
            {
                MessageBox.Show("Specify project");
                return;
            }

            IsBlockingProgress = true;

            DateTime?dueDate = null;

            if (IsUseDueDate)
            {
                dueDate = DueDate;
            }

            var dto = MapperService.CreateTaskDTO(Id.GetValueOrDefault(0), Name,
                                                  Notes,
                                                  !IsEditMode ? Project.id : 0,
                                                  Status.name,
                                                  User != null && User.id > 0 ? User.id : -1,
                                                  IsCompleted, dueDate, SelectedFollowers.Select(x => x.id).ToList());


            //var task = new AsanaTaskDTO() {
            //    name = model.Name,
            //    notes = model.Notes,
            //    completed = model.IsCompleted,
            //    id = model.Id.GetValueOrDefault(0),
            //    assignee = -1,
            //    assignee_status = model.Status.name };


            //if (model.IsUseDueDate)
            //{
            //    task.due_on = model.DueDate.ToString("yyyy-MM-dd");
            //}
            //else
            //{
            //    task.due_on = "null";
            //}

            //if (!model.IsEditMode)
            //{
            //    task.projects = model.Project.id;
            //}
            //if (model.User != null && model.User.id > 0)
            //{
            //    task.assignee = model.User.id;
            //}

            //save task for syncing later
            if (!CheckInternetConnection(false))
            {
                if (IsForSync || !IsEditMode)
                {
                    AsanaTask dbTask;
                    if (IsEditMode)
                    {
                        dbTask = Task;
                    }
                    else
                    {
                        dbTask = new AsanaTask()
                        {
                            id          = await new StorageService().GetLocalTaskId(),
                            workspaceid = Project.workspaceid,
                            modified_at = DateTime.Now,
                            created_at  = DateTime.Now,
                            IsForSync   = true
                        };
                    }

                    dbTask.name            = dto.name;
                    dbTask.notes           = dto.notes;
                    dbTask.completed       = dto.completed;
                    dbTask.assignee_status = dto.assignee_status;
                    dbTask.assigneeid      = dto.assignee == AsanaConstants.Utils.NULL_VALUE ? -1 : long.Parse(dto.assignee);
                    dbTask.projectid       = Project.id;
                    dbTask.parentId        = ParentId;
                    dbTask.SetFollowers(dto.followers.Select(X => X.id).ToList());

                    if (IsUseDueDate)
                    {
                        dbTask.due_on = DueDate;
                    }
                    else
                    {
                        dbTask.due_on = null;
                    }


                    await new StorageService().Save(dbTask);


                    if (!IsEditMode)
                    {
                        MessageBox.Show("Task saved for syncing when network will be available");
                    }

                    IsBlockingProgress = false;

                    NavigationManager.GoBack();

                    return;
                }
            }

            if (IsForSync && IsEditMode)
            {
                var task = await new StorageService().Find <AsanaTask>(Id.Value);

                await CheckSyncStatus(task);

                IsForSync          = false;
                IsBlockingProgress = false;
                return;
            }

            //normal save
            var response = !IsEditMode ? await new AsanaRespository().CreateTask(WorkspaceId, dto, ParentId) : await new AsanaRespository().UpdateTask(dto);

            if (AsanaClient.ProcessResponse(response))
            {
                if (IsEditMode && OldProjectId != Project.id)
                {
                    var newResponse = await new AsanaRespository().ChangeTaskProject(Id.Value, OldProjectId, Project.id);


                    if (AsanaClient.ProcessResponse(newResponse))
                    {
                        await PrepareAndSaveTaskToDb(response.Data);
                        await ProcessFollowers(response.Data);
                        await ProcessTags(response.Data);
                    }
                }
                else
                {
                    await PrepareAndSaveTaskToDb(response.Data);

                    if (IsEditMode)
                    {
                        await ProcessFollowers(response.Data);
                    }
                    await ProcessTags(response.Data);
                }



                NavigationManager.GoBack();
                return;
            }

            IsBlockingProgress = false;
        }