
namespace SpaceGame.Api.Universe.Runtime;

public sealed class SystemRuntime
{
    public required SolarSystemDefinition Definition { get; init; }
    public required Vector3 Position { get; init; }
}

public sealed class AnchorRuntime
{
    public required string Id { get; init; }
    public required string SystemId { get; init; }
    public required SpatialNodeKind Kind { get; init; }
    public required Vector3 Position { get; set; }
    public float LocalSpaceRadius { get; set; }
    public string? ParentAnchorId { get; set; }
    public string? OrbitReferenceId { get; set; }
    public string? OccupyingStructureId { get; set; }
    public required string SourceEntityKind { get; init; }
    public required string SourceEntityId { get; init; }
    public string LastDeltaSignature { get; set; } = string.Empty;
}

public sealed class ResourceNodeRuntime
{
    public required string Id { get; init; }
    public required string AnchorId { get; init; }
    public required string SystemId { get; init; }
    public required Vector3 Position { get; set; }
    public required string SourceKind { get; init; }
    public required string ItemId { get; init; }
    public float LocalSpaceRadius { get; init; }
    public float OrbitRadius { get; init; }
    public float OrbitPhase { get; init; }
    public float OrbitInclination { get; init; }
    public float OreRemaining { get; set; }
    public float MaxOre { get; init; }
    public List<ResourceDepositRuntime> Deposits { get; } = [];
    public string LastDeltaSignature { get; set; } = string.Empty;
}

public sealed class ResourceDepositRuntime
{
    public required string Id { get; init; }
    public required string NodeId { get; init; }
    public required string AnchorId { get; init; }
    public required Vector3 Position { get; set; }
    public float OreRemaining { get; set; }
    public float MaxOre { get; init; }
}

public sealed class CelestialRuntime
{
    public required string Id { get; init; }
    public required string SystemId { get; init; }
    public required SpatialNodeKind Kind { get; init; }
    public required Vector3 Position { get; set; }
    public float LocalSpaceRadius { get; init; }
    public string? ParentAnchorId { get; set; }
    public string? OccupyingStructureId { get; set; }
    public string? OrbitReferenceId { get; set; }
    public string LastDeltaSignature { get; set; } = string.Empty;
}

public sealed class WreckRuntime
{
    public required string Id { get; init; }
    public required string SourceKind { get; init; }
    public required string SourceEntityId { get; init; }
    public required string SystemId { get; set; }
    public required Vector3 Position { get; set; }
    public required string ItemId { get; set; }
    public float RemainingAmount { get; set; }
    public float MaxAmount { get; init; }
}

public sealed class ShipSpatialStateRuntime
{
    public SpaceLayerKind SpaceLayer { get; set; } = SpaceLayerKind.LocalSpace;
    public required string CurrentSystemId { get; set; }
    public string? CurrentAnchorId { get; set; }
    public Vector3? LocalPosition { get; set; }
    public Vector3? SystemPosition { get; set; }
    public MovementRegimeKind MovementRegime { get; set; } = MovementRegimeKind.LocalFlight;
    public string? DestinationAnchorId { get; set; }
    public ShipTransitRuntime? Transit { get; set; }
}

public sealed class ShipTransitRuntime
{
    public required MovementRegimeKind Regime { get; init; }
    public string? OriginAnchorId { get; init; }
    public string? DestinationAnchorId { get; init; }
    public DateTimeOffset? StartedAtUtc { get; set; }
    public DateTimeOffset? ArrivalDueAtUtc { get; set; }
    public float Progress { get; set; }
}
