namespace Backend.Contracts;

public sealed record AdminSiteSettingsResponse(
    string HostDisplayName,
    string HostTagline,
    string HostArtistName,
    string HostImageUrl,
    string NewsletterUrl,
    string ShareXUrl,
    string ShareDiscordUrl,
    string PrivacyEmail,
    string PrivacyPolicyContent,
    string? PrivacyPolicyUpdatedBy,
    DateTimeOffset? PrivacyPolicyUpdatedAt,
    string ImprintUrl,
    string ImprintContent,
    string ContactUrl,
    string ContactContent,
    string SponsorsUrl,
    string SponsorsContent,
    string ShowactsUrl,
    string ShowactsContent,
    string StreamBannerEyebrow,
    string StreamBannerTitle,
    string StreamBannerText,
    string StreamBannerLiveButtonLabel,
    string StreamBannerLiveButtonUrl,
    string StreamBannerLockedButtonLabel,
    bool StreamBannerUseCompletedContent,
    string StreamBannerCompletedEyebrow,
    string StreamBannerCompletedTitle,
    string StreamBannerCompletedText,
    string StreamBannerCompletedButtonLabel,
    string StreamBannerCompletedButtonUrl,
    string AwardsSectionTitle,
    string AwardsSectionDescription,
    string SubcategoriesSectionTitle,
    string SubcategoriesSectionDescription,
    IEnumerable<PublicSocialLinkDto> SocialLinks,
    IEnumerable<FaqItemDto> Faq,
    string ShowactFormSchemaJson);

public sealed record UpdateSiteSettingsRequest(
    string HostDisplayName,
    string HostTagline,
    string HostArtistName,
    string NewsletterUrl,
    string ShareXUrl,
    string ShareDiscordUrl,
    string PrivacyEmail,
    string PrivacyPolicyContent,
    string ImprintUrl,
    string ImprintContent,
    string ContactUrl,
    string ContactContent,
    string SponsorsUrl,
    string SponsorsContent,
    string ShowactsUrl,
    string ShowactsContent,
    string StreamBannerEyebrow,
    string StreamBannerTitle,
    string StreamBannerText,
    string StreamBannerLiveButtonLabel,
    string StreamBannerLiveButtonUrl,
    string StreamBannerLockedButtonLabel,
    bool StreamBannerUseCompletedContent,
    string StreamBannerCompletedEyebrow,
    string StreamBannerCompletedTitle,
    string StreamBannerCompletedText,
    string StreamBannerCompletedButtonLabel,
    string StreamBannerCompletedButtonUrl,
    string AwardsSectionTitle,
    string AwardsSectionDescription,
    string SubcategoriesSectionTitle,
    string SubcategoriesSectionDescription,
    PublicSocialLinkDto[] SocialLinks,
    FaqItemDto[] Faq,
    string? ShowactFormSchemaJson = null);

public sealed record AdminOperationalSettingsResponse(
    bool DemoLoginManagedByDatabase,
    bool DemoLoginEnabled,
    string DemoLoginEmail,
    bool DemoLoginPasswordSet,
    string DemoLoginTwitchUserId,
    string DemoLoginDisplayName,
    bool TwitchAuthManagedByDatabase,
    bool TwitchAuthConfigured,
    string TwitchClientId,
    bool TwitchClientSecretSet,
    string TwitchRedirectUri,
    string TwitchScope,
    int SessionIdleTimeoutHours,
    bool MaintenanceModeEnabled,
    string MaintenanceTitle,
    string MaintenanceMessage);

public sealed record AdminOptionalFeatureSettingsResponse(
    bool ClipSubmissionsEnabled,
    bool ClipReviewEnabled,
    bool ClipAdminMenuVisible,
    string ClipSubmissionDisabledMessage,
    bool ShowactApplicationsEnabled,
    DateOnly? ShowactApplicationStartsAt,
    DateOnly? ShowactApplicationEndsAt,
    bool ShowactApplicationsOpenNow,
    string ShowactApplicationDisabledMessage,
    bool SponsorsVisible);

public sealed record UpdateOptionalFeatureSettingsRequest(
    bool ClipSubmissionsEnabled,
    bool ClipReviewEnabled,
    bool ClipAdminMenuVisible,
    string ClipSubmissionDisabledMessage,
    bool ShowactApplicationsEnabled,
    DateOnly? ShowactApplicationStartsAt,
    DateOnly? ShowactApplicationEndsAt,
    string ShowactApplicationDisabledMessage,
    bool SponsorsVisible);

public sealed record UpdateOperationalSettingsRequest(
    bool DemoLoginEnabled,
    string DemoLoginEmail,
    string? DemoLoginPassword,
    string DemoLoginTwitchUserId,
    string DemoLoginDisplayName,
    string TwitchClientId,
    string? TwitchClientSecret,
    string TwitchRedirectUri,
    string TwitchScope,
    int SessionIdleTimeoutHours,
    bool MaintenanceModeEnabled,
    string MaintenanceTitle,
    string MaintenanceMessage);

public sealed record AdminTrackingSourceDto(
    string ProviderKey,
    string ProviderLabel,
    string BaseUrl,
    string NotesSummary,
    bool ShowManualReviewNotesInReview);

public sealed record AdminTrackingMetricRuleDto(
    string Key,
    string Label,
    bool Enabled,
    string SourceSupport,
    string Description,
    bool RequiredForAutoClassification,
    bool ShowInReview,
    bool ShowInAdminSummary,
    bool ManualOverrideAllowed,
    string WindowKey,
    string[] AutoSupportedWindowKeys,
    string? ProviderFieldKey,
    int? TopCount,
    int? MinPrimaryCategorySharePercent,
    int? MinPrimaryCategoryHours,
    int? MaxDistinctCategoriesBeforeFlag,
    string[] IgnoredCategories,
    bool MatchAwardCategoryAgainstTopCategories,
    bool FlagIfAwardCategoryNotInTopX,
    bool FlagIfCategorySpreadTooWide,
    bool FlagIfNoCategoryContextAvailable,
    int? MinValue,
    int? MaxValue);

public sealed record AdminTrackingFlagRuleDto(
    string Key,
    string Label,
    bool Enabled,
    string Severity,
    string Description,
    bool AutoTriggerEnabled,
    bool RequiresManualReview,
    bool BlocksApproval,
    bool AdminNoteRequiredOnOverride);

public sealed record AdminTrackingRulesResponse(
    AdminTrackingSourceDto Source,
    AdminTrackingMetricRuleDto[] ImportantMetrics,
    AdminTrackingMetricRuleDto[] OptionalMetrics,
    AdminTrackingFlagRuleDto[] Flags,
    string ManualReviewNotes);

public sealed record UpdateTrackingRulesRequest(
    AdminTrackingSourceDto Source,
    AdminTrackingMetricRuleDto[] ImportantMetrics,
    AdminTrackingMetricRuleDto[] OptionalMetrics,
    AdminTrackingFlagRuleDto[] Flags,
    string ManualReviewNotes);

public sealed record UpdateTrackingSourceRequest(
    AdminTrackingSourceDto Source);

public sealed record UpdateTrackingReviewNotesRequest(
    string ManualReviewNotes,
    bool ShowManualReviewNotesInReview);
