using System;
using System.Collections.Generic;
using Umbraco.Core.Models.Membership;
using Umbraco.Web.Cache;
namespace Umbraco.Web.PublishedCache
{
///
/// Creates and manages instances.
///
public interface IPublishedSnapshotService : IDisposable
{
#region PublishedSnapshot
/* Various places (such as Node) want to access the XML content, today as an XmlDocument
* but to migrate to a new cache, they're migrating to an XPathNavigator. Still, they need
* to find out how to get that navigator.
*
* Because a cache such as NuCache is contextual i.e. it has a "snapshot" thing and remains
* consistent over the snapshot, the navigator has to come from the "current" snapshot.
*
* So although everything should be injected... we also need a notion of "the current published
* snapshot". This is provided by the IPublishedSnapshotAccessor.
*
*/
///
/// Creates a published snapshot.
///
/// A preview token, or null if not previewing.
/// A published snapshot.
/// If is null, the snapshot is not previewing, else it
/// is previewing, and what is or is not visible in preview depends on the content of the token,
/// which is not specified and depends on the actual published snapshot service implementation.
IPublishedSnapshot CreatePublishedSnapshot(string previewToken);
///
/// Gets the published snapshot accessor.
///
IPublishedSnapshotAccessor PublishedSnapshotAccessor { get; }
///
/// Ensures that the published snapshot has the proper environment to run.
///
/// The errors, if any.
/// A value indicating whether the published snapshot has the proper environment to run.
bool EnsureEnvironment(out IEnumerable errors);
#endregion
#region Rebuild
///
/// Rebuilds internal caches (but does not reload).
///
///
/// Forces the snapshot service to rebuild its internal caches. For instance, some caches
/// may rely on a database table to store pre-serialized version of documents.
/// This does *not* reload the caches. Caches need to be reloaded, for instance via
/// RefreshAllPublishedSnapshot method.
///
void Rebuild();
#endregion
#region Preview
/* Later on we can imagine that EnterPreview would handle a "level" that would be either
* the content only, or the content's branch, or the whole tree + it could be possible
* to register filters against the factory to filter out which nodes should be preview
* vs non preview.
*
* EnterPreview() returns the previewToken. It is up to callers to store that token
* wherever they want, most probably in a cookie.
*
*/
///
/// Enters preview for specified user and content.
///
/// The user.
/// The content identifier.
/// A preview token.
///
/// Tells the caches that they should prepare any data that they would be keeping
/// in order to provide preview to a give user. In the Xml cache this means creating the Xml
/// file, though other caches may do things differently.
/// Does not handle the preview token storage (cookie, etc) that must be handled separately.
///
string EnterPreview(IUser user, int contentId);
///
/// Refreshes preview for a specified content.
///
/// The preview token.
/// The content identifier.
/// Tells the caches that they should update any data that they would be keeping
/// in order to provide preview to a given user. In the Xml cache this means updating the Xml
/// file, though other caches may do things differently.
void RefreshPreview(string previewToken, int contentId);
///
/// Exits preview for a specified preview token.
///
/// The preview token.
///
/// Tells the caches that they can dispose of any data that they would be keeping
/// in order to provide preview to a given user. In the Xml cache this means deleting the Xml file,
/// though other caches may do things differently.
/// Does not handle the preview token storage (cookie, etc) that must be handled separately.
///
void ExitPreview(string previewToken);
#endregion
#region Changes
/* An IPublishedCachesService implementation can rely on transaction-level events to update
* its internal, database-level data, as these events are purely internal. However, it cannot
* rely on cache refreshers CacheUpdated events to update itself, as these events are external
* and the order-of-execution of the handlers cannot be guaranteed, which means that some
* user code may run before Umbraco is finished updating itself. Instead, the cache refreshers
* explicitly notify the service of changes.
*
*/
///
/// Notifies of content cache refresher changes.
///
/// The changes.
/// A value indicating whether draft contents have been changed in the cache.
/// A value indicating whether published contents have been changed in the cache.
void Notify(ContentCacheRefresher.JsonPayload[] payloads, out bool draftChanged, out bool publishedChanged);
///
/// Notifies of media cache refresher changes.
///
/// The changes.
/// A value indicating whether medias have been changed in the cache.
void Notify(MediaCacheRefresher.JsonPayload[] payloads, out bool anythingChanged);
// there is no NotifyChanges for MemberCacheRefresher because we're not caching members.
///
/// Notifies of content type refresher changes.
///
/// The changes.
void Notify(ContentTypeCacheRefresher.JsonPayload[] payloads);
///
/// Notifies of data type refresher changes.
///
/// The changes.
void Notify(DataTypeCacheRefresher.JsonPayload[] payloads);
///
/// Notifies of domain refresher changes.
///
/// The changes.
void Notify(DomainCacheRefresher.JsonPayload[] payloads);
#endregion
}
}