<?php

namespace App\Http\Controllers;

use App\Models\Doctor;
use App\Lib\RequestQueryBuilder\RequestQueryBuilder as QB;
use App\Lib\RequestQueryBuilder\AllowedFilter as F;
use App\Http\Requests\DoctorRequest;
use App\Services\UploadedImageService;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;

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

    /**
     * Display a listing of the resource.
     */
    public function index(Request $request)
    {
        $doctors = QB::make($request, Doctor::query())
            ->allowedFilters(
                F::equals('id'),
                F::contains('name'),
                F::contains('professional_register'),
            )
            ->allowedSorts(['id', 'name', 'order_no'])
            ->paginate();

        $doctors->each(fn(Doctor $doctor) =>
            $doctor->appendImageUrl('small')
        );

        return $doctors;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \App\Http\Requests\DoctorRequest  $request
     */
    public function store(DoctorRequest $request)
    {
        $doctor = new Doctor;
        $validated = $request->validated();

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

        $doctor->specialities()->attach($validated['specialities']);

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

        return $doctor;
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Doctor  $doctor
     */
    public function edit(Doctor $doctor)
    {
        $doctor->appendImageUrl('medium');
        $doctor->appendSpecialitiesId();

        return $doctor;
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \App\Http\Requests\DoctorRequest  $request
     * @param  \App\Models\Doctor  $doctor
     */
    public function update(DoctorRequest $request, Doctor $doctor)
    {
        $validated = $request->validated();

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

        $doctor->specialities()->sync($validated['specialities']);

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


        return $doctor;
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Doctor  $doctor
     */
    public function destroy(Doctor $doctor)
    {
        $doctor->delete();

        return $doctor;
    }

    protected function mangeImage(Doctor $doctor, UploadedFile $uploadedFile)
    {
        return $this->uploadedImageService
            ->setFile($uploadedFile)
            ->setRelatedModel($doctor)
            ->move()
            ->createThumbnails();
    }
}
