package dev.fyloz.trial.colorrecipesexplorer.service.files;

import dev.fyloz.trial.colorrecipesexplorer.config.Preferences;
import dev.fyloz.trial.colorrecipesexplorer.model.Recipe;
import dev.fyloz.trial.colorrecipesexplorer.service.model.RecipeService;
import dev.fyloz.trial.colorrecipesexplorer.xlsx.XlsxExporter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@Service
public class XlsService {

    private RecipeService recipeService;

    @Autowired
    public XlsService(RecipeService recipeService) {
        this.recipeService = recipeService;
    }

    /**
     * Génère le fichier XLS d'une recette.
     *
     * @param recipe La recette
     * @return Le fichier XLS de la recette
     */
    public byte[] generate(Recipe recipe) {
        return new XlsxExporter().generate(recipe);
    }

    /**
     * Génère le fichier XLS de la recette correspondant à l'identifiant.
     *
     * @param id L'identifiant de la recette
     * @return Le fichier XLS de la recette
     */
    public byte[] generate(Long id) {
        return generate(recipeService.getById(id));
    }

    /**
     * Génère les fichiers XLS de toutes les recettes et les écrit dans un fichier ZIP.
     *
     * @return Le fichier ZIP contenant tous les fichiers XLS
     */
    public byte[] generateForAll() throws IOException {
        Preferences.logger.info("Exportation de toutes les couleurs en XLS");

        byte[] zipContent;
        Collection<Recipe> recipes = recipeService.getAll();

        try (ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); ZipOutputStream zipOutput = new ZipOutputStream(byteOutput)) {
            for (Recipe recipe : recipes) {
                byte[] recipeXLS = generate(recipe);
                zipOutput.putNextEntry(new ZipEntry(String.format("%s_%s.xlsx", recipe.getCompany().getName(), recipe.getName())));
                zipOutput.write(recipeXLS, 0, recipeXLS.length);
                zipOutput.closeEntry();
            }

            zipOutput.close();
            zipContent = byteOutput.toByteArray();
        } catch (IOException ex) {
            throw new RuntimeException("Impossible d'exporter toutes les recettes vers le format XLS: " + ex.getMessage());
        }

        return zipContent;
    }
}
