namespace PlotLine.Models;

public sealed class ProjectBackupExport
{
    public string Format { get; init; } = "PlotDirector.ProjectBackup";
    public string FormatVersion { get; init; } = "1.1";
    public DateTime ExportedAtUtc { get; init; }
    public string SourceApplication { get; init; } = "PlotDirector";
    public Project? Project { get; init; }
    public ProjectBackupData Data { get; init; } = new();
    public ProjectBackupDiagnostics Diagnostics { get; init; } = new();
}

public sealed class ProjectBackupData
{
    public IReadOnlyList<Book> Books { get; init; } = [];
    public IReadOnlyList<Chapter> Chapters { get; init; } = [];
    public IReadOnlyList<Scene> Scenes { get; init; } = [];
    public IReadOnlyList<ProjectBackupScenePurpose> ScenePurposes { get; init; } = [];
    public IReadOnlyList<ProjectBackupSceneOutcome> SceneOutcomes { get; init; } = [];
    public IReadOnlyList<SceneMetricType> SceneMetricTypes { get; init; } = [];
    public IReadOnlyList<SceneMetricValue> SceneMetricValues { get; init; } = [];
    public IReadOnlyList<ProjectTimelineSettings> TimelineSettings { get; init; } = [];
    public IReadOnlyList<ProjectTimelineMetricSetting> TimelineMetricSettings { get; init; } = [];
    public IReadOnlyList<TimelineViewPreset> TimelineViewPresets { get; init; } = [];
    public IReadOnlyList<PlotLineItem> PlotLines { get; init; } = [];
    public IReadOnlyList<PlotThread> PlotThreads { get; init; } = [];
    public IReadOnlyList<ThreadEvent> ThreadEvents { get; init; } = [];
    public IReadOnlyList<StoryAsset> StoryAssets { get; init; } = [];
    public IReadOnlyList<AssetState> AssetStates { get; init; } = [];
    public IReadOnlyList<AssetEvent> AssetEvents { get; init; } = [];
    public IReadOnlyList<AssetDependency> AssetDependencies { get; init; } = [];
    public IReadOnlyList<AssetCustodyEvent> AssetCustodyEvents { get; init; } = [];
    public IReadOnlyList<ProjectBackupAssetCustodyCharacter> AssetCustodyCharacters { get; init; } = [];
    public IReadOnlyList<Character> Characters { get; init; } = [];
    public IReadOnlyList<SceneCharacter> SceneCharacters { get; init; } = [];
    public IReadOnlyList<CharacterAttributeType> CharacterAttributeTypes { get; init; } = [];
    public IReadOnlyList<CharacterAttributeEvent> CharacterAttributeEvents { get; init; } = [];
    public IReadOnlyList<CharacterKnowledgeItem> CharacterKnowledge { get; init; } = [];
    public IReadOnlyList<CharacterRelationship> CharacterRelationships { get; init; } = [];
    public IReadOnlyList<RelationshipEvent> RelationshipEvents { get; init; } = [];
    public IReadOnlyList<LocationItem> Locations { get; init; } = [];
    public IReadOnlyList<LocationRelationship> LocationRelationships { get; init; } = [];
    public IReadOnlyList<FloorPlan> FloorPlans { get; init; } = [];
    public IReadOnlyList<FloorPlanFloor> FloorPlanFloors { get; init; } = [];
    public IReadOnlyList<FloorPlanBlock> FloorPlanBlocks { get; init; } = [];
    public IReadOnlyList<FloorPlanTransition> FloorPlanTransitions { get; init; } = [];
    public IReadOnlyList<SceneAssetLocation> SceneAssetLocations { get; init; } = [];
    public IReadOnlyList<SceneFloorPlanOccupancy> SceneFloorPlanOccupancy { get; init; } = [];
    public IReadOnlyList<SceneDependency> SceneDependencies { get; init; } = [];
    public IReadOnlyList<ProjectBackupValidationRun> ValidationRuns { get; init; } = [];
    public IReadOnlyList<ContinuityWarning> ContinuityWarnings { get; init; } = [];
    public IReadOnlyList<SceneNote> SceneNotes { get; init; } = [];
    public IReadOnlyList<SceneWorkflow> SceneWorkflow { get; init; } = [];
    public IReadOnlyList<SceneChecklistItem> SceneChecklistItems { get; init; } = [];
    public IReadOnlyList<SceneAttachment> SceneAttachments { get; init; } = [];
    public IReadOnlyList<ChapterGoal> ChapterGoals { get; init; } = [];
    public IReadOnlyList<Scenario> Scenarios { get; init; } = [];
    public IReadOnlyList<ProjectBackupScenarioSceneOrder> ScenarioSceneOrder { get; init; } = [];
    public IReadOnlyList<ProjectBackupScenarioValidationRun> ScenarioValidationRuns { get; init; } = [];
    public IReadOnlyList<ScenarioWarning> ScenarioWarnings { get; init; } = [];
    public IReadOnlyList<GenreMetricPreset> GenreMetricPresets { get; init; } = [];
    public IReadOnlyList<ProjectBackupGenreMetricPresetMetric> GenreMetricPresetMetrics { get; init; } = [];
    public IReadOnlyList<ProjectBackupAccessRecord> ProjectAccess { get; init; } = [];
    public IReadOnlyList<UserFile> UserFiles { get; init; } = [];
}

