using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;

namespace Blahblah.FlowerStory.Server.Data.Model;

/// <summary>
/// 记录对象
/// </summary>
[Table("records")]
public class RecordItem : ILocation
{
    /// <summary>
    /// 自增 id，主键
    /// </summary>
    [Column("rid")]
    [Key]
    [Required]
    public int Id { get; set; }

    /// <summary>
    /// 关联人 id
    /// </summary>
    [Column("uid")]
    [ForeignKey(nameof(Owner))]
    [Required]
    public required int OwnerId { get; set; }

    /// <summary>
    /// 关联人
    /// </summary>
    [JsonIgnore]
    public UserItem? Owner { get; set; }

    /// <summary>
    /// 关联花草 id
    /// </summary>
    [Column("fid")]
    [ForeignKey(nameof(Flower))]
    [Required]
    public required int FlowerId { get; set; }

    /// <summary>
    /// 关联花草
    /// </summary>
    [JsonIgnore]
    public FlowerItem? Flower { get; set; }

    /// <summary>
    /// 事件类型
    /// </summary>
    [Column("eid")]
    [Required]
    public required int EventId { get; set; }

    /// <summary>
    /// 操作时间
    /// </summary>
    [Column("date")]
    [Required]
    [JsonPropertyName("date")]
    public required long DateUnixTime { get; set; }

    /// <summary>
    /// 操作人 uid
    /// </summary>
    [Column("byuid")]
    public int? ByUserId { get; set; }

    /// <summary>
    /// 操作人名称
    /// </summary>
    [Column("byname")]
    public string? ByUserName { get; set; }

    /// <summary>
    /// 备注
    /// </summary>
    [Column("memo")]
    public string? Memo { get; set; }

    /// <summary>
    /// 操作时间
    /// </summary>
    [NotMapped]
    [JsonIgnore]
    public DateTimeOffset Date => DateTimeOffset.FromUnixTimeMilliseconds(DateUnixTime);

    /// <summary>
    /// 事件关联照片
    /// </summary>
    public ICollection<PhotoItem>? Photos { get; set; }

    /// <summary>
    /// 纬度
    /// </summary>
    [Column("latitude")]
    public double? Latitude { get; set; }

    /// <summary>
    /// 经度
    /// </summary>
    [Column("longitude")]
    public double? Longitude { get; set; }
}
