package fyloz.trial.ColorRecipesExplorer.services;

import fyloz.trial.ColorRecipesExplorer.core.io.FileHandler;
import fyloz.trial.ColorRecipesExplorer.dao.MaterialDao;
import fyloz.trial.ColorRecipesExplorer.model.Material;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Service
public class MaterialService extends GenericService<Material> {

    private MixQuantityService mixQuantityService;

    @Autowired
    public MaterialService(MaterialDao materialDao, MixQuantityService mixQuantityService) {
        super(materialDao);
        this.mixQuantityService = mixQuantityService;
    }

    /**
     * Vérifie si un produit est lié à un ou plusieurs mélanges.
     *
     * @param material Le produit à vérifier.
     * @return Si le produit est lié à d'autres mélanges.
     */
    public boolean isLinkedToMixes(Material material) {
        return !mixQuantityService.getByMaterial(material).isEmpty();
    }

    public boolean deleteIfNotLinked(Material material) {
        if (!isLinkedToMixes(material)) {
            return super.delete(material);
        }

        return false;
    }

    /**
     * Crée le fichier SIMDUT sur le disque et y transfert le contenu du MultipartFile passé en paramètre.
     * <p>
     * Cette méthode retournera true si le simdut est null ou si le transfert du fichier vers le disque a fonctionné.
     * Cette méthode retournera false si la création du fichier échoue ou si une erreur survient lors du transfert.
     *
     * @param simdut   Le contenu du fichier SIMDUT
     * @param material Le produit du SIMDUT
     * @return Si le fichier SIMDUT à bien été créé ou non.
     */
    public boolean addSimdut(MultipartFile simdut, Material material) {
        if (simdut.getSize() <= 0) return true;

        FileHandler fileHandler = getFilesServiceForMaterial(material);

        if (!fileHandler.createFile()) {
            return false;
        }

        try {
            simdut.transferTo(new File(fileHandler.getFile().getAbsolutePath()));
            return true;
        } catch (IOException e) {
            logger.error("Erreur lors du transfert d'un fichier SIMDUT vers le disque", e);
            return false;
        }
    }

    /**
     * Supprime le fichier SIMDUT pour un produit.
     * <p>
     * Cette méthode retournera true si le fichier SIMDUT du produit n'existe pas ou si la suppression est faîtes.
     *
     * @param material Le produit dont on veut supprimer le fichier SIMDUT
     * @return Si la suppression du fichier SIMDUT s'est effectuée.
     */
    public boolean removeSimdut(Material material) {
        FileHandler fileHandler = getFilesServiceForMaterial(material);

        if (fileHandler.getFile().exists()) {
            return fileHandler.deleteFile();
        }

        return true;
    }

    /**
     * Crée un FileHandler pour le produit passé en paramètre.
     *
     * @param material Le produit dont on veut créer un FileHandler
     * @return Le FileHandler correspondant au produit.
     */
    private FileHandler getFilesServiceForMaterial(Material material) {
        String filename = String.format("%s_%s", material.getMaterialID(), material.getMaterialCode());
        return new FileHandler(filename, FileHandler.FileContext.SIMDUT, FileHandler.FileExtension.PDF);
    }
}
