package sn.ladoum.bergerie.storage;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Set;
import java.util.UUID;

@Service
@RequiredArgsConstructor
public class FileStorageService {

    private static final Set<String> ALLOWED_EXTENSIONS = Set.of("png", "jpg", "jpeg", "gif", "webp");

    @Value("${app.storage.location}")
    private String storageLocation;

    @Value("${app.storage.public-base-url}")
    private String publicBaseUrl;

    private Path root;

    @PostConstruct
    public void init() {
        try {
            root = Paths.get(storageLocation).toAbsolutePath().normalize();
            Files.createDirectories(root);
        } catch (IOException e) {
            throw new IllegalStateException("Impossible d'initialiser le stockage : " + storageLocation, e);
        }
    }

    public String store(MultipartFile file, String subDir) {
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("Le fichier est vide");
        }
        String original = StringUtils.cleanPath(file.getOriginalFilename() == null ? "" : file.getOriginalFilename());
        String ext = StringUtils.getFilenameExtension(original);
        if (ext == null || !ALLOWED_EXTENSIONS.contains(ext.toLowerCase())) {
            throw new IllegalArgumentException("Format non supporté. Autorisés : " + ALLOWED_EXTENSIONS);
        }

        try {
            Path targetDir = root.resolve(subDir).normalize();
            if (!targetDir.startsWith(root)) {
                throw new IllegalArgumentException("Chemin invalide");
            }
            Files.createDirectories(targetDir);
            String filename = UUID.randomUUID() + "." + ext.toLowerCase();
            Path target = targetDir.resolve(filename);
            Files.copy(file.getInputStream(), target, StandardCopyOption.REPLACE_EXISTING);
            return publicBaseUrl + "/" + subDir + "/" + filename;
        } catch (IOException e) {
            throw new IllegalStateException("Erreur lors de l'enregistrement du fichier", e);
        }
    }

    public void delete(String publicUrl) {
        if (publicUrl == null || !publicUrl.startsWith(publicBaseUrl + "/")) return;
        String relative = publicUrl.substring(publicBaseUrl.length() + 1);
        try {
            Path target = root.resolve(relative).normalize();
            if (target.startsWith(root)) {
                Files.deleteIfExists(target);
            }
        } catch (IOException ignored) {
        }
    }

    public Path getRoot() {
        return root;
    }
}
