<?php

namespace App\Http\Controllers;

use App\Http\Requests\CombustibleRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\Combustible;
use App\Models\Files;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

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

        $result = Combustible::query()
            ->selectFillable()
            ->filterLike(request('filter', []))
            ->applySorts(request('sort'))
            ->orderByDesc('id')
            ->paginate(
                $perPage = $size,
                $columns = ['titulo'],
                $pageName = 'page[number]',
                $page = $page
            )->appends(request()->only('sort', 'page.size', 'filter'));

        return DefaultCollection::make($result);
    }

    public function store(CombustibleRequest $request): DefaultResource
    {
        $file_id = request('archivo_pdf', null);

        $result = Combustible::create(array_merge(request()->all(), [
            'caracteristicas' => json_encode(request('caracteristicas', []))
        ]));

        if ($request->file('imagen', null))
            $result->imagen = $result->imageUpload($request->file('imagen', null), $result);

        if ($request->file('imagen_ficha_tecnica', null))
            $result->imagen_ficha_tecnica = $result->imageUpload($request->file('imagen_ficha_tecnica', null), $result, 'ficha_tecnica');


        if ($request->file('imagen_hero', null))
            $result->imagen_hero = $result->imageUpload($request->file('imagen_hero', null), $result, 'hero');


        $this->relacionarArchivo($result->id, $file_id);

        return DefaultResource::make($result);
    }

    public function update(CombustibleRequest $request, $id): DefaultResource
    {
        $file_id = request('archivo_pdf', null);

        $result = Combustible::find($id);
        $result->fill(array_merge(request()->all(), [
            'caracteristicas' => json_encode(request('caracteristicas', []), JSON_UNESCAPED_UNICODE)
        ]))
            ->save();

        if ($request->file('imagen', null))
            $result->imagen = $result->imageUpdate($request->file('imagen', null), $result);

        if ($request->file('imagen_ficha_tecnica', null))
            $result->imagen_ficha_tecnica = $result->imageUpdate($request->file('imagen_ficha_tecnica', null), $result, 'ficha_tecnica');


        if ($request->file('imagen_hero', null))
            $result->imagen_hero = $result->imageUpdate($request->file('imagen_hero', null), $result, 'hero');

        $this->relacionarArchivo($result->id, $file_id);

        return DefaultResource::make($result);
    }

    public function edit($id): DefaultResource
    {
        $result = Combustible::query()->find($id);
        if (!$result) return abort(404);

        $result->caracteristicas = json_decode($result->caracteristicas);
        $result->archivo_pdf = $result->file();

        return DefaultResource::make($result);
    }

    public function destroy($id): Response
    {
        $result = Combustible::find($id);

        $result->fileDelete();
        $result->delete();

        return response()->noContent();
    }

    private function relacionarArchivo($id, $file_id)
    {
        Files::where('archivable_id', $id)
            ->where('archivable_type', Combustible::class)
            ->where('id', '<>', $file_id)
            ->get()
            ->each(function ($item) use ($file_id) {
                if ($item->id !== $file_id)
                    $item->delete();
            });

        if ($file_id) {
            Files::find($file_id)
                ->update([
                    'archivable_id' => $id,
                    'borrador' => false
                ]);
        }
    }
}
