using System.Text.Json.Serialization; namespace PlotLine.Models; public sealed class CharacterIntelligenceProfile { public int CharacterIntelligenceProfileID { get; init; } public int ImportSessionID { get; init; } public int ProjectID { get; init; } public int BookID { get; init; } public string CanonicalIdentityKey { get; init; } = string.Empty; public string CanonicalName { get; init; } = string.Empty; public string ProfileJson { get; init; } = string.Empty; public decimal Confidence { get; init; } public string? NarrativeImportance { get; init; } public bool IsRecurring { get; init; } public string EvidenceVersion { get; init; } = CharacterIntelligenceVersions.Current; public int? LastUpdatedSceneResultID { get; init; } public DateTime CreatedUtc { get; init; } public DateTime UpdatedUtc { get; init; } } public static class CharacterIntelligenceVersions { public const string Current = "22"; } public sealed class CharacterIntelligenceProfileDocument { public string CanonicalName { get; set; } = string.Empty; public List Aliases { get; set; } = []; public string? RoleInStory { get; set; } public string? NarrativeImportance { get; set; } public string? Presentation { get; set; } public string? EstimatedAge { get; set; } public string? EstimatedAgeBand { get; set; } public string? HairColour { get; set; } public string? HairLength { get; set; } public string? HairStyle { get; set; } public string? EyeColour { get; set; } public string? SkinTone { get; set; } public string? Height { get; set; } public string? Build { get; set; } public List DistinctiveFeatures { get; set; } = []; public string? TypicalClothing { get; set; } public string? Occupation { get; set; } public List Relationships { get; set; } = []; public string? CurrentStatus { get; set; } public decimal Confidence { get; set; } public List EvidenceTimeline { get; set; } = []; public List Contradictions { get; set; } = []; public DateTime LastUpdatedUtc { get; set; } } public sealed class CharacterIntelligenceEvidenceItem { public int? SceneResultID { get; set; } public decimal? ChapterNumber { get; set; } public int? SceneNumber { get; set; } public string FieldName { get; set; } = string.Empty; public string? Value { get; set; } public string Evidence { get; set; } = string.Empty; public decimal Confidence { get; set; } public DateTime RecordedUtc { get; set; } = DateTime.UtcNow; } public sealed class CharacterIntelligenceContradiction { public string FieldName { get; set; } = string.Empty; public string? ExistingValue { get; set; } public string? NewValue { get; set; } public string Evidence { get; set; } = string.Empty; public decimal Confidence { get; set; } public int? SceneResultID { get; set; } } public sealed record CharacterIntelligenceProfileSave( int ImportSessionID, int ProjectID, int BookID, string CanonicalIdentityKey, string CanonicalName, string ProfileJson, decimal Confidence, string? NarrativeImportance, bool IsRecurring, string EvidenceVersion, int SceneResultID); public sealed record CharacterIntelligenceEvidenceSave( int CharacterIntelligenceProfileID, int SceneResultID, string FieldName, string? PreviousValue, string? NewValue, string Evidence, decimal Confidence, bool IsContradiction, string Source); public sealed class CharacterIntelligenceProfileUpdateResponse { public string SchemaVersion { get; init; } = CharacterIntelligenceVersions.Current; public List Updates { get; init; } = []; } public sealed class CharacterIntelligenceProfileUpdate { public string CanonicalName { get; init; } = string.Empty; public List Aliases { get; init; } = []; public string? RecurrenceSignal { get; init; } public decimal Confidence { get; init; } public List FieldUpdates { get; init; } = []; public List Contradictions { get; init; } = []; [JsonExtensionData] public Dictionary? ExtensionData { get; init; } } public sealed class CharacterIntelligenceFieldUpdate { public string FieldName { get; init; } = string.Empty; public string? Value { get; init; } public string Evidence { get; init; } = string.Empty; public decimal Confidence { get; init; } public bool IsNewInformation { get; init; } public bool IncreasesCertainty { get; init; } } public sealed class CharacterIntelligenceAiContradiction { public string FieldName { get; init; } = string.Empty; public string? ExistingValue { get; init; } public string? NewValue { get; init; } public string Evidence { get; init; } = string.Empty; public decimal Confidence { get; init; } }