using System.Collections.Generic;
using System.Threading.Tasks;
namespace Timeline.Services.Api
{
    /// 
    /// Service interface that manages timeline bookmarks.
    /// 
    public interface IBookmarkTimelineService
    {
        /// 
        /// Get bookmarks of a user.
        /// 
        /// User id of bookmark owner.
        /// Id of Bookmark timelines in order.
        /// Thrown when user does not exist.
        Task> GetBookmarksAsync(long userId);
        /// 
        /// Check if a timeline is a bookmark.
        /// 
        /// The user id.
        /// Timeline id.
        /// If true it will throw when user does not exist.
        /// If true it will throw when timeline does not exist.
        /// True if timeline is a bookmark. Otherwise false.
        /// Throw if user does not exist and  is true.
        /// Thrown if timeline does not exist and  is true.
        Task IsBookmarkAsync(long userId, long timelineId, bool checkUserExistence = true, bool checkTimelineExistence = true);
        /// 
        /// Add a bookmark to tail to a user.
        /// 
        /// User id of bookmark owner.
        /// Timeline id.
        /// True if timeline is added to bookmark. False if it already is.
        /// Thrown when user does not exist.
        /// Thrown when timeline does not exist.
        Task AddBookmarkAsync(long userId, long timelineId);
        /// 
        /// Remove a bookmark from a user.
        /// 
        /// User id of bookmark owner.
        /// Timeline id.
        /// True if deletion is performed. False if bookmark does not exist.
        /// Thrown when user does not exist.
        /// Thrown when timeline does not exist.
        Task RemoveBookmarkAsync(long userId, long timelineId);
        /// 
        /// Move bookmark to a new position.
        /// 
        /// User id of bookmark owner.
        /// Timeline name.
        /// New position. Starts at 1.
        /// Thrown when user does not exist.
        /// Thrown when timeline does not exist.
        /// Thrown when the timeline is not a bookmark.
        Task MoveBookmarkAsync(long userId, long timelineId, long newPosition);
    }
}