<?php

namespace App\Service;

use Symfony\Component\HttpFoundation\File\UploadedFile;

class UploaderService
{
    public const DIR_PP = 'pp';
    public const DIR_MOD = 'mods';
    public const DIR_FILE = 'files';

    public function __construct(private readonly string $uploadDir) {}

    public function getUploadDir(string $sousDir = self::DIR_FILE): string
    {
        return $this->uploadDir . '/' . $sousDir;
    }

    public function upload(UploadedFile $file, string $sousDir = self::DIR_FILE, bool $keepOriginalName = false): string
    {
        $dossier = $this->uploadDir . '/' . $sousDir;

        // Créer le répertoire s'il n'existe pas
        if (!is_dir($dossier)) {
            if (!@mkdir($dossier, 0755, true)) {
                throw new \RuntimeException("Impossible de créer le répertoire d'upload: '$dossier'. Vérifiez les permissions.");
            }
        }

        // Vérifier que le répertoire est accessible en écriture
        if (!is_writable($dossier)) {
            throw new \RuntimeException("Le répertoire d'upload n'est pas accessible en écriture: '$dossier'. Vérifiez les permissions.");
        }

        if ($keepOriginalName) {
            // Garde le nom original du fichier
            $nom = $file->getClientOriginalName();
            if (file_exists($dossier . '/' . $nom)) {
                throw new \RuntimeException("Le mod '$nom' existe déjà.");
            }
        } else {
            // Génère un nom unique (comportement par défaut)
            $nom = uniqid() . '.' . $file->guessExtension();
        }

        try {
            $file->move($dossier, $nom);
        } catch (\Exception $e) {
            throw new \RuntimeException("Erreur lors du déplacement du fichier: " . $e->getMessage());
        }

        return $nom;
    }

    public function delete(string $nom, string $sousDir = self::DIR_FILE): ?bool
    {
        $chemin = $this->uploadDir . '/' . $sousDir . '/' . $nom;

        if (file_exists($chemin)) {
            return unlink($chemin);
        }

        return null; // Fichier non trouvé
    }
}
