const fs = require('fs');
const util = require('util');
const { pipeline } = require('stream');
const pump = util.promisify(pipeline);
const multipart = require('@fastify/multipart');

module.exports = async function (fastify, opts) {
  fastify.register(multipart);

  // Middleware d'authentification
  fastify.addHook('preHandler', fastify.authenticate);

  // Créer une recette
  fastify.post('/create', async (request, reply) => {
    try {
      const data = await request.file();

      if (!data) {
        return reply.code(400).send({ error: 'Fichier audio requis' });
      }

      // Vérifier le plan de l'utilisateur
      const user = await fastify.prisma.user.findUnique({
        where: { id: request.user.id }
      });

      if (user.subscription === 'free') {
        // Vérifier le nombre de recettes pour les utilisateurs gratuits
        const recipeCount = await fastify.prisma.recipe.count({
          where: { userId: user.id }
        });

        if (recipeCount >= 5) {
          return reply.code(403).send({
            error: 'Limite de recettes atteinte pour le plan gratuit. Passez au plan premium pour créer plus de recettes.'
          });
        }
      }

      // Sauvegarder le fichier audio
      const audioPath = await fastify.saveAudioFile(data);

      // Transcrire l'audio
      const transcription = await fastify.transcribeAudio(audioPath);

      // Extraire les ingrédients du texte transcrit
      const ingredients = transcription;

      // Générer la recette
      const generatedRecipe = await fastify.generateRecipe(ingredients, "Crée une recette délicieuse et détaillée");

      // Créer la recette en base de données
      const recipe = await fastify.prisma.recipe.create({
        data: {
          title: `Recette du ${new Date().toLocaleDateString()}`,
          ingredients,
          userPrompt: transcription,
          generatedRecipe,
          audioUrl: audioPath,
          userId: request.user.id
        }
      });

      return {
        recipe: {
          id: recipe.id,
          title: recipe.title,
          ingredients: recipe.ingredients,
          generatedRecipe: recipe.generatedRecipe,
          createdAt: recipe.createdAt
        }
      };
    } catch (error) {
      fastify.log.error(error);
      return reply.code(500).send({ error: 'Erreur lors de la création de la recette' });
    }
  });

  // Récupérer la liste des recettes
  fastify.get('/list', async (request, reply) => {
    try {
      const recipes = await fastify.prisma.recipe.findMany({
        where: { userId: request.user.id },
        orderBy: { createdAt: 'desc' },
        select: {
          id: true,
          title: true,
          ingredients: true,
          generatedRecipe: true,
          createdAt: true
        }
      });

      return { recipes };
    } catch (error) {
      fastify.log.error(error);
      return reply.code(500).send({ error: 'Erreur lors de la récupération des recettes' });
    }
  });

  // Récupérer une recette par ID
  fastify.get('/:id', async (request, reply) => {
    try {
      const recipe = await fastify.prisma.recipe.findUnique({
        where: {
          id: request.params.id,
          userId: request.user.id
        }
      });

      if (!recipe) {
        return reply.code(404).send({ error: 'Recette non trouvée' });
      }

      return { recipe };
    } catch (error) {
      fastify.log.error(error);
      return reply.code(500).send({ error: 'Erreur lors de la récupération de la recette' });
    }
  });

  // Supprimer une recette
  fastify.delete('/:id', async (request, reply) => {
    try {
      const recipe = await fastify.prisma.recipe.findUnique({
        where: { id: request.params.id }
      });

      if (!recipe) {
        return reply.code(404).send({ error: 'Recette non trouvée' });
      }

      if (recipe.userId !== request.user.id) {
        return reply.code(403).send({ error: 'Non autorisé' });
      }

      await fastify.prisma.recipe.delete({
        where: { id: request.params.id }
      });

      // Supprimer le fichier audio si existant
      if (recipe.audioUrl && fs.existsSync(recipe.audioUrl)) {
        fs.unlinkSync(recipe.audioUrl);
      }

      return { success: true };
    } catch (error) {
      fastify.log.error(error);
      return reply.code(500).send({ error: 'Erreur lors de la suppression de la recette' });
    }
  });
};