<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\AppSectionReorderRequest;
use App\Http\Requests\AppSectionRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\AppSection;

class AppSectionController extends Controller
{
    public function index(): DefaultCollection
    {
        AppSection::ensureDefaults();

        $size = request('page.size', 20);
        $page = request('page.number', 1);
        $sort = request('sort', null);

        $result = AppSection::query()
            ->selectFillable()
            ->filterLike(request('filter', []))
            ->applySorts($sort, 'order_no')
            ->orderByRaw('ISNULL(order_no)')
            ->orderBy('order_no')
            ->orderByDesc('id')
            ->paginate($size, ['*'], 'page[number]', $page)
            ->appends(request()->only('sort', 'page.size', 'filter'));

        return DefaultCollection::make($result);
    }

    public function edit($id): DefaultResource
    {
        AppSection::ensureDefaults();

        return DefaultResource::make(AppSection::query()->findOrFail($id));
    }

    public function update(AppSectionRequest $request, $id): DefaultResource
    {
        AppSection::ensureDefaults();

        $result = AppSection::query()->findOrFail($id);
        $data = $request->validated();
        $data['key'] = $result->key;

        $result->fill($data)->save();

        return DefaultResource::make($result->fresh());
    }

    public function reorder(AppSectionReorderRequest $request)
    {
        AppSection::ensureDefaults();

        foreach ($request->validated() as $index => $item) {
            AppSection::query()
                ->whereKey($item['id'])
                ->update([
                    'order_no' => $index + 1,
                ]);
        }

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