namespace PlotLine.Models; public sealed class Project { public int ProjectID { get; set; } public string ProjectName { get; set; } = string.Empty; public string? Description { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class Book { public int BookID { get; set; } public int ProjectID { get; set; } public string BookTitle { get; set; } = string.Empty; public int BookNumber { get; set; } public string? Description { get; set; } public int SortOrder { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class Chapter { public int ChapterID { get; set; } public int BookID { get; set; } public decimal ChapterNumber { get; set; } public string ChapterTitle { get; set; } = string.Empty; public int? POVCharacterID { get; set; } public string? Summary { get; set; } public int SortOrder { get; set; } public int RevisionStatusID { get; set; } public string RevisionStatusName { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class Scene { public int SceneID { get; set; } public int ChapterID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public string? Summary { get; set; } public int? POVCharacterID { get; set; } public int? PrimaryLocationID { get; set; } public string? PrimaryLocationName { get; set; } public string? PrimaryLocationPath { get; set; } public int SortOrder { get; set; } public int TimeModeID { get; set; } public string TimeModeName { get; set; } = string.Empty; public DateTime? StartDateTime { get; set; } public DateTime? EndDateTime { get; set; } public decimal? DurationAmount { get; set; } public int? DurationUnitID { get; set; } public string? DurationUnitName { get; set; } public string? RelativeTimeText { get; set; } public int TimeConfidenceID { get; set; } public string TimeConfidenceName { get; set; } = string.Empty; public string? ScenePurposeNotes { get; set; } public string? SceneOutcomeNotes { get; set; } public int RevisionStatusID { get; set; } public string RevisionStatusName { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } public List SelectedPurposeTypeIds { get; set; } = []; public List PurposeLabels { get; set; } = []; public List Metrics { get; set; } = []; public int WarningCount { get; set; } public int DependencyCount { get; set; } public string TimeLabel { get { if (!string.IsNullOrWhiteSpace(RelativeTimeText)) { return RelativeTimeText; } return StartDateTime?.ToString(TimeModeName == "Exact Date" ? "dd MMM yyyy" : "dd MMM yyyy HH:mm") ?? TimeModeName; } } } public sealed class RevisionStatus { public int RevisionStatusID { get; set; } public string StatusName { get; set; } = string.Empty; public int SortOrder { get; set; } } public sealed class TimeMode { public int TimeModeID { get; set; } public string TimeModeName { get; set; } = string.Empty; public int SortOrder { get; set; } } public sealed class DurationUnit { public int DurationUnitID { get; set; } public string DurationUnitName { get; set; } = string.Empty; public int SortOrder { get; set; } } public sealed class TimeConfidence { public int TimeConfidenceID { get; set; } public string TimeConfidenceName { get; set; } = string.Empty; public int SortOrder { get; set; } } public sealed class ScenePurposeType { public int ScenePurposeTypeID { get; set; } public string PurposeName { get; set; } = string.Empty; public int SortOrder { get; set; } } public sealed class ScenePurposeLabel { public int SceneID { get; set; } public int ScenePurposeTypeID { get; set; } public string PurposeName { get; set; } = string.Empty; public int SortOrder { get; set; } } public sealed class SceneMetricType { public int MetricTypeID { get; set; } public int? ProjectID { get; set; } public string MetricName { get; set; } = string.Empty; public string? Description { get; set; } public int MinValue { get; set; } public int MaxValue { get; set; } public int DefaultValue { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class SceneMetricValue { public int SceneID { get; set; } public int MetricTypeID { get; set; } public string MetricName { get; set; } = string.Empty; public string? Description { get; set; } public int MinValue { get; set; } public int MaxValue { get; set; } public int DefaultValue { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } public int Value { get; set; } public string? Notes { get; set; } } public sealed class TimelineMetricPoint { public int SceneID { get; set; } public int MetricTypeID { get; set; } public string MetricName { get; set; } = string.Empty; public int Value { get; set; } public string? Notes { get; set; } } public sealed class PlotLineType { public int PlotLineTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class PlotLineItem { public int PlotLineID { get; set; } public int ProjectID { get; set; } public int? BookID { get; set; } public string? BookTitle { get; set; } public string PlotLineName { get; set; } = string.Empty; public int PlotLineTypeID { get; set; } public string PlotLineTypeName { get; set; } = string.Empty; public string? Description { get; set; } public int? ParentPlotLineID { get; set; } public string? ParentPlotLineName { get; set; } public int SortOrder { get; set; } public string Colour { get; set; } = "#2f6f63"; public bool IsMainPlot { get; set; } public bool IsVisibleOnTimeline { get; set; } = true; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class ThreadType { public int ThreadTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class ThreadStatus { public int ThreadStatusID { get; set; } public string StatusName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsOpenStatus { get; set; } public bool IsResolvedStatus { get; set; } public bool IsActive { get; set; } } public sealed class PlotThread { public int PlotThreadID { get; set; } public int PlotLineID { get; set; } public int ProjectID { get; set; } public string PlotLineName { get; set; } = string.Empty; public string ThreadTitle { get; set; } = string.Empty; public int ThreadTypeID { get; set; } public string ThreadTypeName { get; set; } = string.Empty; public int ThreadStatusID { get; set; } public string ThreadStatusName { get; set; } = string.Empty; public int Importance { get; set; } = 5; public string? Summary { get; set; } public int? IntroducedSceneID { get; set; } public int? PlannedResolutionSceneID { get; set; } public int? ActualResolutionSceneID { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class ThreadEventType { public int ThreadEventTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public string MarkerText { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class ThreadEvent { public int ThreadEventID { get; set; } public int PlotThreadID { get; set; } public string ThreadTitle { get; set; } = string.Empty; public int PlotLineID { get; set; } public string PlotLineName { get; set; } = string.Empty; public string Colour { get; set; } = "#2f6f63"; public int SceneID { get; set; } public int EventTypeID { get; set; } public string EventTypeName { get; set; } = string.Empty; public string MarkerText { get; set; } = string.Empty; public string EventTitle { get; set; } = string.Empty; public string? EventDescription { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class SceneOption { public int SceneID { get; set; } public string BookTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public string ChapterTitle { get; set; } = string.Empty; public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; } public sealed class PlotLookupData { public IReadOnlyList PlotLineTypes { get; init; } = []; public IReadOnlyList ThreadTypes { get; init; } = []; public IReadOnlyList ThreadStatuses { get; init; } = []; public IReadOnlyList ThreadEventTypes { get; init; } = []; } public sealed class AssetKind { public int AssetKindID { get; set; } public string KindName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class AssetState { public int AssetStateID { get; set; } public int? ProjectID { get; set; } public int? AssetKindID { get; set; } public string StateName { get; set; } = string.Empty; public int SortOrder { get; set; } public string? Description { get; set; } public bool IsResolvedState { get; set; } public bool IsActive { get; set; } } public sealed class StoryAsset { public int StoryAssetID { get; set; } public int ProjectID { get; set; } public string AssetName { get; set; } = string.Empty; public int AssetKindID { get; set; } public string KindName { get; set; } = string.Empty; public string? Description { get; set; } public int Importance { get; set; } = 5; public int? CurrentStateID { get; set; } public string? CurrentStateName { get; set; } public int? CurrentLocationID { get; set; } public string? CurrentLocationName { get; set; } public string? CurrentLocationPath { get; set; } public bool IsResolved { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class AssetEventType { public int AssetEventTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public string MarkerText { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class AssetEvent { public int AssetEventID { get; set; } public int StoryAssetID { get; set; } public int ProjectID { get; set; } public string AssetName { get; set; } = string.Empty; public int AssetKindID { get; set; } public string KindName { get; set; } = string.Empty; public int SceneID { get; set; } public int AssetEventTypeID { get; set; } public string AssetEventTypeName { get; set; } = string.Empty; public string MarkerText { get; set; } = string.Empty; public int? FromStateID { get; set; } public string? FromStateName { get; set; } public int? ToStateID { get; set; } public string? ToStateName { get; set; } public string EventTitle { get; set; } = string.Empty; public string? EventDescription { get; set; } public string? BookTitle { get; set; } public decimal ChapterNumber { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class AssetDependencyType { public int AssetDependencyTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsValidatingDependency { get; set; } public bool IsActive { get; set; } } public sealed class AssetDependency { public int AssetDependencyID { get; set; } public int SourceAssetID { get; set; } public string SourceAssetName { get; set; } = string.Empty; public int TargetAssetID { get; set; } public string TargetAssetName { get; set; } = string.Empty; public int AssetDependencyTypeID { get; set; } public string DependencyTypeName { get; set; } = string.Empty; public bool IsValidatingDependency { get; set; } public int? SourceRequiredStateID { get; set; } public string? SourceRequiredStateName { get; set; } public int? TargetBlockedStateID { get; set; } public string? TargetBlockedStateName { get; set; } public string? Description { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class AssetCustodyEventType { public int AssetCustodyEventTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class CustodyRole { public int CustodyRoleID { get; set; } public string RoleName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class AssetCustodyEvent { public int AssetCustodyEventID { get; set; } public int StoryAssetID { get; set; } public string AssetName { get; set; } = string.Empty; public int SceneID { get; set; } public int AssetCustodyEventTypeID { get; set; } public string CustodyEventTypeName { get; set; } = string.Empty; public string? Description { get; set; } public string? CustodianSummary { get; set; } public string? BookTitle { get; set; } public decimal ChapterNumber { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class AssetDependencyIssue { public int AssetDependencyID { get; set; } public string SourceAssetName { get; set; } = string.Empty; public string TargetAssetName { get; set; } = string.Empty; public string DependencyTypeName { get; set; } = string.Empty; public string? SourceRequiredStateName { get; set; } public string? TargetBlockedStateName { get; set; } public string? Description { get; set; } } public sealed class AssetLookupData { public IReadOnlyList AssetKinds { get; init; } = []; public IReadOnlyList AssetStates { get; init; } = []; public IReadOnlyList AssetEventTypes { get; init; } = []; public IReadOnlyList AssetDependencyTypes { get; init; } = []; public IReadOnlyList AssetCustodyEventTypes { get; init; } = []; public IReadOnlyList CustodyRoles { get; init; } = []; } public sealed class Character { public int CharacterID { get; set; } public int ProjectID { get; set; } public string CharacterName { get; set; } = string.Empty; public string? ShortName { get; set; } public string? Sex { get; set; } public DateTime? BirthDate { get; set; } public int? AgeAtSeriesStart { get; set; } public int? AgeReferenceSceneID { get; set; } public string? Height { get; set; } public string? EyeColour { get; set; } public string? DefaultDescription { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class CharacterRoleInSceneType { public int CharacterRoleInSceneTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class PresenceType { public int PresenceTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class SceneCharacter { public int SceneCharacterID { get; set; } public int SceneID { get; set; } public int CharacterID { get; set; } public int ProjectID { get; set; } public string CharacterName { get; set; } = string.Empty; public string? ShortName { get; set; } public DateTime? BirthDate { get; set; } public int? AgeAtSeriesStart { get; set; } public int? RoleInSceneTypeID { get; set; } public string? RoleInSceneTypeName { get; set; } public int? PresenceTypeID { get; set; } public string? PresenceTypeName { get; set; } public int? LocationID { get; set; } public string? LocationName { get; set; } public string? LocationPath { get; set; } public int? EntryLocationID { get; set; } public string? EntryLocationName { get; set; } public int? ExitLocationID { get; set; } public string? ExitLocationName { get; set; } public string? AppearanceNotes { get; set; } public string? OutfitDescription { get; set; } public string? PhysicalCondition { get; set; } public string? EmotionalState { get; set; } public string? KnowledgeNotes { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public string BookTitle { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class CharacterAttributeType { public int CharacterAttributeTypeID { get; set; } public int? ProjectID { get; set; } public string AttributeName { get; set; } = string.Empty; public string DataType { get; set; } = "Text"; public bool IsNormallyStable { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class CharacterAttributeEvent { public int CharacterAttributeEventID { get; set; } public int CharacterID { get; set; } public string CharacterName { get; set; } = string.Empty; public int CharacterAttributeTypeID { get; set; } public string AttributeName { get; set; } = string.Empty; public int SceneID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public string BookTitle { get; set; } = string.Empty; public string AttributeValue { get; set; } = string.Empty; public string? Description { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class KnowledgeState { public int KnowledgeStateID { get; set; } public string StateName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class CharacterKnowledgeItem { public int CharacterKnowledgeID { get; set; } public int CharacterID { get; set; } public string CharacterName { get; set; } = string.Empty; public int? StoryAssetID { get; set; } public string? AssetName { get; set; } public int? PlotThreadID { get; set; } public string? ThreadTitle { get; set; } public int SceneID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public string BookTitle { get; set; } = string.Empty; public int KnowledgeStateID { get; set; } public string KnowledgeStateName { get; set; } = string.Empty; public int? SourceEventID { get; set; } public string? Description { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class RelationshipType { public int RelationshipTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public bool IsPermanentDefault { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class RelationshipState { public int RelationshipStateID { get; set; } public string StateName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class CharacterRelationship { public int CharacterRelationshipID { get; set; } public int ProjectID { get; set; } public int CharacterAID { get; set; } public string CharacterAName { get; set; } = string.Empty; public int CharacterBID { get; set; } public string CharacterBName { get; set; } = string.Empty; public int RelationshipTypeID { get; set; } public string RelationshipTypeName { get; set; } = string.Empty; public bool IsPermanent { get; set; } public int? StartSceneID { get; set; } public int? EndSceneID { get; set; } public bool IsKnownToReader { get; set; } public string? Notes { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class RelationshipEvent { public int RelationshipEventID { get; set; } public int CharacterRelationshipID { get; set; } public int ProjectID { get; set; } public int CharacterAID { get; set; } public string CharacterAName { get; set; } = string.Empty; public int CharacterBID { get; set; } public string CharacterBName { get; set; } = string.Empty; public string RelationshipTypeName { get; set; } = string.Empty; public int SceneID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public string BookTitle { get; set; } = string.Empty; public int RelationshipStateID { get; set; } public string RelationshipStateName { get; set; } = string.Empty; public int? Intensity { get; set; } public bool IsKnownToOtherCharacter { get; set; } public string? Description { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class CharacterLookupData { public IReadOnlyList RoleTypes { get; init; } = []; public IReadOnlyList PresenceTypes { get; init; } = []; public IReadOnlyList AttributeTypes { get; init; } = []; public IReadOnlyList KnowledgeStates { get; init; } = []; public IReadOnlyList RelationshipTypes { get; init; } = []; public IReadOnlyList RelationshipStates { get; init; } = []; } public sealed class LocationType { public int LocationTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class LocationRelationshipType { public int LocationRelationshipTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class LocationItem { public int LocationID { get; set; } public int ProjectID { get; set; } public int? ParentLocationID { get; set; } public string? ParentLocationName { get; set; } public string LocationName { get; set; } = string.Empty; public int? LocationTypeID { get; set; } public string? LocationTypeName { get; set; } public string? Description { get; set; } public string LocationPath { get; set; } = string.Empty; public int Depth { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class LocationRelationship { public int LocationRelationshipID { get; set; } public int FromLocationID { get; set; } public string FromLocationName { get; set; } = string.Empty; public int ToLocationID { get; set; } public string ToLocationName { get; set; } = string.Empty; public int LocationRelationshipTypeID { get; set; } public string RelationshipTypeName { get; set; } = string.Empty; public bool IsBidirectional { get; set; } public int? Strength { get; set; } public bool CanHearNormalSpeech { get; set; } public bool CanHearLoudNoise { get; set; } public bool CanSeeMovement { get; set; } public bool CanSeeClearly { get; set; } public bool CanTravelDirectly { get; set; } public string? Notes { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class SceneAssetLocation { public int SceneAssetLocationID { get; set; } public int SceneID { get; set; } public int StoryAssetID { get; set; } public string AssetName { get; set; } = string.Empty; public int LocationID { get; set; } public string LocationName { get; set; } = string.Empty; public string LocationPath { get; set; } = string.Empty; public string? Description { get; set; } public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } } public sealed class LocationLookupData { public IReadOnlyList LocationTypes { get; init; } = []; public IReadOnlyList RelationshipTypes { get; init; } = []; } public sealed class WarningType { public int WarningTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public string? Description { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class WarningSeverity { public int WarningSeverityID { get; set; } public string SeverityName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class ContinuityWarning { public int ContinuityWarningID { get; set; } public int? ValidationRunID { get; set; } public int ProjectID { get; set; } public int? BookID { get; set; } public string? BookTitle { get; set; } public int? ChapterID { get; set; } public decimal? ChapterNumber { get; set; } public string? ChapterTitle { get; set; } public int? SceneID { get; set; } public decimal? SceneNumber { get; set; } public string? SceneTitle { get; set; } public string EntityType { get; set; } = string.Empty; public int? EntityID { get; set; } public int WarningTypeID { get; set; } public string WarningTypeName { get; set; } = string.Empty; public int WarningSeverityID { get; set; } public string SeverityName { get; set; } = string.Empty; public string Message { get; set; } = string.Empty; public string? Details { get; set; } public bool IsDismissed { get; set; } public bool IsIntentional { get; set; } public DateTime CreatedDate { get; set; } public DateTime LastDetectedDate { get; set; } } public sealed class WarningLookupData { public IReadOnlyList WarningTypes { get; init; } = []; public IReadOnlyList Severities { get; init; } = []; } public sealed class ContinuityValidationSummary { public int ValidationRunID { get; set; } public int ErrorCount { get; set; } public int WarningCount { get; set; } public int InfoCount { get; set; } public int TotalCount { get; set; } } public sealed class SceneWarningCount { public int SceneID { get; set; } public int WarningCount { get; set; } } public sealed class SceneDependencyType { public int SceneDependencyTypeID { get; set; } public string TypeName { get; set; } = string.Empty; public int SortOrder { get; set; } public bool IsActive { get; set; } } public sealed class SceneDependency { public int SceneDependencyID { get; set; } public int ProjectID { get; set; } public int SourceSceneID { get; set; } public int TargetSceneID { get; set; } public int SceneDependencyTypeID { get; set; } public string SceneDependencyTypeName { get; set; } = string.Empty; public string? Description { get; set; } public bool IsHardDependency { get; set; } public string? DependencyDirection { get; set; } public int SourceBookID { get; set; } public string SourceBookTitle { get; set; } = string.Empty; public int SourceChapterID { get; set; } public decimal SourceChapterNumber { get; set; } public decimal SourceSceneNumber { get; set; } public string SourceSceneTitle { get; set; } = string.Empty; public int TargetBookID { get; set; } public string TargetBookTitle { get; set; } = string.Empty; public int TargetChapterID { get; set; } public decimal TargetChapterNumber { get; set; } public decimal TargetSceneNumber { get; set; } public string TargetSceneTitle { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } public DateTime UpdatedDate { get; set; } public bool IsArchived { get; set; } } public sealed class SceneDependencyLookupData { public IReadOnlyList DependencyTypes { get; init; } = []; } public sealed class SceneDependencyCount { public int SceneID { get; set; } public int DependencyCount { get; set; } } public sealed class ChapterOption { public int ChapterID { get; set; } public int BookID { get; set; } public string BookTitle { get; set; } = string.Empty; public int BookNumber { get; set; } public decimal ChapterNumber { get; set; } public string ChapterTitle { get; set; } = string.Empty; } public sealed class SceneMovePreview { public int SceneID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public int SourceChapterID { get; set; } public decimal SourceChapterNumber { get; set; } public string SourceChapterTitle { get; set; } = string.Empty; public int SourceBookID { get; set; } public string SourceBookTitle { get; set; } = string.Empty; public int TargetChapterID { get; set; } public decimal TargetChapterNumber { get; set; } public string TargetChapterTitle { get; set; } = string.Empty; public int TargetBookID { get; set; } public string TargetBookTitle { get; set; } = string.Empty; public string Position { get; set; } = "End"; public int DependencyCount { get; set; } public int ActiveWarningCount { get; set; } } public sealed class AnalyticsMetricPoint { public int SceneID { get; set; } public int BookID { get; set; } public string BookTitle { get; set; } = string.Empty; public int ChapterID { get; set; } public decimal ChapterNumber { get; set; } public string ChapterTitle { get; set; } = string.Empty; public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public int GlobalSceneIndex { get; set; } public int BookSceneIndex { get; set; } public int MetricTypeID { get; set; } public string MetricName { get; set; } = string.Empty; public int Value { get; set; } public int MinValue { get; set; } public int MaxValue { get; set; } public int Percent { get; set; } } public sealed class AnalyticsRevisionSummary { public int RevisionStatusID { get; set; } public string StatusName { get; set; } = string.Empty; public int SceneCount { get; set; } public int ChapterCount { get; set; } } public sealed class AnalyticsRevisionScene { public int SceneID { get; set; } public int BookID { get; set; } public string BookTitle { get; set; } = string.Empty; public int ChapterID { get; set; } public decimal ChapterNumber { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public string RevisionStatusName { get; set; } = string.Empty; } public sealed class AnalyticsPurposeSummary { public int ScenePurposeTypeID { get; set; } public string PurposeName { get; set; } = string.Empty; public int SceneCount { get; set; } public decimal PercentOfScenes { get; set; } } public sealed class AnalyticsSceneGap { public int SceneID { get; set; } public int BookID { get; set; } public string BookTitle { get; set; } = string.Empty; public int ChapterID { get; set; } public decimal ChapterNumber { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public bool MissingPurpose { get; set; } public bool MissingOutcome { get; set; } } public sealed class AnalyticsThreadHealth { public int PlotThreadID { get; set; } public string ThreadTitle { get; set; } = string.Empty; public int PlotLineID { get; set; } public string PlotLineName { get; set; } = string.Empty; public int Importance { get; set; } public string ThreadStatusName { get; set; } = string.Empty; public bool IsOpenStatus { get; set; } public bool IsResolvedStatus { get; set; } public int? IntroducedSceneID { get; set; } public int? PlannedResolutionSceneID { get; set; } public int? ActualResolutionSceneID { get; set; } public int? LastTouchedSceneID { get; set; } public string? LastTouchedSceneLabel { get; set; } public bool IsHighImportanceOpen { get; set; } public bool IsDormant { get; set; } public bool HasClueWithoutPayoff { get; set; } public bool HasQuestionWithoutAnswer { get; set; } } public sealed class AnalyticsAssetHealth { public int StoryAssetID { get; set; } public string AssetName { get; set; } = string.Empty; public string KindName { get; set; } = string.Empty; public int Importance { get; set; } public int? CurrentStateID { get; set; } public string? CurrentStateName { get; set; } public int? CurrentLocationID { get; set; } public string? CurrentLocationPath { get; set; } public bool IsResolved { get; set; } public int? LastEventSceneID { get; set; } public string? LastEventSceneLabel { get; set; } public bool HasDependencies { get; set; } public bool HasDependencyWarnings { get; set; } } public sealed class AnalyticsWarningSeverityCount { public string SeverityName { get; set; } = string.Empty; public int WarningCount { get; set; } } public sealed class AnalyticsWarningTypeCount { public string WarningTypeName { get; set; } = string.Empty; public int WarningCount { get; set; } } public sealed class AnalyticsWarningHotspot { public int SceneID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public string BookTitle { get; set; } = string.Empty; public int WarningCount { get; set; } public int HighestSeveritySort { get; set; } } public sealed class AnalyticsPovSummary { public string POVName { get; set; } = string.Empty; public int? POVCharacterID { get; set; } public int SceneCount { get; set; } } public sealed class AnalyticsMultiPovChapter { public int ChapterID { get; set; } public decimal ChapterNumber { get; set; } public string ChapterTitle { get; set; } = string.Empty; public int POVCount { get; set; } } public sealed class AnalyticsCharacterAppearance { public int CharacterID { get; set; } public string CharacterName { get; set; } = string.Empty; public int SceneCount { get; set; } } public sealed class AnalyticsBusyScene { public int SceneID { get; set; } public decimal SceneNumber { get; set; } public string SceneTitle { get; set; } = string.Empty; public decimal ChapterNumber { get; set; } public int CharacterCount { get; set; } } public sealed class AnalyticsLocationUsage { public string LocationName { get; set; } = string.Empty; public int? LocationID { get; set; } public string LocationPath { get; set; } = string.Empty; public int SceneCount { get; set; } } public sealed class LookupData { public IReadOnlyList RevisionStatuses { get; init; } = []; public IReadOnlyList TimeModes { get; init; } = []; public IReadOnlyList DurationUnits { get; init; } = []; public IReadOnlyList TimeConfidences { get; init; } = []; public IReadOnlyList ScenePurposeTypes { get; init; } = []; }