using System.ComponentModel.DataAnnotations;
using DataModel.Database.Common;

namespace DataModel.Database;

public sealed class Section
{
    [Key]
    public int Id { get; set; }
    
    public Guid UniqueId { get; set; } = Guid.NewGuid();

    public string Name { get; set; } = string.Empty;

    public string DataKey { get; set; } = string.Empty;

    public int Depth { get; set; } = 0;
    
    public Section? Parent { get; set; }

    public List<TextElement> TextElements { get; set; } = new();
    
    internal DataContext.JsonUniqueId JsonUniqueId => new(this.DataKey, this.UniqueId, "Sec");
    
    internal DataContext.JsonSection ToJsonSection(DataContext db)
    {
        db.LoadElementsAsync(this, n => n.Parent).GetAwaiter().GetResult();
        if(this.Depth > 0 && this.Parent == null)
            Console.WriteLine($"Found section with depth > 0 and parent is null ==> {this.JsonUniqueId}");
                
        return new()
        {
            UniqueId = this.JsonUniqueId,
            Name = this.Name,
            DataKey = this.DataKey,
            Depth = this.Depth,
            ParentUniqueId = this.Parent?.JsonUniqueId ?? new DataContext.JsonUniqueId("null", Guid.Empty, "Sec"),
            TextElements = this.TextElements.Select(n => n.JsonUniqueId).ToList()
        };
    }

    internal static Section FromJsonSection(DataContext.JsonSection jsonSection) => new()
    {
        UniqueId = jsonSection.UniqueId.UniqueId,
        Name = jsonSection.Name,
        DataKey = jsonSection.DataKey,
        Depth = jsonSection.Depth,
        Parent = null,
        TextElements = new(),
    };
}