const { onCall } = require("firebase-functions/v2/https");
const { z } = require("genkit");
const { generateAI } = require("../index");

exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => {
  try {
    const {
      objective = "Célébrer l'agence Minuit et mettre en avant son " +
        "expertise digitale, son esprit d'équipe et sa créativité.",
      context = "L'agence Minuit accompagne les startups et entreprises " +
        "innovantes dans la création de produits digitaux, du prototype " +
        "à la version de financement, jusqu'à l'optimisation et la mise " +
        "à l'échelle. Spécialisée dans le développement sur-mesure " +
        "d'applications mobiles, elle valorise l'humain, le design et " +
        "l'accompagnement personnalisé. Esprit nocturne, équipe passionnée.",
      emotion = "La Joie : expose un bonheur profond, l'émerveillement, " +
        "la gratitude, satisfaction intense, énergie positive.",
      style = "Upbeat : Pour une ambiance joyeuse et rythmée.",
      audience = "L'équipe Minuit et ses clients fidèles, startups " +
        "ambitieuses et partenaires visionnaires.",
      structure = ["couplet", "refrain", "couplet", "refrain"],
      rhymes = "Avec rimes",
    } = data;

    console.log("Function generate lyrics start with data", data);

    const system =
      `
Tu es un parolier expert en chanson française moderne et populaire.
Tu écris des chansons marquantes, accessibles, sur des thématiques ` +
      `d'innovation, d'esprit d'équipe et de créativité digitale.
Ton ` +
      `écriture doit toucher à la fois l'humain, le collectif et la ` +
      `passion d'entreprendre.
Tu dois générer un titre accrocheur et ` +
      `mémorable pour la chanson en plus des paroles.
Respecte ` +
      `précisément la structure demandée et fournis le résultat dans un ` +
      `format JSON clair, respectant strictement le schéma demandé.
    `.trim();

    // Construction du prompt utilisateur
    const prompt =
      `
Objectif : ${objective}
Contexte : ${context}
Émotion : ${emotion}
Style musical : ${style}
Audience cible : ${audience}
Structure de la chanson : ${structure.join(" => ")}
Schéma de rimes : ${rhymes}

Génère un titre accrocheur et les paroles de la chanson en suivant ` +
      `strictement cette structure.
Le titre doit être court, ` +
      `mémorable et refléter l'esprit de l'agence Minuit.
Pour chaque ` +
      `partie ("couplet" ou "refrain"), écris 4 à 16 lignes adaptées, ` +
      `expressives et cohérentes avec le style et l'émotion souhaitée.
`.trim();

    // Définition du schéma zod/genkit pour la validation du retour
    const lyricsSchema = z.object({
      title: z.string().describe("Titre de la chanson, court et accrocheur"),
      lyrics: z
        .array(
          z.object({
            type: z
              .string()
              .describe(
                'Type de section : "couplet" ou "refrain" ' +
                  "selon la structure"
              ),
            lyrics: z
              .string()
              .describe(
                "Paroles de la section, chaque ligne séparée " +
                  "par un retour à la ligne"
              ),
          })
        )
        .describe(
          "Paroles de la chanson sous forme de tableau de sections " +
            "structurées."
        ),
      success: z.boolean().describe("Indique si la génération a réussi"),
    });

    return await generateAI({
      system,
      prompt,
      schema: lyricsSchema,
    });
  } catch (e) {
    console.log(e);
  }
});
