using Microsoft.Extensions.Options;
namespace NeonSprawl.Server.Game.PositionState;
/// Runs DDL and dev-player seed once when the host starts (PostgreSQL path only).
internal sealed class PostgresDevPlayerSeedHostedService(
Npgsql.NpgsqlDataSource dataSource,
IOptions positionOptions) : IHostedService
{
private readonly GamePositionOptions gameOptions = RequireDevPlayer(positionOptions.Value);
private static GamePositionOptions RequireDevPlayer(GamePositionOptions options)
{
if (string.IsNullOrWhiteSpace(options.DevPlayerId))
{
throw new InvalidOperationException("Game:DevPlayerId must be non-empty.");
}
return options;
}
public Task StartAsync(CancellationToken cancellationToken)
{
PostgresPositionBootstrap.EnsureSchema(dataSource);
PostgresPositionBootstrap.SeedDevPlayer(dataSource, gameOptions);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}