<?php

namespace App\Http\Controllers;

use App\Http\Requests\TodoRequest;
use App\Http\Resources\todoResource;
use App\Models\Todo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;

class todoController extends Controller
{
    /**
     * Liste des todos de l'utilisateur connecté.
     */
    public function index(Request $request)
    {
        $perPage = (int) $request->query('per_page', 15);
        $perPage = max(1, min($perPage, 100));

        $todos = $request->user()
            ->todos()
            ->latest()
            ->paginate($perPage)
            ->withQueryString();

        return todoResource::collection($todos);
    }

    /**
     * Création d'un nouveau todo avec image optionnelle.
     */
    public function store(TodoRequest $request)
    {
        $data = $request->validated();

        if ($request->hasFile('image')) {
            // On stocke dans le dossier 'todos' du disque 'public'
            // $path contiendra par ex: "todos/nom_du_fichier.jpg"
            $path = $request->file('image')->store('todos', 'public');
            $data['image_url'] = $path;
        }

        $todo = $request->user()->todos()->create($data);

        return new todoResource($todo);
    }

    /**
     * Mise à jour du todo (texte, statut ou image).
     */
    public function update(TodoRequest $request, Todo $todo)
    {
        Gate::authorize('update', $todo);

        $data = $request->validated();

        if ($request->hasFile('image')) {
            // 1. Supprimer l'ancienne image si elle existe
            if ($todo->image_url) {
                Storage::disk('public')->delete($todo->image_url);
            }

            // 2. Stocker la nouvelle image
            $path = $request->file('image')->store('todos', 'public');
            $data['image_url'] = $path;
        }

        $todo->update($data);

        return new todoResource($todo);
    }

    /**
     * Affichage d'un todo précis.
     */
    public function show(Todo $todo)
    {
        Gate::authorize('view', $todo);

        return new todoResource($todo);
    }

    /**
     * Suppression d'un todo et de son image associée.
     */
    public function destroy(Todo $todo)
    {
        Gate::authorize('delete', $todo);

        // Nettoyage : supprimer l'image du serveur avant de supprimer le record
        if ($todo->image_url) {
            Storage::disk('public')->delete($todo->image_url);
        }

        $todo->delete();

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