using AyCode.Core.Extensions; using AyCode.Core.Interfaces; using AyCode.Core.Serializers.Attributes; using AyCode.Core.Serializers.Binaries; using AyCode.Core.Serializers.Jsons; using MemoryPack; using MessagePack; using MongoDB.Bson.Serialization.Attributes; using Newtonsoft.Json; namespace AyCode.Core.Tests.TestModels; #region Shared Reference Base Types public abstract class SharedTagBase : IId { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } = ""; [AcStringIntern(true)] [Key(2)] public string Color { get; set; } = "#000000"; [Key(3)] public int Priority { get; set; } [Key(4)] public bool IsActive { get; set; } = true; [Key(5)] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [Key(6)] public string? Description { get; set; } } public abstract class SharedCategoryBase : IId { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } = ""; [Key(2)] public string? Description { get; set; } [Key(3)] public int SortOrder { get; set; } [Key(4)] public bool IsDefault { get; set; } [Key(5)] public int? ParentCategoryId { get; set; } [Key(6)] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [Key(7)] public DateTime? UpdatedAt { get; set; } } public abstract class SharedUserBase : IId where TPreferences : UserPreferencesBase { [Key(0)] public int Id { get; set; } [Key(1)] public string Username { get; set; } = ""; [Key(2)] public string Email { get; set; } = ""; [Key(3)] public string FirstName { get; set; } = ""; [Key(4)] public string LastName { get; set; } = ""; [Key(5)] public bool IsActive { get; set; } = true; [Key(6)] public TestUserRole Role { get; set; } = TestUserRole.User; [Key(7)] public DateTime? LastLoginAt { get; set; } [Key(8)] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [Key(9)] public TPreferences? Preferences { get; set; } } public abstract class UserPreferencesBase { [AcStringIntern(true)] [Key(0)] public string Theme { get; set; } = "light"; [AcStringIntern(true)] [Key(1)] public string Language { get; set; } = "en-US"; [Key(2)] public bool NotificationsEnabled { get; set; } = true; [AcStringIntern(true)] [Key(3)] public string? EmailDigestFrequency { get; set; } } public abstract class MetadataInfoBase where TSelf : MetadataInfoBase { [AcStringIntern(true)] [Key(0)] public string Key { get; set; } = ""; [AcStringIntern(true)] [Key(1)] public string Value { get; set; } = ""; [Key(2)] public DateTime Timestamp { get; set; } = DateTime.UtcNow; [Key(3)] public TSelf? ChildMetadata { get; set; } } #endregion #region Order Hierarchy Base Types public abstract class TestOrderBase : IId where TItem : class where TTag : SharedTagBase where TUser : SharedUserBase where TCategory : SharedCategoryBase where TMetadata : MetadataInfoBase where TPreferences : UserPreferencesBase { [Key(0)] public int Id { get; set; } [Key(1)] public string OrderNumber { get; set; } = ""; [Key(2)] public TestStatus Status { get; set; } = TestStatus.Pending; [Key(3)] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [Key(4)] public DateTime? PaidDateUtc { get; set; } [Key(5)] public decimal TotalAmount { get; set; } [Key(6)] public List Items { get; set; } = []; [Key(7)] public TTag? PrimaryTag { get; set; } [Key(8)] public TTag? SecondaryTag { get; set; } [Key(9)] public TUser? Owner { get; set; } [Key(10)] public TCategory? Category { get; set; } [Key(11)] public List Tags { get; set; } = []; [Key(12)] public TMetadata? OrderMetadata { get; set; } [Key(13)] public TMetadata? AuditMetadata { get; set; } [Key(14)] public List MetadataList { get; set; } = []; [JsonNoMergeCollection] [Key(15)] public List NoMergeItems { get; set; } = []; [MemoryPackIgnore] [JsonIgnore] [IgnoreMember] [BsonIgnore] public object? Parent { get; set; } } public abstract class TestOrderItemBase : IId where TPallet : class where TTag : SharedTagBase where TUser : SharedUserBase where TMetadata : MetadataInfoBase where TParentOrder : class where TPreferences : UserPreferencesBase { [Key(0)] public int Id { get; set; } [AcStringIntern(true)] [Key(1)] public string ProductName { get; set; } = ""; [Key(2)] public int Quantity { get; set; } [Key(3)] public decimal UnitPrice { get; set; } [Key(4)] public TestStatus Status { get; set; } = TestStatus.Pending; [Key(5)] public List Pallets { get; set; } = []; [Key(6)] public TTag? Tag { get; set; } [Key(7)] public TUser? Assignee { get; set; } [Key(8)] public TMetadata? ItemMetadata { get; set; } [MemoryPackIgnore] [JsonIgnore] [IgnoreMember] [BsonIgnore] public TParentOrder? ParentOrder { get; set; } } public abstract class TestPalletBase : IId where TMeasurement : class where TTag : SharedTagBase where TUser : SharedUserBase where TCategory : SharedCategoryBase where TMetadata : MetadataInfoBase where TParentItem : class where TPreferences : UserPreferencesBase { [Key(0)] public int Id { get; set; } [Key(1)] public string PalletCode { get; set; } = ""; [Key(2)] public int TrayCount { get; set; } [Key(3)] public TestStatus Status { get; set; } = TestStatus.Pending; [Key(4)] public double Weight { get; set; } [Key(5)] public List Measurements { get; set; } = []; [Key(6)] public TTag? Tag { get; set; } [Key(7)] public TUser? Inspector { get; set; } [Key(8)] public TCategory? Category { get; set; } [Key(9)] public TMetadata? PalletMetadata { get; set; } [MemoryPackIgnore] [JsonIgnore] [IgnoreMember] [BsonIgnore] public TParentItem? ParentItem { get; set; } } public abstract class TestMeasurementBase : IId where TPoint : class where TTag : SharedTagBase where TUser : SharedUserBase where TParentPallet : class where TPreferences : UserPreferencesBase { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } = ""; [Key(2)] public double TotalWeight { get; set; } [Key(3)] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [Key(4)] public List Points { get; set; } = []; [Key(5)] public TTag? Tag { get; set; } [Key(6)] public TUser? Operator { get; set; } [MemoryPackIgnore] [JsonIgnore] [IgnoreMember] [BsonIgnore] public TParentPallet? ParentPallet { get; set; } } public abstract class TestMeasurementPointBase : IId where TTag : SharedTagBase where TUser : SharedUserBase where TParentMeasurement : class where TPreferences : UserPreferencesBase { [Key(0)] public int Id { get; set; } [Key(1)] public string Label { get; set; } = ""; [Key(2)] public double Value { get; set; } [Key(3)] public DateTime MeasuredAt { get; set; } = DateTime.UtcNow; [Key(4)] public TTag? Tag { get; set; } [Key(5)] public TUser? Verifier { get; set; } [MemoryPackIgnore] [JsonIgnore] [IgnoreMember] [BsonIgnore] public TParentMeasurement? ParentMeasurement { get; set; } } #endregion