public sealed class ProjectBackupDiagnostics
{
    public int ProjectId { get; init; }
    public IReadOnlyList<string> IncludedEntitySets { get; init; } = [];
    public string? Note { get; init; }
}

public sealed class ProjectBackupResult
{
    public string FileName { get; init; } = string.Empty;
    public string ContentType { get; init; } = "application/json";
    public string Json { get; init; } = string.Empty;
}

public sealed class ProjectBackupScenePurpose
{
    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 ProjectBackupSceneOutcome
{
    public int SceneOutcomeID { get; set; }
    public int SceneID { get; set; }
    public string OutcomeDescription { get; set; } = string.Empty;
    public int? OutcomeTypeID { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }
}

public sealed class ProjectBackupAssetCustodyCharacter
{
    public int AssetCustodyEventCharacterID { get; set; }
    public int AssetCustodyEventID { get; set; }
    public int? CharacterID { get; set; }
    public string? CharacterName { get; set; }
    public string? CharacterNameText { get; set; }
    public int CustodyRoleID { get; set; }
    public string CustodyRoleName { get; set; } = string.Empty;
}

public sealed class ProjectBackupValidationRun
{
    public int ValidationRunID { get; set; }
    public int ProjectID { get; set; }
    public int? BookID { get; set; }
    public DateTime StartedDate { get; set; }
    public DateTime? CompletedDate { get; set; }
    public string? TriggeredBy { get; set; }
    public string? ScopeDescription { get; set; }
}

public sealed class ProjectBackupScenarioSceneOrder
{
    public int ScenarioSceneOrderID { get; set; }
    public int ScenarioID { get; set; }
    public int SceneID { get; set; }
    public int? ProposedChapterID { get; set; }
    public int ProposedSortOrder { get; set; }
    public string? Notes { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }
}

public sealed class ProjectBackupScenarioValidationRun
{
    public int ScenarioValidationRunID { get; set; }
    public int ScenarioID { get; set; }
    public DateTime StartedDate { get; set; }
    public DateTime? CompletedDate { get; set; }
    public int WarningCount { get; set; }
}

public sealed class ProjectBackupGenreMetricPresetMetric
{
    public int GenreMetricPresetID { get; set; }
    public string PresetKey { get; set; } = string.Empty;
    public string PresetName { get; set; } = string.Empty;
    public int MetricTypeID { get; set; }
    public string MetricName { get; set; } = string.Empty;
    public int SortOrder { get; set; }
}

public sealed class ProjectBackupAccessRecord
{
    public int ProjectUserAccessID { get; set; }
    public int ProjectID { get; set; }
    public int UserID { get; set; }
    public string Email { get; set; } = string.Empty;
    public string DisplayName { get; set; } = string.Empty;
    public string AccessRole { get; set; } = string.Empty;
    public int? InvitedByUserID { get; set; }
    public string? InvitedByEmail { get; set; }
    public DateTime? InvitedDateUTC { get; set; }
    public DateTime? AcceptedDateUTC { get; set; }
    public bool IsActive { get; set; }
}
