/// <summary>
        ///     Build SyncState from json
        /// </summary>
        /// <param name="sync"></param>
        /// <returns></returns>
        public static SyncState FromJson(JObject sync)
        {
            if (sync == null)
            {
                return(null);
            }
            var jsonTarget = sync.ExtractValue <JObject>(Constants.SyncTarget);
            var syncType   = (SyncTypes)Enum.Parse(typeof(SyncTypes), sync.ExtractValue <string>(Constants.SyncType));
            var state      = new SyncState
            {
                Id        = sync.ExtractValue <long>(SmartStore.Store.SmartStore.SoupEntryId),
                Target    = (syncType == SyncTypes.SyncDown ? (SyncTarget)SyncDownTarget.FromJson(jsonTarget) : SyncUpTarget.FromJSON(jsonTarget)),
                Options   = SyncOptions.FromJson(sync.ExtractValue <JObject>(Constants.SyncOptions)),
                SoupName  = sync.ExtractValue <string>(Constants.SyncSoupName),
                Progress  = sync.ExtractValue <int>(Constants.SyncProgress),
                TotalSize = sync.ExtractValue <int>(Constants.SyncTotalSize),
                SyncType  = syncType,
                Status    =
                    (SyncStatusTypes)
                    Enum.Parse(typeof(SyncStatusTypes), sync.ExtractValue <string>(Constants.SyncStatus)),
                MaxTimeStamp = sync.ExtractValue <long>(Constants.SyncMaxTimeStamp)
            };

            return(state);
        }