import axios from 'axios';
import AuthService from './AuthService';

const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';

export interface Recipe {
  id: string;
  title: string;
  ingredients: string;
  generatedRecipe: string;
  createdAt: string;
  audioUrl?: string;
}

export interface RecipeResponse {
  recipe: Recipe;
}

export interface RecipesResponse {
  recipes: Recipe[];
}

class RecipeService {
  // Créer une instance axios avec les headers d'authentification
  private getAxiosInstance() {
    return axios.create({
      baseURL: API_URL,
      headers: {
        ...AuthService.getAuthHeaders(),
        'Content-Type': 'application/json'
      }
    });
  }

  // Créer une nouvelle recette à partir d'un fichier audio
  async createRecipe(audioFile: File): Promise<Recipe> {
    try {
      const formData = new FormData();
      formData.append('file', audioFile);

      // Pour les requêtes multipart/form-data, on doit créer une instance spéciale
      const axiosInstance = axios.create({
        baseURL: API_URL,
        headers: {
          ...AuthService.getAuthHeaders(),
          'Content-Type': 'multipart/form-data'
        }
      });

      const response = await axiosInstance.post<RecipeResponse>('/recipes/create', formData);
      return response.data.recipe;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        throw new Error(error.response.data.error || 'Erreur lors de la création de la recette');
      }
      throw new Error('Erreur réseau lors de la création de la recette');
    }
  }

  // Récupérer la liste des recettes de l'utilisateur
  async getRecipes(): Promise<Recipe[]> {
    try {
      const axiosInstance = this.getAxiosInstance();
      const response = await axiosInstance.get<RecipesResponse>('/recipes/list');
      return response.data.recipes;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        throw new Error(error.response.data.error || 'Erreur lors de la récupération des recettes');
      }
      throw new Error('Erreur réseau lors de la récupération des recettes');
    }
  }

  // Récupérer les détails d'une recette spécifique
  async getRecipeById(id: string): Promise<Recipe> {
    try {
      const axiosInstance = this.getAxiosInstance();
      const response = await axiosInstance.get<RecipeResponse>(`/recipes/${id}`);
      return response.data.recipe;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        throw new Error(error.response.data.error || 'Erreur lors de la récupération de la recette');
      }
      throw new Error('Erreur réseau lors de la récupération de la recette');
    }
  }

  // Supprimer une recette
  async deleteRecipe(id: string): Promise<boolean> {
    try {
      const axiosInstance = this.getAxiosInstance();
      await axiosInstance.delete(`/recipes/${id}`);
      return true;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        throw new Error(error.response.data.error || 'Erreur lors de la suppression de la recette');
      }
      throw new Error('Erreur réseau lors de la suppression de la recette');
    }
  }
}

export default new RecipeService(); 