<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\LubricanteIndexRequest;
use App\Http\Requests\LubricanteRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\Lubricante;
use App\Services\Lubricantes\LubricanteCatalogService;
use App\Services\Lubricantes\LubricantePayloadService;
use App\Services\UploadedImageService;
use Symfony\Component\HttpFoundation\Response;

class LubricantesController extends Controller
{
    /**
     * Lista la grilla admin usando columnas explícitas y filtros validados para
     * evitar `select *`, sort arbitrario y N+1 al adjuntar imágenes.
     */
    public function index(
        LubricanteIndexRequest $request,
        LubricanteCatalogService $catalogService
    ): DefaultCollection {
        return DefaultCollection::make(
            $catalogService->paginateForAdmin(
                $request->pageSize(),
                $request->pageNumber(),
                $request->sort(),
                $request->filters()
            )
        );
    }

    /**
     * Recupera un registro puntual para edición. La imagen usa el accessor
     * legacy sólo aquí porque es un único registro y no genera N+1.
     */
    public function edit(int $id): DefaultResource
    {
        $result = Lubricante::query()
            ->select(['id', 'titulo', 'slug', 'estado', 'created_at', 'updated_at'])
            ->findOrFail($id);

        return DefaultResource::make($result);
    }

    public function store(
        LubricanteRequest $request,
        LubricantePayloadService $payloadService,
        UploadedImageService $uploadedImageService
    ): DefaultResource {
        $result = Lubricante::create(
            $payloadService->toPersistenceAttributes($request->validated())
        );

        if ($request->hasFile('imagen')) {
            $result->imagen = $uploadedImageService
                ->setFile($request->file('imagen'))
                ->setRelatedModel($result)
                ->move()
                ->createThumbnails()
                ->storeRelationship()
                ->getUrl('large');
        }

        return DefaultResource::make($result);
    }

    public function update(
        LubricanteRequest $request,
        int $id,
        LubricantePayloadService $payloadService,
        UploadedImageService $uploadedImageService
    ): DefaultResource {
        $result = Lubricante::query()
            ->select(['id', 'titulo', 'slug', 'estado', 'created_at', 'updated_at'])
            ->findOrFail($id);

        $result->fill(
            $payloadService->toPersistenceAttributes($request->validated())
        )->save();

        if ($request->hasFile('imagen')) {
            $result->imagen = $uploadedImageService
                ->setFile($request->file('imagen'))
                ->setRelatedModel($result)
                ->move()
                ->createThumbnails()
                ->replaceFirst()
                ->getUrl('large');
        }

        return DefaultResource::make($result);
    }

    /**
     * Elimina un lubricante por id validado por route model lookup. La ruta está
     * protegida por `rootUser`, mitigando IDOR para admins sin privilegio root.
     */
    public function destroy(int $id): Response
    {
        Lubricante::query()
            ->select(['id'])
            ->findOrFail($id)
            ->delete();

        return response()->noContent();
    }
}
