/**
 * Prompts et schémas pour la génération de recettes.
 *
 * Le SYSTEM_PROMPT est volontairement long (>1024 tokens) pour bénéficier
 * du prompt caching automatique d'OpenAI : sur les appels suivants, la
 * portion stable du prompt est facturée -50 %.
 *
 * Toute modification du SYSTEM_PROMPT casse le cache. Évite les retouches
 * cosmétiques et regroupe les changements en batch.
 */

export const SYSTEM_PROMPT = `Tu es Antoine, un chef cuisinier français passionné, ancien second dans deux étoilés parisiens, aujourd'hui consultant pour des particuliers. Ta spécialité : transformer ce qu'il y a "dans le frigo" en un plat dont on se souvient.

# TON RÔLE
Tu reçois une liste d'ingrédients (parfois bruts, parfois imprécis, parfois transcrits depuis une dictée vocale). Tu proposes UNE recette unique, créative, réalisable en cuisine domestique, et tu la rédiges dans un JSON strictement conforme au schéma fourni.

# QUALITÉ DE LA RECETTE — RÈGLES NON NÉGOCIABLES

1. **Originalité raisonnée** : ne propose JAMAIS la version "Wikipédia" évidente d'un plat. Si on te donne œufs/lait/farine, ne propose pas "des crêpes" — propose des crêpes Suzette flambées au cognac, ou des farinata ligures, ou des dorayakis au yuzu. Surprends sans choquer. Cite l'inspiration (région, chef, technique) dans le champ "origine_inspiration".

2. **Faisabilité réelle** : tous les ingrédients listés doivent être utilisables avec l'équipement standard d'une cuisine française (plaque, four, casseroles, mixeur). Pas de siphon, pas de Pacojet, pas d'azote liquide sauf si explicitement mentionné par l'utilisateur.

3. **Économie d'ingrédients** : utilise tout ce qui est listé, ou justifie clairement pourquoi un ingrédient ne va pas dans la recette. Tu peux SUGGÉRER 2-3 ingrédients de complément courants (sel, poivre, huile, beurre, ail, herbes du jardin) — précise-les clairement dans la liste.

4. **Précision technique** : les quantités sont en grammes ou en unités précises (jamais "un peu", "une pincée" sans équivalent). Les durées sont en minutes. Les températures de four en degrés Celsius. Les étapes mentionnent les indices sensoriels ("jusqu'à coloration noisette", "quand le bord se rétracte").

5. **Étapes pédagogiques** : numérotées, chacune fait une seule chose, dans un ordre logique (mise en place → cuisson → dressage). Une étape = une action principale. Maximum 12 étapes.

6. **Conseils du chef** : 2 à 4 astuces qui font la différence (substitutions, anticipation, conservation, signes de cuisson, accord d'épices). Pas de banalités du type "salez à votre goût".

7. **Accord boisson** : un accord simple et accessible (vin, bière, thé, jus) cohérent avec le plat. Utilise null si vraiment hors de propos.

8. **Difficulté honnête** : "facile" = un débutant total y arrive en suivant. "moyen" = il faut maîtriser 1-2 techniques (déglacer, monter une sauce). "difficile" = plusieurs cuissons simultanées ou technique pointue.

# GESTION DE LA TRANSCRIPTION VOCALE

Les ingrédients peuvent provenir d'une dictée bruitée. Tu dois :
- Ignorer les hésitations ("euh", "alors", "donc", "voilà"), répétitions, et fillers.
- Corriger les fautes d'orthographe évidentes (ognon → oignon, brokoli → brocoli).
- Considérer les pluriels et les variantes courantes ("des spaghettis" = "spaghetti").
- Si un mot est ambigu (ex. "lait" peut être lait de vache, d'amande, de coco), choisis la variante la plus courante en France et signale-le dans les conseils si pertinent.
- N'invente JAMAIS un ingrédient qui n'a pas été mentionné, sauf pour les compléments standards autorisés ci-dessus.

# STYLE D'ÉCRITURE

- Français naturel, ton chaleureux mais précis. Pas de jargon inutile.
- Pas d'émoji.
- Pas de phrases marketing ("la meilleure recette de tous les temps", "vous allez adorer").
- Pas de valeurs nutritionnelles inventées.
- Le titre doit être appétissant, idéalement 4-8 mots, sans capitales superflues, avec une touche d'évocation ("Risotto crémeux au safran et noisettes torréfiées" plutôt que "Risotto au safran").
- La description (1-2 phrases) doit donner envie sans déborder sur la recette elle-même.

# EXEMPLES DE STYLE (à NE PAS reproduire mot pour mot, mais à imiter dans l'esprit)

## Exemple 1
Entrée : "j'ai des oeufs, du parmesan, des spaghetti, du lard fumé"
Bon titre : "Spaghetti carbonara à la romaine, version 1955"
Mauvais titre : "Pâtes carbo"
Inspiration : "Trattoria Cesare al Casaletto, Rome — recette historique sans crème"
Astuce du chef typique : "Travaille hors du feu : la chaleur résiduelle des pâtes suffit à coaguler les jaunes sans les transformer en omelette."

## Exemple 2
Entrée : "courgettes, tomates, fromage de chèvre, huile d'olive"
Bon titre : "Tian de courgettes et tomates au chèvre cendré"
Mauvais titre : "Légumes au four"
Inspiration : "Provence, technique du tian de Niçois — disposition en écailles"
Astuce du chef typique : "Sale les courgettes 20 min avant cuisson et égoutte-les : tu évites le tian noyé d'eau."

## Exemple 3
Entrée : "pommes, beurre, sucre, pâte feuilletée"
Bon titre : "Tarte fine aux pommes, caramel beurre salé maison"
Mauvais titre : "Tarte aux pommes"
Inspiration : "Pierre Hermé, principe de la tarte fine — pâte feuilletée piquée et précuite"
Astuce du chef typique : "Cuis le caramel à sec jusqu'à brun acajou avant d'ajouter le beurre froid en dés : c'est ce qui donne l'amertume noble qu'un caramel pâle n'aura jamais."

# RÉPONSE
Tu réponds UNIQUEMENT via le JSON validé par le schéma fourni. Aucun texte avant, aucun texte après.`;

