<?php

namespace App\Modules\Company\Borrow\Requests;

use App\Models\BorrowRequest;
use App\Http\Resources\Company\BorrowPendingRequest as BorrowPendingRequestResource;
use App\Http\Resources\Company\BorrowPendingRequestDetails as BorrowPendingRequestDetailsResource;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use App\Traits\UserTraits;

class PendingRequest
{
    use SortingTraits, SearchTraits, UserTraits;

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

        // searching
        $requestedBySearch = $this->searchField($payload->first_name);

        $companyId = $this->getCurrentUser()->company_id;
        return BorrowPendingRequestResource::collection(
            BorrowRequest::select(
                'borrow_requests.id',
                'borrow_requests.created_at as date_requested',
                'requested_by.first_name',
                'requested_by.last_name',
                'borrow_requests.note',
                'borrow_requests.request_contact_id',
                )
                ->join('workers as requested_by', 'requested_by.id', '=', 'borrow_requests.requested_by')
                ->join('borrow_pending_workers', 'borrow_pending_workers.borrow_request_id', '=', 'borrow_requests.id')
                ->with('request_contact')
                ->where('borrow_requests.borrower_company_id', $companyId)
                ->where('borrow_pending_workers.status', 'Pending')
                ->when(!empty($requestedBySearch), function ($query) use ($requestedBySearch) {
                    return $query->where(function ($query) use ($requestedBySearch) {
                        $query->where('requested_by.first_name', 'LIKE', $requestedBySearch . '%')
                            ->orWhere('requested_by.last_name', 'LIKE', $requestedBySearch . '%');
                    });
                })
                ->groupBy('borrow_requests.id')
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }

    public function getDetails($id)
    {
        return BorrowPendingRequestDetailsResource::collection(
            BorrowRequest::select(
                'borrow_requests.id',
                'borrow_requests.created_at as date_requested',
                'borrow_requests.note',
                'borrow_requests.request_contact_id',
                'borrow_pending_workers.date_to',
                'borrow_pending_workers.date_from',
                'requested_by.first_name',
                'requested_by.last_name')
                ->join('workers as requested_by', 'requested_by.id', '=', 'borrow_requests.requested_by')
                ->join('borrow_pending_workers', 'borrow_pending_workers.borrow_request_id', '=', 'borrow_requests.id')
                ->with('request_contact')
                ->where('borrow_pending_workers.borrow_request_id', $id)
                ->limit(1)->get()
        )->response()->setStatusCode(201);
    }
}
