<?php

namespace App\Modules\Admin\Libraries;

use App\Http\Resources\Admin\Experiences as ExperiencesResource;
use App\Models\Experience;
use App\Models\WorkerRequest;

class ExperienceModule
{
    public function getData($payload)
    {
        //! Sorting
        $sortField = $payload['sortField'] ?? 'name'; 
        $sortOrder = $payload['sortOrder'] ?? 'asc';

        //! Searching
        $nameSearch = $payload['name'] ?? null; 

        return ExperiencesResource::collection(
            Experience::select(
                'experiences.id',
                'experiences.name'
                )
                ->when(
                    !empty($nameSearch), 
                    function ($query) use ($nameSearch) 
                    {
                        return $query->where(
                            function ($query) use ($nameSearch) 
                            {
                                $query->where('experiences.name', 'LIKE', $nameSearch . '%');
                            }
                        );
                    }
                )
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
            )
            ->response()
            ->setStatusCode(200);
    }

    public function getDetails($id)
    {
        return ExperiencesResource::collection(
            Experience::select(
                'experiences.id',
                'experiences.name')
                ->where('experiences.id', $id)
                ->limit(1)
                ->get()
        )->response()->setStatusCode(200);
    }

    public function storeData($payload)
    {   
        //! Preparing data to be saved on database
        $experienceData = array(
            'name' =>  $payload['name'],
        );

        Experience::create($experienceData);

        return response()->json(['success' => 'Data added successfully.'])->setStatusCode(201);
    }

    public function updateData($payload, $id)
    {
        //! Preparing data to be saved on database
        $experienceData = array(
            'name' => $payload['name'],
        );

        Experience::find($id)->update($experienceData);

        return response()->json(['success' => 'Data updated successfully.'])->setStatusCode(200);
    }

    public function deleteData($id)
    {
        $experience = Experience::findOrFail($id);

        $isUsedOnWorkerRequestTable = WorkerRequest::where('experience', '=', $experience->name)->count() >= 1;  

        if ($isUsedOnWorkerRequestTable == true)
        {
            return response()->json(['error' => 'Unable to delete Experience. Experience is currently being used.'])->setStatusCode(201);
        } 

        $experience->forceDelete();

        return response()->json(['success' => 'Data deleted successfully.'])->setStatusCode(200);
    }
}