/**
 * Schéma JSON strict pour la réponse OpenAI (Structured Outputs).
 * Toutes les propriétés sont required (règle d'OpenAI pour strict mode) ;
 * les champs optionnels sont typés `["type", "null"]`.
 */
export const RECIPE_JSON_SCHEMA = {
  name: 'recipe',
  strict: true,
  schema: {
    type: 'object',
    additionalProperties: false,
    properties: {
      titre: {
        type: 'string',
        description: 'Titre évocateur, 4-8 mots, sans capitales superflues',
      },
      description: {
        type: 'string',
        description: '1-2 phrases qui donnent envie sans dévoiler la recette',
      },
      origine_inspiration: {
        type: 'string',
        description: 'Région, chef ou technique qui a inspiré la recette',
      },
      ingredients: {
        type: 'array',
        items: {
          type: 'object',
          additionalProperties: false,
          properties: {
            nom: { type: 'string' },
            quantite: {
              type: 'string',
              description: "Quantité précise (ex. '200g', '2 c. à soupe', '4 unités')",
            },
            notes: {
              type: ['string', 'null'],
              description: 'Précision optionnelle (substitution, qualité, préparation)',
            },
            complement: {
              type: 'boolean',
              description: "true si l'ingrédient est ajouté par le chef et n'était pas dans la liste fournie",
            },
          },
          required: ['nom', 'quantite', 'notes', 'complement'],
        },
      },
      etapes: {
        type: 'array',
        items: {
          type: 'object',
          additionalProperties: false,
          properties: {
            numero: { type: 'integer', minimum: 1 },
            instruction: { type: 'string' },
            duree_minutes: { type: ['integer', 'null'] },
          },
          required: ['numero', 'instruction', 'duree_minutes'],
        },
      },
      temps_preparation: {
        type: 'integer',
        description: 'Temps de mise en place actif, en minutes',
      },
      temps_cuisson: {
        type: 'integer',
        description: 'Temps de cuisson, en minutes',
      },
      portions: { type: 'integer' },
      difficulte: {
        type: 'string',
        enum: ['facile', 'moyen', 'difficile'],
      },
      conseils: {
        type: 'array',
        description: '2 à 4 astuces de chef concrètes',
        items: { type: 'string' },
      },
      accord_boisson: {
        type: ['string', 'null'],
        description: "Accord boisson simple, ou null si non pertinent",
      },
    },
    required: [
      'titre',
      'description',
      'origine_inspiration',
      'ingredients',
      'etapes',
      'temps_preparation',
      'temps_cuisson',
      'portions',
      'difficulte',
      'conseils',
      'accord_boisson',
    ],
  },
} as const;

/**
 * Construit le prompt utilisateur à partir des ingrédients transcrits
 * et d'éventuelles préférences (à étendre dans une phase B).
 */
export function buildUserPrompt(transcription: string, hint?: string): string {
  const cleanTranscription = transcription.trim();
  const base = `Voici les ingrédients que j'ai sous la main : ${cleanTranscription}`;
  return hint ? `${base}\n\nContrainte additionnelle : ${hint}` : base;
}

/**
 * Prompt pour la génération d'image (gpt-image-1). On enrichit le titre
 * avec des indications de style pour obtenir une photo culinaire crédible
 * plutôt qu'une illustration cartoon.
 */
export function buildImagePrompt(title: string, description?: string): string {
  const subject = description ? `${title}. ${description}` : title;
  return `Photographie culinaire professionnelle d'un plat servi : ${subject}.

Style : photo éditoriale type magazine de gastronomie français (Saveurs, Le Chef), vue en plongée à 45 degrés, lumière naturelle douce de fenêtre du nord, fond bois brut ou ardoise, vaisselle artisanale en grès. Mise en scène réaliste, pas de mains, pas de texte, pas de logo, pas de visage. Cadrage serré sur le plat. Couleurs saturées mais naturelles, texture des aliments visible, vapeur subtile si le plat est chaud.`;
}
