<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\ServicioRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\Servicio;
use App\Services\UploadedImageService;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class ServiciosController extends Controller
{
    public function index(): DefaultCollection
    {
        $size = request('page.size', 10);
        $page = request('page.number', 1);

        $sort = request('sort', null);

        $result = Servicio::select(
            'id',
            'titulo',
            'descripcion',
            'estado',
            'color'
        )
            ->applySorts($sort, 'id')
            ->filterLike(request('filter', []))
            ->orderByDesc('id') 
            ->paginate($size, ['id'], 'page[number]', $page);

        return DefaultCollection::make($result);
    }

    public function edit($id): DefaultResource
    {
        $result = Servicio::query()
            ->find($id);
        $result->imagen = $result->imagen();

        return DefaultResource::make($result);
    }

    public function store(ServicioRequest $request, UploadedImageService $uploadedImageService): DefaultResource
    {
        $result = Servicio::create($request->all());

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

        return DefaultResource::make($result);
    }

    public function update(ServicioRequest $request, $id, UploadedImageService $uploadedImageService): DefaultResource
    {
        $result = Servicio::find($id);
        $result->fill($request->all())->save();

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

        return DefaultResource::make($result);
    }

    public function destroy($id): Response
    {
        Servicio::find($id)->delete();
        return response()->noContent();
    }
}
