using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace AsbCloudDb.Model;

/// <summary>
/// Часть записи описывающая изменение
/// </summary>
public abstract class ChangeLogAbstract
{
    /// <summary>
    /// Актуальная
    /// </summary>
    public const int IdStateActual = 0;

    /// <summary>
    /// Замененная
    /// </summary>
    public const int IdStateReplaced = 1;

    /// <summary>
    /// Удаленная
    /// </summary>
    public const int IdStateDeleted = 2;

    /// <summary>
    /// Очищено при импорте
    /// </summary>
    public const int IdCleared = 3;

    /// <summary>
    /// Ид записи
    /// </summary>
    [Key]
    [Column("id"), Comment("Идентификатор")]
    public int Id { get; set; }

    /// <summary>
    /// Автор изменения
    /// </summary>
    [Column("id_author"), Comment("Автор")]
    public int IdAuthor { get; set; }

    /// <summary>
    /// Редактор
    /// </summary>
    [Column("id_editor"), Comment("Редактор")]
    public int? IdEditor { get; set; }

    /// <summary>
    /// Дата создания записи
    /// </summary>
    [Column("creation"), Comment("дата создания")]
    public DateTimeOffset Creation { get; set; }

    /// <summary>
    /// Дата устаревания (например при удалении)
    /// </summary>
    [Column("obsolete"), Comment("дата устаревания")]
    public DateTimeOffset? Obsolete { get; set; }

    /// <summary>
    /// ИД состояния записи:
    /// <list type="table">
    /// <item>
    ///     <term>0</term>
    ///     <description>актуальная запись</description>
    /// </item>
    /// <item>
    ///     <term>1</term>
    ///     <description>замененная запись</description>
    /// </item>
    /// <item>
    ///     <term>2</term>
    ///     <description>удаленная запись</description>
    /// </item>
    /// </list>
    /// </summary>
    [Column("id_state"), Comment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная")] 
    public int IdState { get; set; }

    /// <summary>
    /// Id заменяемой записи
    /// </summary>
    [Column("id_previous"), Comment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная")] 
    public int? IdPrevious { get; set; }

    [ForeignKey(nameof(IdAuthor))]
    public virtual User Author { get; set; } = null!;

    [ForeignKey(nameof(IdEditor))]
    public virtual User? Editor { get; set; }
}