using ClaudeDo.Data.Repositories;
using ClaudeDo.Worker.Tests.Infrastructure;

namespace ClaudeDo.Worker.Tests.Repositories;

public class WeekReportRepositoryTests : IDisposable
{
    private readonly DbFixture _db = new();
    public void Dispose() => _db.Dispose();

    private static readonly DateOnly Start = new(2026, 5, 28);
    private static readonly DateOnly End = new(2026, 6, 3);

    [Fact]
    public async Task Upsert_Insert_Then_GetByRange_RoundTrips()
    {
        using (var ctx = _db.CreateContext())
            await new WeekReportRepository(ctx).UpsertAsync(Start, End, "# Report");
        using var read = _db.CreateContext();
        var row = await new WeekReportRepository(read).GetByRangeAsync(Start, End);
        Assert.NotNull(row);
        Assert.Equal("# Report", row!.Markdown);
    }

    [Fact]
    public async Task Upsert_Existing_Overwrites_Markdown()
    {
        using (var ctx = _db.CreateContext())
            await new WeekReportRepository(ctx).UpsertAsync(Start, End, "old");
        using (var ctx = _db.CreateContext())
            await new WeekReportRepository(ctx).UpsertAsync(Start, End, "new");
        using var read = _db.CreateContext();
        var row = await new WeekReportRepository(read).GetByRangeAsync(Start, End);
        Assert.Equal("new", row!.Markdown);
    }

    [Fact]
    public async Task GetByRange_MissingRange_ReturnsNull()
    {
        using var read = _db.CreateContext();
        Assert.Null(await new WeekReportRepository(read).GetByRangeAsync(Start, End));
    }
}
