<?php

namespace App\Modules\Company\Employees;

use App\Modules\Company\Employees\Worker;
use App\Http\Resources\Company\ActiveLeasedWorkers as ActiveLeasedWorkersResource;
use App\Models\LoanBorrowList;

class ActiveLeasedWorkers extends Worker
{
    public function getData($payload)
    {
        // sorting
        $sortField = $this->sortField($payload, 'date_from'); // date_from = default column to search
        $sortOrder = $this->sortOrder($payload);

        // searching
        $workerIdSearch = $this->searchField($payload->worker_id);
        $nameSearch = $this->searchField($payload->first_name);
        $zipcodeSearch = $this->searchField($payload->zipcode);
        $expertiseSearch = $payload->expertise_name;
        $experienceSearch = $payload->experience_name;
        $areaOfWorkSearch = $payload->work_area_lists;
        $zipcodeSearch = $this->searchField($payload->zipcode);

        $companyId = $this->getCurrentUser()->company_id;
        $status = ['Pending', 'Work in progress', 'Work Done'];
        return ActiveLeasedWorkersResource::collection(
                LoanBorrowList::select(
                    'loan_borrow_lists.id',
                    'loan_borrow_lists.date_from',
                    'loan_borrow_lists.date_to',
                    'loan_borrow_lists.rate',
                    'worker.id as worker_id',
                    'worker.first_name',
                    'worker.last_name',
                    'worker.worker_id as company_worker_id',
                    'worker.zipcode',
                    'expertises.id as expertise_id',
                    'expertises.name as expertise_name',
                    'expertises.name as expertise_name',
                    'company_experiences.name as experience_name',
                    'company_experiences.id as experience_id'
                )
                ->join('workers as worker', 'worker.id', '=', 'loan_borrow_lists.worker_id')
                ->join('worker_experiences', 'worker_experiences.worker_id', '=', 'worker.id')
                ->join('expertises', 'expertises.id', '=', 'worker_experiences.expertise_id')
                ->join("company_experiences",function($join){
                    $join->on("company_experiences.company_id","=","loan_borrow_lists.loaner_company_id")
                        ->on("company_experiences.id","=","worker_experiences.experience_id");
                })
                ->whereIn('loan_borrow_lists.status', $status)
                ->whereRaw('loan_borrow_lists.date_to >= CURDATE()')
                ->with('work_area_lists')->whereHas('work_area_lists', function ($query) use ($areaOfWorkSearch) {
                    $query->when(!empty($areaOfWorkSearch), function ($query) use ($areaOfWorkSearch) {
                        return $query->whereIn('work_area_lists.work_area_id', $areaOfWorkSearch);
                    });
                })
                ->where('loan_borrow_lists.loaner_company_id', $companyId)
                ->where('worker_experiences.is_worker', true)
                ->when(!empty($workerIdSearch), function ($query) use ($workerIdSearch) {
                    return $query->where('worker.worker_id', 'LIKE', $workerIdSearch . '%');
                })
                ->when(!empty($nameSearch), function ($query) use ($nameSearch) {
                    return $query->where(function ($query) use ($nameSearch) {
                        $query->where('worker.first_name', 'LIKE', $nameSearch . '%')
                            ->orWhere('worker.last_name', 'LIKE', $nameSearch . '%');
                    });
                })
                ->when(!empty($zipcodeSearch), function ($query) use ($zipcodeSearch) {
                    return $query->where('worker.zipcode', 'LIKE', $zipcodeSearch . '%');
                })
                ->when(!empty($expertiseSearch), function ($query) use ($expertiseSearch) {
                    return $query->whereIn('expertises.id', $expertiseSearch);
                })
                ->when(!empty($experienceSearch), function ($query) use ($experienceSearch) {
                    return $query->whereIn('company_experiences.id', $experienceSearch);
                })
                ->when(!empty($zipcodeSearch), function ($query) use ($zipcodeSearch) {
                    return $query->where('worker.zipcode', 'LIKE', $zipcodeSearch . '%');
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }
}
