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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

@Service
public class ImagesService {

    private static final String IMAGES_DIRECTORY = "images";

    private FilesService filesService;

    @Autowired
    public ImagesService(FilesService filesService) {
        this.filesService = filesService;
    }

    /**
     * Lit une image.
     *
     * @param name Le nom de l'image
     * @return Le contenu de l'image
     */
    public byte[] read(String name) {
        try {
            return filesService.readAsBytes(getPath(name));
        } catch (IOException ex) {
            throw new RuntimeException("Erreur lors de la lecture d'une image: " + ex.getMessage());
        }
    }

    /**
     * Écrit des données image sur le disque.
     *
     * @param image Le contenu du fichier
     * @param name  Le nom de l'image
     * @return Si l'écriture du fichier s'est achevée
     */
    public boolean write(MultipartFile image, String name) {
        return filesService.write(image, getPath(name));
    }

    /**
     * Supprime un fichier image.
     *
     * @param name Le nom de l'image
     */
    public void delete(String name) {
        filesService.delete(getPath(name));
    }

    /**
     * Vérifie si un InputStream contient une image.
     *
     * @param input L'InputStream
     * @return Si l'InputStream contient une image
     */
    public boolean isImage(InputStream input) {
        try {
            return !(ImageIO.read(input) == null);
        } catch (IOException ex) {
            throw new RuntimeException("Erreur lors de la vérification d'une image: " + ex.getMessage());
        }
    }

    public File getDirectoryFile() {
        return new File(getPath(""));
    }

    private String getPath(String name) {
        return filesService.getPath(String.format("%s/%s", IMAGES_DIRECTORY, name));
    }

}
