<?php

namespace App\Http\Controllers;

use App\Http\Resources\DefaultResource;
use App\Models\Partner;
use App\Http\Requests\PartnerRequest;
use App\Services\Image\ImageService;
use App\Services\UploadedImageService;
use App\Lib\RequestQueryBuilder\RequestQueryBuilder as QB;
use App\Lib\RequestQueryBuilder\AllowedFilter as F;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;

class PartnerController extends Controller
{
    public function __construct(
        protected UploadedImageService $uploadedImageService
    ) {}

    public function index(Request $request)
    {
        $columns = [
            'id',
            'name',
            'active',
            'order_no',
            'created_at',
            'updated_at',
        ];

        $partners = QB::make($request, Partner::query())
            ->allowedFilters(
                F::equals('id'),
                F::contains('name'),
            )
            ->allowedSorts(['id', 'name', 'order_no'])
            ->paginate(columns: $columns);

        $partners->each(fn (Partner $item) => $item->appendImageUrl('small'));

        return $partners;
    }

    public function create(ImageService $imageService)
    {
        $thumbnailSettings = $imageService
            ->setModelType(Partner::class)
            ->getSmallThumbnailSettings();

        return [
            'thumbnailSettings' => $thumbnailSettings,
        ];
    }

    public function store(PartnerRequest $request)
    {
        $validated = $request->validated();
        $partner = new Partner;

        $partner->fill($validated)->save();

        $this->mangeImage($partner, $request->file('image'))
            ->storeRelationship();

        return $partner;
    }

    public function edit(Partner $partner, ImageService $imageService)
    {
        $thumbnailSettings = $imageService
            ->setModelType(Partner::class)
            ->getSmallThumbnailSettings();

        $partner->appendImageUrl();

        return [
            'partner' => $partner,
            'thumbnailSettings' => $thumbnailSettings,
        ];
    }

    public function update(PartnerRequest $request, Partner $partner)
    {
        $validated = $request->validated();

        $partner->fill($validated)->save();

        if ($request->hasFile('image')) {
            $this->mangeImage($partner, $request->file('image'))
                ->replaceFirst();
        }

        return $partner;
    }

    public function destroy(Partner $partner)
    {
        $partner->delete();
    }

    public function mangeImage(Partner $partner, UploadedFile $uploadedFile)
    {
        return $this->uploadedImageService
            ->setFile($uploadedFile)
            ->setRelatedModel($partner)
            ->moveToStorage()
            ->createThumbnails();
    }
}
