📄 Program.cs
using BfiMonitor;
using HuaweiWifiSms.Grpc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Quartz;

var builder = Host.CreateApplicationBuilder(args);

builder.ConfigureOpenTelemetry();

builder.Services.AddOptions<MonitorOptions>().BindConfiguration("Monitor");

builder.Services.AddGrpcClient<SmsSender.SmsSenderClient>(
    (sp, o) =>
    {
        var opts = sp.GetRequiredService<IOptions<MonitorOptions>>().Value;
        o.Address = new Uri(opts.SmsSenderAddress);
    }
);

builder.Services.AddSingleton<PlaywrightBrowserService>();
builder.Services.AddHostedService(sp => sp.GetRequiredService<PlaywrightBrowserService>());

builder.Services.AddSingleton<ScreeningRepository>();

builder.Services.AddSingleton(TimeProvider.System);

var intervalSeconds = builder.Configuration.GetValue("Monitor:IntervalSeconds", 300);

builder.Services.AddQuartz(q =>
{
    var checkerKey = JobKey.Create(nameof(BfiScreeningCheckerJob));
    q.AddJob<BfiScreeningCheckerJob>(checkerKey);
    q.AddTrigger(t =>
        t.ForJob(checkerKey)
            .StartNow()
            .WithSimpleSchedule(s => s.WithIntervalInSeconds(intervalSeconds).RepeatForever())
    );

    q.AddJob<SendSmsJob>(SendSmsJob.Key, j => j.StoreDurably());
});

builder.Services.AddQuartzHostedService(o => o.WaitForJobsToComplete = true);

using var app = builder.Build();

app.Run();