// Zentrales deutsches Dictionary. Struktur nach Feature-Bereich gruppiert.
// BUGFIX (Selbst-Review): namePlaceholderOptional/joiningButton/joinButton/
// errorJoinDefault existierten bisher IDENTISCH sowohl in "home" als auch in
// "session" (zwei unabhaengige Kopien derselben Woerter fuer die zwei
// Join-Bildschirme: Startseite-Wizard vs. Session-Screen bei Beitritt per
// Share-Link). Jetzt nach "common" verschoben - EINE Quelle, die von beiden
// Bildschirmen genutzt wird. home.joinTitle/joinSubtitle und
// session.joinTitle(code) bleiben bewusst getrennt, da sie sich inhaltlich
// unterscheiden (Startseite erklaert die Code-Eingabe, der Session-Screen
// kennt den Code schon aus der URL und zeigt ihn direkt im Titel).
import type { OpeningHoursLabels } from '@/lib/opening-hours';

export interface Dictionary {
  common: {
    back: string;
    next: string;
    close: string;
    namePlaceholderOptional: string;
    joiningButton: string;
    joinButton: string;
    errorJoinDefault: string;
    errorSessionNotFound: string;
  };
  home: {
    introSubtitle: string;
    startSessionButton: string;
    joinSessionButton: string;
    stepAriaLabel: (current: number, total: number) => string;
    step1Title: string;
    step1Subtitle: string;
    namePlaceholder: string;
    step2TitleWithName: (name: string) => string;
    step2TitleNoName: string;
    step2Subtitle: string;
    cityPlaceholder: string;
    radiusLabel: string;
    step3Title: string;
    step3Subtitle: string;
    cuisineLabel: string;
    diceButton: string;
    excludeFastFoodLabel: string;
    excludeFastFoodExcluded: string;
    excludeFastFoodAllowed: string;
    creatingButton: string;
    createButton: string;
    errorCreateDefault: string;
    joinTitle: string;
    joinSubtitle: string;
    codePlaceholder: string;
    pageTitle: string;
    joinInlineCloseAriaLabel: string;
    joinInlineSubmitAriaLabel: string;
    joinInlineBackAriaLabel: string;
    howItWorksButton: string;
    resumeButton: string;

  };
  session: {
    joinTitle: (code: string) => string;
    loadingRestaurants: string;
    headerTitle: (code: string) => string;
    infoAriaLabel: string;
    infoTitle: string;
    inviteButton: string;
    leaveSessionButton: string;
    noRestaurantsFound: string;
    stackEmptyPrompt: string;
    loadMoreButton: string;
    loadingMoreButton: string;
    jokerButton: string;
    jokerLoadingButton: string;
    jokerOnlyCreatorHint: string;
    jokerAlreadyDrawnHint: string;
    toastJoined: (name: string) => string;
    toastLeft: (name: string) => string;
    defaultParticipantName: string;
    shareTitle: string;
    shareText: (code: string) => string;
    linkCopied: (url: string) => string;
    confirmLeaveSession: string;
    errorRemovedFromSession: string;
    errorVetoLimit: string;
    errorUndoFailed: string;
    errorJokerFailed: string;
    confirmKick: string;
    errorKickFailed: string;
    errorLeaveFailed: string;
    eitherJokerLabel: string;
    jokerLabel: string;
    orLabel: string;
    requestMoreCardsButton: string;
    requestingMoreCardsButton: string;
    tapJokerHint: string;
    waitingForOracle: (name: string) => string;
    jokerWaitForOthers: (names: string[]) => string;
    newTableButton: string;
    pageTitle: string;
  };
  swipeCard: {
    symbolBadge: string;
    sponsoredBadge: string;
    noMoreRestaurants: string;
    noVetosLeft: string;
    undoAriaLabel: string;
    undoTitle: string;
    noAriaLabel: string;
    vetoAriaLabel: string;
    yesAriaLabel: string;
    detailsAriaLabel: string;
    detailsTitle: string;
    noImageAvailable: string;
    closeAriaLabel: string;
    websiteBadge: string;
    orderButton: string;
    callButton: string;
    websiteButton: string;
    reservationButton: string;
    legalDisclaimerAriaLabel: string;
  };
  filters: {
    cuisineSearchPlaceholder: string;
    noResults: string;
  };
  sessionInfo: {
    title: (code: string) => string;
    closeAriaLabel: string;
    participantsHeading: (count: number) => string;
    youSuffix: string;
    guestFallbackName: string;
    vetosUsedOf3: (used: number) => string;
    removeButton: string;
    activeFiltersTitle: string;
    noFiltersActive: string;
    copyCodeAriaLabel: string;
    hostBadgeLabel: string;
    codeCopiedToast: string;
  };
  match: {
    matchLabel: string;
    jokerLabel: string;
    votesResult: (yes: number, total: number) => string;
    forcedChoiceQuotes: string[];
    buildPartialQuotes: (pct: number) => string[];
    callOrReserveButton: string;
    mapsButton: string;
    shareResultButton: string;
    shareResultText: (name: string) => string;
    dataDisclaimer: string;
    jokerRevealHeading: string;
    jokerCardSubtitle: string;
    runnerUpsTitle: string;
    votesCount: (n: number) => string;
    runnerUpRouteAriaLabel: (name: string) => string;
    runnerUpOrderAriaLabel: (name: string) => string;
    chosenByJoker: string;
    selectedFromUndecided: (n: number) => string;
  };
  tutorial: {
    welcomeTitle: string;
    startButton: string;
    rulesHeading: string;
    undoDescription: string;
    noDescription: string;
    vetoDescriptionPart1: string;
    vetoDescriptionPart2: string;
    yesDescription: string;
    detailsTitle: string;
    detailsDescription: string;
    matchTitle: string;
    matchDescription: string;
    jokerTitle: string;
    jokerDescription: string;
  };

