namespace GmRelay.Web.Services.Portfolio;

public sealed record PublicPortfolioCard(
    string Slug,
    string Title,
    string CoverPath,
    string? System,
    string? Format,
    DateTime CompletedAt);

public sealed record PublicPortfolioMaster(string Slug, string DisplayName);

public sealed record PublicPortfolioReview(
    string AuthorDisplayName,
    string Body,
    DateTime CreatedAt);

public sealed record PublicPortfolioGame(
    string Slug,
    string Title,
    string Description,
    string CoverPath,
    string? System,
    string? Format,
    DateTime CompletedAt,
    string? ClubName,
    string? ClubSlug,
    IReadOnlyList<PublicPortfolioMaster> Masters,
    IReadOnlyList<PublicPortfolioReview> Reviews);

public sealed record PortfolioGameSummary(
    Guid Id,
    Guid GroupId,
    string Title,
    string? PublicSlug,
    bool IsPublic,
    DateTime CompletedAt,
    int SessionCount,
    int MasterCount,
    int PendingReviewCount);

public sealed record PortfolioSessionOption(
    Guid Id,
    string Title,
    DateTime ScheduledAt,
    bool Selected);

public sealed record PortfolioMasterOption(
    Guid PlayerId,
    string DisplayName,
    bool Selected);

public sealed record PortfolioReviewForModeration(
    Guid Id,
    string AuthorDisplayName,
    string Body,
    string ModerationStatus,
    DateTime CreatedAt);

public sealed record PortfolioGameEditor(
    Guid Id,
    Guid GroupId,
    string Title,
    string? PublicSlug,
    string? Description,
    string? CoverPath,
    string? System,
    string? Format,
    DateTime CompletedAt,
    bool IsPublic,
    IReadOnlyList<PortfolioSessionOption> Sessions,
    IReadOnlyList<PortfolioMasterOption> Masters,
    IReadOnlyList<PortfolioReviewForModeration> Reviews);

public sealed record PortfolioGameUpdate(
    string Title,
    string? PublicSlug,
    string? Description,
    string? System,
    string? Format,
    IReadOnlyList<Guid> SessionIds,
    IReadOnlyList<Guid> MasterPlayerIds);

public enum PortfolioReviewSubmissionState
{
    RequiresAuthentication,
    Ineligible,
    Eligible,
    AlreadySubmitted
}
