namespace SpaceGame.Api.PlayerFaction.Contracts;

public sealed record PlayerAssetRegistrySnapshot(
  IReadOnlyList<string> ShipIds,
  IReadOnlyList<string> StationIds,
  IReadOnlyList<string> CommanderIds,
  IReadOnlyList<string> ClaimIds,
  IReadOnlyList<string> ConstructionSiteIds,
  IReadOnlyList<string> PolicySetIds,
  IReadOnlyList<string> MarketOrderIds,
  IReadOnlyList<string> FleetIds,
  IReadOnlyList<string> TaskForceIds,
  IReadOnlyList<string> StationGroupIds,
  IReadOnlyList<string> EconomicRegionIds,
  IReadOnlyList<string> FrontIds,
  IReadOnlyList<string> ReserveIds);

public sealed record PlayerStrategicIntentSnapshot(
  string StrategicPosture,
  string EconomicPosture,
  string MilitaryPosture,
  string LogisticsPosture,
  float DesiredReserveRatio,
  bool AllowDelegatedCombatAutomation,
  bool AllowDelegatedEconomicAutomation,
  string? Notes);

public sealed record PlayerFleetSnapshot(
  string Id,
  string Label,
  string Status,
  string Role,
  string? CommanderId,
  string? FrontId,
  string? HomeSystemId,
  string? HomeStationId,
  string? PolicyId,
  string? AutomationPolicyId,
  string? ReinforcementPolicyId,
  IReadOnlyList<string> AssetIds,
  IReadOnlyList<string> TaskForceIds,
  IReadOnlyList<string> DirectiveIds,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerTaskForceSnapshot(
  string Id,
  string Label,
  string Status,
  string Role,
  string? FleetId,
  string? CommanderId,
  string? FrontId,
  string? PolicyId,
  string? AutomationPolicyId,
  IReadOnlyList<string> AssetIds,
  IReadOnlyList<string> DirectiveIds,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerStationGroupSnapshot(
  string Id,
  string Label,
  string Status,
  string Role,
  string? EconomicRegionId,
  string? PolicyId,
  string? AutomationPolicyId,
  IReadOnlyList<string> StationIds,
  IReadOnlyList<string> DirectiveIds,
  IReadOnlyList<string> FocusItemIds,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerEconomicRegionSnapshot(
  string Id,
  string Label,
  string Status,
  string Role,
  string? SharedEconomicRegionId,
  string? PolicyId,
  string? AutomationPolicyId,
  IReadOnlyList<string> SystemIds,
  IReadOnlyList<string> StationGroupIds,
  IReadOnlyList<string> DirectiveIds,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerFrontSnapshot(
  string Id,
  string Label,
  string Status,
  float Priority,
  string Posture,
  string? SharedFrontLineId,
  string? TargetFactionId,
  IReadOnlyList<string> SystemIds,
  IReadOnlyList<string> FleetIds,
  IReadOnlyList<string> ReserveIds,
  IReadOnlyList<string> DirectiveIds,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerReserveGroupSnapshot(
  string Id,
  string Label,
  string Status,
  string ReserveKind,
  string? HomeSystemId,
  string? PolicyId,
  IReadOnlyList<string> AssetIds,
  IReadOnlyList<string> FrontIds,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerFactionPolicySnapshot(
  string Id,
  string Label,
  string ScopeKind,
  string? ScopeId,
  string? PolicySetId,
  bool AllowDelegatedCombat,
  bool AllowDelegatedTrade,
  float ReserveCreditsRatio,
  float ReserveMilitaryRatio,
  string TradeAccessPolicy,
  string DockingAccessPolicy,
  string ConstructionAccessPolicy,
  string OperationalRangePolicy,
  string CombatEngagementPolicy,
  bool AvoidHostileSystems,
  float FleeHullRatio,
  IReadOnlyList<string> BlacklistedSystemIds,
  string? Notes,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerAutomationPolicySnapshot(
  string Id,
  string Label,
  string ScopeKind,
  string? ScopeId,
  bool Enabled,
  string BehaviorKind,
  bool UseOrders,
  string? StagingOrderKind,
  int MaxSystemRange,
  bool KnownStationsOnly,
  float Radius,
  float WaitSeconds,
  string? PreferredItemId,
  string? Notes,
  IReadOnlyList<ShipOrderTemplateSnapshot> RepeatOrders,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerReinforcementPolicySnapshot(
  string Id,
  string Label,
  string ScopeKind,
  string? ScopeId,
  string ShipKind,
  int DesiredAssetCount,
  int MinimumReserveCount,
  bool AutoTransferReserves,
  bool AutoQueueProduction,
  string? SourceReserveId,
  string? TargetFrontId,
  string? Notes,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerProductionProgramSnapshot(
  string Id,
  string Label,
  string Status,
  string Kind,
  string? TargetShipKind,
  string? TargetModuleId,
  string? TargetItemId,
  int TargetCount,
  int CurrentCount,
  string? StationGroupId,
  string? ReinforcementPolicyId,
  string? Notes,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerDirectiveSnapshot(
  string Id,
  string Label,
  string Status,
  string Kind,
  string ScopeKind,
  string ScopeId,
  string? TargetEntityId,
  string? TargetSystemId,
  Vector3Dto? TargetPosition,
  string? HomeSystemId,
  string? HomeStationId,
  string? SourceStationId,
  string? DestinationStationId,
  string BehaviorKind,
  bool UseOrders,
  string? StagingOrderKind,
  string? ItemId,
  string? PreferredNodeId,
  string? PreferredConstructionSiteId,
  string? PreferredModuleId,
  int Priority,
  float Radius,
  float WaitSeconds,
  int MaxSystemRange,
  bool KnownStationsOnly,
  IReadOnlyList<Vector3Dto> PatrolPoints,
  IReadOnlyList<ShipOrderTemplateSnapshot> RepeatOrders,
  string? PolicyId,
  string? AutomationPolicyId,
  string? Notes,
  DateTimeOffset CreatedAtUtc,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerAssignmentSnapshot(
  string Id,
  string AssetKind,
  string AssetId,
  string? FleetId,
  string? TaskForceId,
  string? StationGroupId,
  string? EconomicRegionId,
  string? FrontId,
  string? ReserveId,
  string? DirectiveId,
  string? PolicyId,
  string? AutomationPolicyId,
  string Role,
  string Status,
  DateTimeOffset UpdatedAtUtc);

public sealed record PlayerDecisionLogEntrySnapshot(
  string Id,
  string Kind,
  string Summary,
  string? RelatedEntityKind,
  string? RelatedEntityId,
  DateTimeOffset OccurredAtUtc);

public sealed record PlayerAlertSnapshot(
  string Id,
  string Kind,
  string Severity,
  string Summary,
  string? AssetKind,
  string? AssetId,
  string? RelatedDirectiveId,
  string Status,
  DateTimeOffset CreatedAtUtc);

public sealed record PlayerFactionSnapshot(
  string Id,
  string Label,
  string? PersonaName,
  string? RaceId,
  string SovereignFactionId,
  bool RequiresOnboarding,
  string Status,
  DateTimeOffset CreatedAtUtc,
  DateTimeOffset UpdatedAtUtc,
  PlayerAssetRegistrySnapshot AssetRegistry,
  PlayerStrategicIntentSnapshot StrategicIntent,
  IReadOnlyList<PlayerFleetSnapshot> Fleets,
  IReadOnlyList<PlayerTaskForceSnapshot> TaskForces,
  IReadOnlyList<PlayerStationGroupSnapshot> StationGroups,
  IReadOnlyList<PlayerEconomicRegionSnapshot> EconomicRegions,
  IReadOnlyList<PlayerFrontSnapshot> Fronts,
  IReadOnlyList<PlayerReserveGroupSnapshot> Reserves,
  IReadOnlyList<PlayerFactionPolicySnapshot> Policies,
  IReadOnlyList<PlayerAutomationPolicySnapshot> AutomationPolicies,
  IReadOnlyList<PlayerReinforcementPolicySnapshot> ReinforcementPolicies,
  IReadOnlyList<PlayerProductionProgramSnapshot> ProductionPrograms,
  IReadOnlyList<PlayerDirectiveSnapshot> Directives,
  IReadOnlyList<PlayerAssignmentSnapshot> Assignments,
  IReadOnlyList<PlayerDecisionLogEntrySnapshot> DecisionLog,
  IReadOnlyList<PlayerAlertSnapshot> Alerts);
