<?php
namespace App\Http\Controllers\Candidat;

use App\Http\Controllers\Controller;
use App\Http\Requests\Candidat\UploadPieceJointeRequest;
use App\Http\Resources\Candidat\PieceJointeResource;
use App\Models\PieceJointe;
use App\Enums\TypeDocument;
use App\Services\PieceJointeService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class PieceJointeController extends Controller
{
    public function __construct(private readonly PieceJointeService $pieceJointeService) {}

    /**
     * GET /api/candidat/pieces-jointes
     * Liste toutes les pièces jointes du candidat connecté
     */
    public function index(Request $request): JsonResponse
    {
        $pieces = $request->user()->candidat->piecesJointes;

        return response()->json([
            'pieces_jointes' => PieceJointeResource::collection($pieces)
        ]);
    }

    /**
     * POST /api/candidat/pieces-jointes
     * Upload d'une pièce jointe
     */
    public function store(UploadPieceJointeRequest $request): JsonResponse
    {
        $user = $request->user();
        \Log::info('PieceJointe store - User info', [
            'user_id' => $user->id,
            'user_email' => $user->email,
            'user_role' => $user->role->value,
            'is_candidat' => $user->isCandidat(),
        ]);

        $candidat = $user->candidat;
        \Log::info('PieceJointe store - Candidat info', [
            'candidat_exists' => $candidat ? 'yes' : 'no',
            'candidat_id' => $candidat?->id,
        ]);

        if (!$candidat) {
            return response()->json([
                'message' => 'Aucun enregistrement candidat trouvé pour cet utilisateur.',
                'error' => 'NO_CANDIDAT_RECORD'
            ], 422);
        }

        $typeDocument = TypeDocument::from($request->validated('type_document'));

        $piece = $this->pieceJointeService->stocker(
            $candidat,
            $request->file('fichier'),
            $typeDocument
        );

        return response()->json([
            'message'      => 'Document téléversé avec succès.',
            'piece_jointe' => new PieceJointeResource($piece)
        ], 201);
    }

    /**
     * DELETE /api/candidat/pieces-jointes/{id}
     * Supprime une pièce jointe (seulement si statut en_attente)
     */
    public function destroy(Request $request, int $id): JsonResponse
    {
        $candidat = $request->user()->candidat;
        $piece = $candidat->piecesJointes()->findOrFail($id);

        if ($piece->statut_validation !== 'en_attente') {
            return response()->json([
                'message' => 'Impossible de supprimer un document déjà validé ou rejeté.',
                'error'   => 'PIECE_NOT_DELETABLE'
            ], 422);
        }

        $this->pieceJointeService->supprimer($piece);

        return response()->json(['message' => 'Document supprimé avec succès.']);
    }

    /**
     * GET /api/candidat/pieces-jointes/{id}/telecharger
     * Téléchargement sécurisé d'une pièce jointe (URL signée)
     * Cette route est nommée 'candidat.pieces-jointes.telecharger'
     */
    public function telecharger(Request $request, int $id)
    {
        $candidat = $request->user()->candidat;
        $piece = $candidat->piecesJointes()->findOrFail($id);

        if (!Storage::disk('local')->exists($piece->chemin_stockage)) {
            return response()->json(['message' => 'Fichier introuvable.'], 404);
        }

        return Storage::disk('local')->download(
            $piece->chemin_stockage,
            $piece->nom_fichier_original
        );
    }
}
