export interface TimelineItem {
  key: string
  title: string
  startsAt: string
  endsAt: string
  state: 'done' | 'active' | 'upcoming'
}

export interface FeaturedCategory {
  id: number
  groupName: string
  name: string
  description: string
  maxNomineesPerUser: number
}

export interface WinnerPreview {
  year: number
  categoryGroup: string
  category: string
  winnerName: string
  winnerSlug: string
  winnerPlatform: string
  winnerUrl: string
  clipUrl?: string | null
  clipTitle?: string | null
  clipPlatform?: string | null
  clipEmbedStatus?: string | null
}

export interface ArchiveYearSummary {
  year: number
  winnerCount: number
}

export interface FaqItem {
  question: string
  answer: string
}

export interface PublicSocialLink {
  label: string
  platform: string
  url: string
  icon?: string | null
  showOnHost?: boolean | null
  showOnCommunity?: boolean | null
}

export interface FooterLink {
  key: string
  label: string
  url: string
  content: string
}

export interface PublicStreamBannerContent {
  eyebrow: string
  title: string
  text: string
  liveButtonLabel: string
  liveButtonUrl: string
  lockedButtonLabel: string
  useCompletedContent: boolean
  completedEyebrow: string
  completedTitle: string
  completedText: string
  completedButtonLabel: string
  completedButtonUrl: string
}

export interface PublicSiteContent {
  hostDisplayName: string
  hostTagline: string
  hostArtistName: string
  hostImageUrl: string
  newsletterUrl: string
  shareXUrl: string
  shareDiscordUrl: string
  privacyEmail: string
  privacyPolicyContent: string
  awardsSectionTitle: string
  awardsSectionDescription: string
  subcategoriesSectionTitle: string
  subcategoriesSectionDescription: string
  streamBanner: PublicStreamBannerContent
  socialLinks: PublicSocialLink[]
  footerLinks: FooterLink[]
}

export interface PublicSiteStatusResponse {
  demoLoginEnabled: boolean
  maintenanceModeEnabled: boolean
  maintenanceTitle: string
  maintenanceMessage: string
}

export interface PublicFeatureFlags {
  clipSubmissionsEnabled: boolean
  clipReviewEnabled: boolean
  clipAdminMenuVisible: boolean
  clipSubmissionDisabledMessage: string
  showactApplicationsEnabled: boolean
  showactApplicationStartsAt: string | null
  showactApplicationEndsAt: string | null
  showactApplicationDisabledMessage: string
  sponsorsVisible: boolean
  showactFormSchemaJson: string
}

export interface OverviewResponse {
  seasonId: number
  year: number
  title: string
  showDate: string
  showStartsAt: string
  currentPhase: string
  isCommunityOnly: boolean
  loginProvider: string
  timeline: TimelineItem[]
  featuredCategories: FeaturedCategory[]
  winnersPreview: WinnerPreview[]
  archiveYears: ArchiveYearSummary[]
  siteContent: PublicSiteContent
  featureFlags: PublicFeatureFlags
  faq: FaqItem[]
}

export interface CandidateSummary {
  id: number
  displayName: string
  channelSlug: string
  channelUrl?: string | null
  platform: string
  /** Repräsentativer Clip/Video-Link, damit Votende vor der Wahl reinschauen können. */
  clipUrl?: string | null
  clipTitle?: string | null
  clipPlatform?: string | null
  clipEmbedStatus?: string | null
}

export interface PublicCategoryDetail {
  id: number
  name: string
  groupName: string
  description: string
  maxNomineesPerUser: number
  candidates: CandidateSummary[]
}

export interface SeasonCategoriesResponse {
  seasonId: number
  year: number
  categories: PublicCategoryDetail[]
}

export interface WinnerArchiveItem {
  categoryGroup: string
  category: string
  winnerName: string
  winnerSlug: string
  winnerPlatform: string
  winnerUrl: string
  clipUrl?: string | null
  clipTitle?: string | null
  clipPlatform?: string | null
  clipEmbedStatus?: string | null
}

export interface WinnerArchiveResponse {
  year: number
  items: WinnerArchiveItem[]
}

export interface SponsorItem {
  id: number
  seasonId: number
  name: string
  websiteUrl: string
  logoUrl: string
  description: string
  tier: string
  sortOrder: number
  isVisible: boolean
}

export interface PublicSponsorsResponse {
  year: number
  items: SponsorItem[]
}

export interface UserNominationState {
  categoryId: number | null
  categoryGroupName: string
  nominees: string[]
}

export interface UserVoteState {
  categoryId: number
  candidateId: number
}

export interface UserClipSubmissionState {
  id: number
  categoryId: number | null
  clipUrl: string
  title: string
  creator: string
  platform: string
  status: string
  createdAt: string
  reviewNote: string | null
  reviewedAt: string | null
}

export interface UserParticipationResponse {
  seasonId: number
  year: number
  nominations: UserNominationState[]
  votes: UserVoteState[]
  clipSubmissions: UserClipSubmissionState[]
}
