<?php

namespace App\Modules\Company\Borrow\Requests;

use App\Models\BorrowCancelled;
use App\Http\Resources\Company\BorrowCancelledRequest as BorrowCancelledRequestResource;
use App\Http\Resources\Company\BorrowCancelledRequestDetails as BorrowCancelledRequestDetailsResource;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use App\Traits\UserTraits;

class CancelledRequest
{
    use SortingTraits, SearchTraits, UserTraits;

    public function getData($payload)
    {
        // sorting
        $sortField = $this->sortField($payload, 'cancelled_date'); // cancelled_date = default column to search
        $sortOrder = $this->sortOrder($payload, 'desc');

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

        $companyId = $this->getCurrentUser()->company_id;
        return BorrowCancelledRequestResource::collection(
            BorrowCancelled::select(
                'borrow_cancelled_histories.id',
                'borrow_cancelled_histories.created_at as cancelled_date',
                'workers.id as worker_id',
                'workers.worker_id as company_worker_id',
                'workers.zipcode',
                'borrow_cancelled_histories.rate',
                'company_experiences.name as experience_name',
                'expertises.name as expertise_name')
                ->join('workers', 'workers.id', '=', 'borrow_cancelled_histories.worker_id')
                ->join('worker_experiences', 'worker_experiences.worker_id', '=', 'borrow_cancelled_histories.worker_id')
                ->join('company_experiences', 'company_experiences.id', '=', 'worker_experiences.experience_id')
                ->join('expertises', 'expertises.id', '=', 'worker_experiences.expertise_id')
                ->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('borrow_cancelled_histories.borrower_company_id', $companyId)
                ->where('worker_experiences.is_worker', true)
                ->when(!empty($workerIdSearch), function ($query) use ($workerIdSearch) {
                    return $query->where('workers.worker_id', 'LIKE', $workerIdSearch . '%');
                })
                ->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('workers.zipcode', 'LIKE', $zipcodeSearch . '%');
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }

    public function getDetails($id)
    {
        return BorrowCancelledRequestDetailsResource::collection(
            BorrowCancelled::select(
                'borrow_cancelled_histories.id',
                'borrow_cancelled_histories.created_at as cancelled_date',
                'cancelled_by.first_name as cancelled_by_first_name',
                'cancelled_by.last_name as cancelled_by_last_name',
                'borrow_cancelled_histories.date_requested',
                'borrow_cancelled_histories.date_from',
                'borrow_cancelled_histories.date_to',
                'requested_by.first_name as requester_first_name',
                'requested_by.last_name as requester_last_name',
                'borrow_cancelled_histories.requester_note',
                'workers.id as worker_id',
                'workers.worker_id as company_worker_id',
                'borrow_cancelled_histories.rate',
                'workers.street_address',
                'workers.city',
                'workers.state',
                'workers.zipcode')
                ->join('workers', 'workers.id', '=', 'borrow_cancelled_histories.worker_id')
                ->join('workers as requested_by', 'requested_by.id', '=', 'borrow_cancelled_histories.requested_by')
                ->join('workers as cancelled_by', 'cancelled_by.id', '=', 'borrow_cancelled_histories.cancelled_by')
                ->where('borrow_cancelled_histories.id', $id)
                ->limit(1)->get()
        )->response()->setStatusCode(201);
    }
}