  matchHistory: {
    matchBadge: string;
    jokerBadge: string;
    justNow: string;
    minutesAgo: (n: number) => string;
    hoursAgo: (n: number) => string;
    yesterday: string;
    daysAgo: (n: number) => string;
    deleteEntryAriaLabel: string;
    clearAllLabel: string;
    emptyTitle: string;
    emptySubtitle: string;
    emptyCta: string;
    shareAriaLabel: string;
    openMapsAriaLabel: string;
    copiedLabel: string;
    participantsLabel: (names: string[]) => string;
    sessionLabel: string;
    copySessionAriaLabel: string;
  };

  nav: {
    home: string;
    matches: string;
    settings: string;
  };

  matches: {
    pageTitle: string;
    title: string;
    subtitle: string;
  };

  settings: {
    pageTitle: string;
    title: string;
    nameLabel: string;
    nameHint: string;
    languageLabel: string;
    dataSectionTitle: string;
    dataSectionDescription: string;
    dataResetButton: string;
    feedbackTitle: string;
    feedbackDescription: string;
    feedbackButton: string;
    feedbackSubject: string;
    feedbackBody: string;
    experienceSectionTitle: string;
    hapticsTitle: string;
    hapticsDescription: string;
    soundTitle: string;
    soundDescription: string;
  };

  pwaBanner: {
    title: string;
    subtitle: string;
    installButton: string;
    dismissAriaLabel: string;
  };

  dataPrivacy: {
    resetDataButton: string;
    resetDataTitle: string;
    resetDataMessage: string;
    resetDataConfirm: string;
    resetDataCancel: string;
    resetDataSuccess: string;
  };

  deleteDataPage: {
    pageTitle: string;
    metaDescription: string;
    heading: string;
    intro: string;
    localDataTitle: string;
    localDataDescription: string;
    localDataBulletCode: string;
    localDataBulletAnonymousId: string;
    localDataBulletHistory: string;
    localDataBulletLanguage: string;
    resetButton: string;
    resetSuccess: string;
    serverDataTitle: string;
    serverDataDescription: string;
    serverDataBulletSwipes: string;
    serverDataBulletMatches: string;
    serverDataBulletSessions: string;
    serverDataContact: string;
    contactEmailSubject: string;
    contactEmailBody: string;
    backToHome: string;
  };

  openingHours: OpeningHoursLabels;
}

