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
  category: string
  winnerName: string
  winnerSlug: string
  winnerPlatform: string
  winnerUrl: string
}

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 PublicSiteContent {
  hostDisplayName: string
  hostTagline: string
  newsletterUrl: string
  privacyEmail: string
  privacyPolicyContent: string
  socialLinks: PublicSocialLink[]
  footerLinks: FooterLink[]
}

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

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

export interface CandidateSummary {
  id: number
  displayName: string
  channelSlug: string
  platform: string
  /** Repräsentativer Clip/Video-Link, damit Votende vor der Wahl reinschauen können. */
  clipUrl?: string | null
  clipTitle?: string | null
  clipPlatform?: 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 {
  category: string
  winnerName: string
  winnerSlug: string
  winnerPlatform: string
  winnerUrl: string
}

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

export interface UserNominationState {
  categoryId: number
  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[]
}
