using System;
using System.Collections.Generic;
using Kavita.Models.Entities.Interfaces;

namespace Kavita.Models.Entities.User;

/// <summary>
/// Represents an annotation in the Epub reader
/// </summary>
public class AppUserAnnotation : IEntityDate
{
    public int Id { get; set; }
    /// <summary>
    /// Starting point of the Highlight
    /// </summary>
    public required string XPath { get; set; }
    /// <summary>
    /// Ending point of the Highlight. Can be the same as <see cref="XPath"/>
    /// </summary>
    public string EndingXPath { get; set; }

    /// <summary>
    /// The text selected.
    /// </summary>
    public string SelectedText { get; set; }
    /// <summary>
    /// Rich text Comment
    /// </summary>
    public string? Comment { get; set; }
    /// <summary>
    /// The annotation in html format, this is generated by the UI (quill)
    /// </summary>
    public string? CommentHtml { get; set; }
    /// <summary>
    /// All html stripped from <see cref="CommentHtml"/>, this is done by the backend
    /// </summary>
    public string? CommentPlainText { get; set; }
    /// <summary>
    /// The number of characters selected
    /// </summary>
    public int HighlightCount { get; set; }
    public int PageNumber { get; set; }
    /// <summary>
    /// Selected Highlight Slot Index [0-4]
    /// </summary>
    public int SelectedSlotIndex { get; set; }
    /// <summary>
    /// A calculated selection of the surrounding text. This does not update after creation.
    /// </summary>
    public string? Context { get; set; }

    public bool ContainsSpoiler { get; set; }

    /// <summary>
    /// A set container userIds of all users who have liked this annotations
    /// </summary>
    public IList<int> Likes { get; set; } = new List<int>();

     /// <summary>
     /// Title of the TOC Chapter within Epub (not Chapter Entity)
     /// </summary>
     public string? ChapterTitle { get; set; }

    public required int LibraryId { get; set; }
    public Library Library { get; set; }
    public required int SeriesId { get; set; }
    public Series Series { get; set; }
    public required int VolumeId { get; set; }
    public required int ChapterId { get; set; }
    public Chapter Chapter { get; set; }

    public required int AppUserId { get; set; }
    public AppUser AppUser { get; set; }

    public DateTime Created { get; set; }
    public DateTime CreatedUtc { get; set; }
    public DateTime LastModified { get; set; }
    public DateTime LastModifiedUtc { get; set; }
}
