<?php
namespace App\Services;

use App\Models\Candidat;
use App\Models\PieceJointe;
use App\Enums\TypeDocument;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

class PieceJointeService
{
    // Taille maximale par type de document (en octets)
    const MAX_TAILLE = [
        'image' => 5 * 1024 * 1024,  // 5 MB
        'pdf'   => 10 * 1024 * 1024, // 10 MB
    ];

    // Types MIME autorisés
    const MIME_AUTORISES = [
        'image/jpeg', 'image/png', 'image/webp',
        'application/pdf'
    ];

    /**
     * Stocke un fichier dans storage/app/private/candidats/{candidat_id}/{type_document}/
     * JAMAIS dans storage/app/public/
     */
    public function stocker(Candidat $candidat, UploadedFile $fichier, TypeDocument $typeDocument): PieceJointe
    {
        // Vérification MIME sécurisée (pas juste l'extension)
        if (!in_array($fichier->getMimeType(), self::MIME_AUTORISES)) {
            throw new \App\Exceptions\FichierNonAutoriseException("Type de fichier non autorisé : {$fichier->getMimeType()}");
        }

        // Génération d'un nom de fichier sécurisé (pas le nom original)
        $nomSecurise = \Str::uuid() . '.' . $fichier->extension();
        $chemin = "candidats/{$candidat->id}/{$typeDocument->value}/{$nomSecurise}";

        // Stockage dans disque privé
        Storage::disk('local')->put($chemin, file_get_contents($fichier));

        // Supprime l'ancienne pièce du même type si elle existe
        $ancienne = $candidat->piecesJointes()
            ->where('type_document', $typeDocument->value)
            ->first();
        if ($ancienne) {
            $this->supprimer($ancienne);
        }

        return PieceJointe::create([
            'candidat_id'          => $candidat->id,
            'type_document'        => $typeDocument->value,
            'nom_fichier_original' => $fichier->getClientOriginalName(),
            'chemin_stockage'      => $chemin,
            'mime_type'            => $fichier->getMimeType(),
            'taille_octets'        => $fichier->getSize(),
            'statut_validation'    => 'en_attente',
            'date_expiration'      => $typeDocument === TypeDocument::CASIER_JUDICIAIRE
                ? now()->addMonths(3)->toDateString()
                : null,
        ]);
    }

    /**
     * Supprime un fichier du stockage et son enregistrement en base
     */
    public function supprimer(PieceJointe $piece): void
    {
        if (Storage::disk('local')->exists($piece->chemin_stockage)) {
            Storage::disk('local')->delete($piece->chemin_stockage);
        }
        $piece->delete();
    }

    /**
     * Génère une URL signée temporaire pour accéder au fichier
     * Durée par défaut : 30 minutes
     */
    public function genererUrlTemporaire(PieceJointe $piece, int $minutes = 30): string
    {
        if (!Storage::disk('local')->exists($piece->chemin_stockage)) {
            throw new \App\Exceptions\FichierIntrouvableException("Fichier introuvable : {$piece->chemin_stockage}");
        }
        // Pour le stockage local, on utilise une route signée Laravel
        return \URL::temporarySignedRoute(
            'candidat.pieces-jointes.telecharger',
            now()->addMinutes($minutes),
            ['piece' => $piece->id]
        );
    }
}
