namespace Backend.Contracts;

public sealed record AdminSeasonListItemDto(
    int Id,
    int Year,
    string Name,
    string CurrentPhase,
    bool IsCurrent,
    int CategoryCount);

public sealed record AdminCategoryItemDto(
    int Id,
    string GroupName,
    string Name,
    string Slug,
    string Description,
    int SortOrder,
    int MaxNomineesPerUser,
    int CandidateCount);

public sealed record AdminCandidateItemDto(
    int Id,
    int CategoryId,
    string DisplayName,
    string ChannelSlug,
    string Platform);

public sealed record AdminAwardResultItemDto(
    int Id,
    int CategoryId,
    string CategoryName,
    int CandidateId,
    string CandidateDisplayName,
    string CandidateChannelSlug,
    string CandidatePlatform);

public sealed record AdminSeasonDetailResponse(
    int Id,
    int Year,
    string Name,
    string ShowStreamUrl,
    string CurrentPhase,
    bool IsCurrent,
    bool IsCommunityOnly,
    DateOnly NominationStartsAt,
    DateOnly NominationEndsAt,
    DateOnly VotingStartsAt,
    DateOnly VotingEndsAt,
    DateOnly ReviewStartsAt,
    DateOnly ReviewEndsAt,
    DateOnly ShowDate,
    TimeOnly ShowStartsAt,
    IEnumerable<AdminCategoryItemDto> Categories,
    IEnumerable<AdminCandidateItemDto> Candidates,
    IEnumerable<AdminNominationReviewItemDto> PendingNominations,
    IEnumerable<AdminNominationReviewItemDto> ReviewedNominations,
    IEnumerable<AdminAwardResultItemDto> Results,
    IEnumerable<AdminClipSubmissionItemDto> ClipSubmissions);

public sealed record CreateSeasonRequest(
    int Year,
    string Name,
    string ShowStreamUrl,
    string CurrentPhase,
    bool IsCurrent,
    bool IsCommunityOnly,
    DateOnly NominationStartsAt,
    DateOnly NominationEndsAt,
    DateOnly VotingStartsAt,
    DateOnly VotingEndsAt,
    DateOnly ReviewStartsAt,
    DateOnly ReviewEndsAt,
    DateOnly ShowDate,
    TimeOnly ShowStartsAt,
    int? CopyStructureFromSeasonId = null);

public sealed record UpdateSeasonRequest(
    int Year,
    string Name,
    string ShowStreamUrl,
    string CurrentPhase,
    bool IsCurrent,
    bool IsCommunityOnly,
    DateOnly NominationStartsAt,
    DateOnly NominationEndsAt,
    DateOnly VotingStartsAt,
    DateOnly VotingEndsAt,
    DateOnly ReviewStartsAt,
    DateOnly ReviewEndsAt,
    DateOnly ShowDate,
    TimeOnly ShowStartsAt);

public sealed record UpsertCategoryRequest(
    string GroupName,
    string Name,
    string Slug,
    string Description,
    int SortOrder,
    int MaxNomineesPerUser);

public sealed record UpsertCandidateRequest(
    int CategoryId,
    string DisplayName,
    string ChannelSlug,
    string Platform);

public sealed record SetAwardResultRequest(
    int CategoryId,
    int CandidateId);