export const de: Dictionary = {
  common: {
    back: 'Zurück',
    next: 'Weiter',
    close: 'Schließen',
    namePlaceholderOptional: 'Dein Name (optional)',
    joiningButton: 'Trete bei...',
    joinButton: 'Beitreten',
    errorJoinDefault: 'Beitritt fehlgeschlagen.',
    errorSessionNotFound: 'Tisch nicht gefunden. Hast du dich vertippt?',
  },
  home: {
    introSubtitle: 'Finde gemeinsam ein Restaurant – ganz ohne Account und in unter einer Minute.',
    startSessionButton: 'Tisch starten',
    joinSessionButton: 'Tisch beitreten',
    stepAriaLabel: (current, total) => `Schritt ${current} von ${total}`,
    step1Title: 'Wie heißt du?',
    step1Subtitle: 'Optional — hilft den anderen in der Runde.',
    namePlaceholder: 'Dein Name',
    step2TitleWithName: (name) => `Okay ${name}, in welcher Stadt?`,
    step2TitleNoName: 'Okay, in welcher Stadt?',
    step2Subtitle: 'Ort und Suchradius für eure Runde.',
    cityPlaceholder: 'Stadt, Land oder PLZ',
    radiusLabel: 'Umkreis',
    step3Title: 'Worauf habt ihr Lust?',
    step3Subtitle: 'Küche wählen, würfeln oder alles offen lassen.',
    cuisineLabel: 'Küche (optional)',
    diceButton: 'Würfeln',
    excludeFastFoodLabel: 'Ketten & Fast Food',
    excludeFastFoodExcluded: 'Ausgeschlossen',
    excludeFastFoodAllowed: 'Erlaubt',
    creatingButton: 'Erstelle Tisch...',
    createButton: 'Tisch erstellen',
    errorCreateDefault: 'Fehler beim Erstellen',
    joinTitle: 'Tisch beitreten',
    joinSubtitle: 'Code von eurem Host eingeben.',
    codePlaceholder: 'Tisch-Code, z.B. AB12CD',
    pageTitle: 'Start',
    joinInlineCloseAriaLabel: 'Schließen',
    joinInlineSubmitAriaLabel: 'Beitreten',
    joinInlineBackAriaLabel: 'Zurück zum Code',
    howItWorksButton: 'So geht\'s',
    resumeButton: 'Weiter swipen',
  },
  session: {
    joinTitle: (code) => `Tisch ${code} beitreten`,
    loadingRestaurants: 'Lade Restaurants...',
    headerTitle: (code) => `Tisch ${code}`,
    infoAriaLabel: 'Tisch-Infos',
    infoTitle: 'Filter & Teilnehmer anzeigen',
    inviteButton: 'Einladen',
    leaveSessionButton: 'Tisch verlassen',
    noRestaurantsFound: 'Keine Restaurants gefunden. Prüfe Ort und Umkreis.',
    stackEmptyPrompt: "Stapel leer — wie geht's weiter?",
    loadMoreButton: 'Weitere Karten',
    loadingMoreButton: 'Lade weitere Karten...',
    jokerButton: 'Schicksals-Joker ziehen',
    jokerLoadingButton: 'Ziehe...',
    jokerOnlyCreatorHint: 'Nur der Gruppenleiter kann den Joker ziehen.',
    jokerAlreadyDrawnHint: 'Der Schicksals-Joker hat bereits entschieden.',
    toastJoined: (name) => `${name} ist beigetreten`,
    toastLeft: (name) => `${name} hat verlassen`,
    defaultParticipantName: 'Jemand',
    shareTitle: 'Yumder Tisch',
    shareText: (code) => `Tritt meinem Yumder-Tisch bei: ${code}`,
    linkCopied: (url) => `Link kopiert: ${url}`,
    confirmLeaveSession: 'Tisch wirklich verlassen? Deine bisherigen Swipes bleiben gespeichert, du zählst aber nicht mehr für neue Matches.',
    errorRemovedFromSession: 'Du wurdest von diesem Tisch entfernt.',
    errorVetoLimit: 'Veto-Limit erreicht.',
    errorUndoFailed: 'Zurücknehmen fehlgeschlagen.',
    errorJokerFailed: 'Joker konnte nicht gezogen werden.',
    confirmKick: 'Diese Person wirklich vom Tisch entfernen?',
    errorKickFailed: 'Entfernen fehlgeschlagen.',
    errorLeaveFailed: 'Verlassen fehlgeschlagen.',
    eitherJokerLabel: 'Entweder: Joker',
    jokerLabel: 'Joker',
    orLabel: 'oder',
    requestMoreCardsButton: 'Weitere Karten anfordern',
    requestingMoreCardsButton: 'Lade weitere Karten...',
    tapJokerHint: 'Karte antippen, um den Joker aufzudecken',
    waitingForOracle: (name) => `${name} befragt gerade das Orakel…`,
    jokerWaitForOthers: (names) => `Noch nicht alle fertig: ${names.join(', ')}`,
    newTableButton: 'Neuen Tisch starten',
    pageTitle: 'Swipen',

  },
  swipeCard: {
    symbolBadge: 'Platzhalterbild',
    sponsoredBadge: 'Werbung',
    noMoreRestaurants: 'Keine weiteren Restaurants im Stapel.',
    noVetosLeft: 'Keine Vetos mehr übrig.',
    undoAriaLabel: 'Zurücknehmen',
    undoTitle: 'Letzten Swipe zurücknehmen',
    noAriaLabel: 'Nope',
    vetoAriaLabel: 'Veto',
    yesAriaLabel: 'Lecker!',
    detailsAriaLabel: 'Details anzeigen',
    detailsTitle: 'Mehr Infos zu diesem Restaurant',
    noImageAvailable: 'Kein Bild verfügbar',
    closeAriaLabel: 'Schließen',
    websiteBadge: 'Webseite',
    orderButton: 'Direkt bestellen',
    callButton: 'Anrufen',
    websiteButton: 'Webseite',
    reservationButton: 'Tisch reservieren',
    legalDisclaimerAriaLabel: 'Rechtlicher Hinweis',
  },
  filters: {
    cuisineSearchPlaceholder: 'Küche suchen...',
    noResults: 'Keine Treffer.',
  },
  sessionInfo: {
    title: (code) => `Tisch ${code}`,
    closeAriaLabel: 'Schließen',
    participantsHeading: (count) => `Teilnehmer (${count})`,
    youSuffix: '(Du)',
    guestFallbackName: 'Gast',
    vetosUsedOf3: (used) => `${used}/3 Vetos`,
    removeButton: 'Entfernen',
    activeFiltersTitle: 'Aktive Filter dieses Tischs',
    noFiltersActive: 'Keine zusätzlichen Filter aktiv.',
    copyCodeAriaLabel: 'Code kopieren',
    codeCopiedToast: 'Code kopiert',
    hostBadgeLabel: 'Gruppenleiter',
  },
  match: {
    matchLabel: 'MATCH!',
    jokerLabel: 'JOKER!',
    votesResult: (yes, total) => `${yes} von ${total} Stimmen`,
    forcedChoiceQuotes: [
      "Nicht mal beim Swipen kommt ihr zusammen. Ich sag: hier geht's hin!",
      "Kein Match, kein Ja, keine Liebe. Zum Glück gibt's mich. Ihr geht hierhin.",
      "Ihr wart euch nicht mal bei einem Restaurant einig. Klassisches Verhalten bei Gruppenentscheidungen. Ich entscheide.",
      "0% Zustimmung, 100% Joker-Power. Es geht hierhin, basta.",
    ],
    buildPartialQuotes: (pct) => [
      `Nur ${pct}% wollten das – aber der Joker kennt keine Mehrheiten!`,
      `${pct}% Zustimmung reichten dem Joker völlig. Zufall schlägt Demokratie.`,
      `Mehrheit? Unwichtig. ${pct}% genügten dem Schicksal.`,
      `Der Joker hat gesprochen: ${pct}% Zustimmung, Rest ist Schicksal.`,
    ],
    callOrReserveButton: 'Anrufen/Reservieren',
    mapsButton: 'Route anzeigen',
    shareResultButton: 'Ergebnis teilen',
    shareResultText: (name) => `Wir gehen zu ${name}!`,
    dataDisclaimer: 'Öffnungszeiten & Kontaktdaten können veraltet sein. Bitte vor dem Losfahren kurz auf Google/Apple Maps verifizieren.',
    jokerRevealHeading: 'Der Schicksals-Joker entscheidet...',
    jokerCardSubtitle: 'Joker',
    runnerUpsTitle: 'Knapp dahinter',
    votesCount: (n) => (n === 1 ? `${n} Stimme` : `${n} Stimmen`),
    runnerUpRouteAriaLabel: (name) => `Route zu ${name} anzeigen`,
    runnerUpOrderAriaLabel: (name) => `${name} bei Lieferando bestellen`,
    chosenByJoker: 'Vom Joker erwählt',
    selectedFromUndecided: (n) => `Ausgewählt aus ${n} unentschiedenen Restaurants`,
  },
  tutorial: {
    welcomeTitle: 'Willkommen bei Yumder!',
    startButton: "Los geht's!",
    rulesHeading: "So funktioniert's",
    undoDescription: 'Deinen letzten Swipe rückgängig machen, falls du dich vertippt hast.',
    noDescription: 'Nach links wischen oder tippen: dieses Restaurant ist nichts für dich.',
    vetoDescriptionPart1: 'Nach unten wischen oder tippen: streicht das Restaurant sofort für alle.',
    vetoDescriptionPart2: 'Die Zahl am Icon zeigt dir live, wie viele Vetos du noch übrig hast.',
    yesDescription: 'Nach rechts wischen oder tippen: du würdest hier gerne essen.',
    detailsTitle: 'Details',
    detailsDescription: 'Zeigt Adresse, Öffnungszeiten, Karte und Kontaktmöglichkeiten zum Restaurant.',
    matchTitle: 'Match',
    matchDescription: 'Sagen genug Leute "Ja" zum selben Restaurant, gibt\'s live für alle ein Match: bei 2 Personen müssen beide zustimmen, ab 3 Personen reicht eine ⅔-Mehrheit.',
    jokerTitle: 'Schicksals-Joker',
    jokerDescription: 'Ist der Stapel leer und es gab noch kein Match, kann der/die Gruppenleiter:in einmalig einen Joker ziehen. Der entscheidet gewichtet nach "Ja"-Stimmen — je mehr Zustimmung ein Restaurant schon hat, desto wahrscheinlicher wird es gezogen.',
  },
  openingHours: {
    unknown: 'Öffnungszeiten unbekannt',
    currentlyClosed: 'Aktuell geschlossen',
    open247: 'Durchgehend geöffnet',
    unclear: 'Öffnungszeiten unklar',
    openNow: 'Jetzt geöffnet',
  },
  matchHistory: {
    matchBadge: 'Match',
    jokerBadge: 'Joker',
    justNow: 'Gerade eben',
    minutesAgo: (n) => `Vor ${n} Minute${n === 1 ? '' : 'n'}`,
    hoursAgo: (n) => `Vor ${n} Stunde${n === 1 ? '' : 'n'}`,
    yesterday: 'Gestern',
    daysAgo: (n) => `Vor ${n} Tagen`,
    deleteEntryAriaLabel: 'Eintrag löschen',
    clearAllLabel: 'Alle löschen',
    emptyTitle: 'Noch keine Matches',
    emptySubtitle: 'Hier siehst du später, für welche Restaurants ihr euch gemeinsam entschieden habt.',
    emptyCta: 'Ersten Tisch starten',
    shareAriaLabel: 'Restaurant teilen',
    openMapsAriaLabel: 'Adresse in Maps öffnen',
    copiedLabel: 'Kopiert',
    participantsLabel: (names) => {
      if (names.length === 0) return '';
      if (names.length === 1) return `${names[0]} hat teilgenommen`;
      const joined = names.slice(0, -1).join(', ') + ' und ' + names[names.length - 1];
      return `${joined} haben teilgenommen`;
    },
    sessionLabel: 'Tisch',
    copySessionAriaLabel: 'Tisch-Code kopieren',
  },
  nav: {
    home: 'Start',
    matches: 'Matches',
    settings: 'Einstellungen',
  },
  matches: {
    pageTitle: 'Matches',
    title: 'Matches',
    subtitle: 'Restaurants, für die ihr euch gemeinsam entschieden habt.',
  },
  settings: {
    pageTitle: 'Einstellungen',
    title: 'Einstellungen',
    nameLabel: 'Dein Name',
    nameHint: 'Wird bei neuen Tischen vorgeschlagen.',
    languageLabel: 'Sprache',
    dataSectionTitle: 'Daten',
    dataSectionDescription: 'Alle lokal gespeicherten Daten (Tisch-Code, Verlauf, Sprache) zurücksetzen.',
    dataResetButton: 'Daten zurücksetzen',
    feedbackTitle: 'Feedback',
    feedbackDescription: 'Ideen, Wünsche oder ein Fehler? Schreib uns gern.',
    feedbackButton: 'E-Mail schreiben',
    feedbackSubject: 'Feedback zu Yumder',
    feedbackBody: '',
    experienceSectionTitle: 'Erlebnis',
    hapticsTitle: 'Haptik',
    hapticsDescription: 'Vibration bei einem Match',
    soundTitle: 'Sounds',
    soundDescription: 'Ton bei einem Match',
  },
  pwaBanner: {
    title: 'App installieren',
    subtitle: 'Schneller Start. Kein Login.',
    installButton: 'Laden',
    dismissAriaLabel: 'Schließen',
  },
  dataPrivacy: {
    resetDataButton: 'Daten zurücksetzen',
    resetDataTitle: 'Alle lokalen Daten löschen?',
    resetDataMessage: 'Dies entfernt alle auf diesem Gerät gespeicherten Informationen (Tisch-Code, anonyme ID, Verlauf, Sprache). Auf dem Server werden keine personenbezogenen Daten gespeichert.',
    resetDataConfirm: 'Löschen',
    resetDataCancel: 'Abbrechen',
    resetDataSuccess: 'Lokale Daten wurden gelöscht. Die Seite wird neu geladen.',
  },
  deleteDataPage: {
    pageTitle: 'Daten löschen',
    metaDescription: 'So löschst du deine lokalen und serverseitigen Daten bei Yumder.',
    heading: 'Deine Daten löschen',
    intro: 'Yumder speichert nur wenige Daten und verzichtet auf Accounts. Du kannst jederzeit selbst deine lokalen App-Daten entfernen oder uns bitten, serverseitige Daten zu löschen.',
    localDataTitle: 'Lokale App-Daten',
    localDataDescription: 'Auf deinem Gerät werden ausschließlich folgende Informationen zwischengespeichert:',
    localDataBulletCode: 'Dein aktueller Tisch-Code',
    localDataBulletAnonymousId: 'Deine anonyme Teilnehmer-ID',
    localDataBulletHistory: 'Deine letzten Matches (Verlauf)',
    localDataBulletLanguage: 'Deine Spracheinstellung',
    resetButton: 'Alle lokalen Daten jetzt löschen',
    resetSuccess: 'Lokale Daten wurden gelöscht. Die Seite lädt sich neu.',
    serverDataTitle: 'Serverseitige Daten',
    serverDataDescription: 'Für den Betrieb der Swipe-Tische werden auf unserem Server temporär pseudonyme Daten gespeichert:',
    serverDataBulletSwipes: 'Deine Ja/Nein/Veto-Entscheidungen innerhalb eines Tischs',
    serverDataBulletMatches: 'Erzielte Matches innerhalb eines Tischs',
    serverDataBulletSessions: 'Deine Teilnahme an einem Tisch (anonyme ID)',
    serverDataContact: 'Da wir keine E-Mail-Adressen oder Accounts speichern, brauchen wir zum Löschen deinen Tisch-Code oder deine anonyme ID. Schicke uns eine kurze Anfrage:',
    contactEmailSubject: 'Antrag auf Löschung meiner Yumder-Daten',
    contactEmailBody: 'Hallo Yumder-Team,%0D%0A%0D%0Abitte löscht meine serverseitigen Daten. Mein Tisch-Code bzw. meine anonyme ID lautet: %0D%0A%0D%0A(Vergiss nicht, den Wert hier einzutragen)%0D%0A%0D%0AMit freundlichen Grüßen',
    backToHome: 'Zurück zur Startseite',
  },
};
