<?php

namespace App\Modules\Admin\Reports;

use App\Models\LoanBorrowList;
use App\Http\Resources\Admin\ActiveLoanAndBorrowDetails as ActiveLoanAndBorrowDetailsResource;
use App\Http\Resources\Admin\ActiveLoansAndBorrows as ActiveLoansAndBorrowsResource;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use Illuminate\Support\Facades\DB;

class ActiveLoansAndBorrows
{
    use SortingTraits, SearchTraits;

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

        // searching
        $employeeNameSearch = $this->searchField($payload->first_name);
        $loaningCompanySearch = $this->searchField($payload->loaning_company_name);
        $borrowingCompanySearch = $this->searchField($payload->borrowing_company_name);
        $statusSearch = $payload->status;

        $status = ['Pending', 'Work in progress'];
        return ActiveLoansAndBorrowsResource::collection(
            LoanBorrowList::select(
                'loan_borrow_lists.id',
                'worker.first_name',
                'worker.last_name',
                'loaning_company.name as loaning_company_name',
                'borrowing_company.name as borrowing_company_name',
                'loan_borrow_lists.rate',
                'loan_borrow_lists.date_from',
                'loan_borrow_lists.date_to',
                DB::raw('(CASE WHEN loan_borrow_lists.date_from > CURDATE() THEN "On Queue" ELSE "Started" END) AS status'))
                ->join('workers AS worker', 'worker.id', '=', 'loan_borrow_lists.worker_id')
                ->join('companies AS loaning_company', 'loaning_company.id', '=', 'loan_borrow_lists.loaner_company_id')
                ->join('companies AS borrowing_company', 'borrowing_company.id', '=', 'loan_borrow_lists.borrower_company_id')
                ->whereIn('loan_borrow_lists.status', $status)
                ->whereRaw('loan_borrow_lists.date_to >= CURDATE()')
                ->when(!empty($employeeNameSearch), function ($query) use ($employeeNameSearch) {
                    return $query->where(function ($query) use ($employeeNameSearch) {
                        $query->where('worker.first_name', 'LIKE', $employeeNameSearch . '%')
                            ->orWhere('worker.last_name', 'LIKE', $employeeNameSearch . '%')
                            ->orWhere(DB::raw('CONCAT(workers.first_name, " ", workers.last_name)'), 'LIKE', $employeeNameSearch . '%');
                    });
                })
                ->when(!empty($loaningCompanySearch), function ($query) use ($loaningCompanySearch) {
                    return $query->where('loaning_company.name', 'LIKE', $loaningCompanySearch . '%');
                })
                ->when(!empty($borrowingCompanySearch), function ($query) use ($borrowingCompanySearch) {
                    return $query->where('borrowing_company.name', 'LIKE', $borrowingCompanySearch . '%');
                })
                ->when(!empty($statusSearch), function ($query) use ($statusSearch) {
                    $query->whereIn(DB::raw('(CASE WHEN loan_borrow_lists.date_from > NOW() THEN "On Queue" ELSE "Started" END)'), $statusSearch);
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }

    public function getDetails($id)
    {
        $status = ['Pending', 'Work in progress'];
        return ActiveLoanAndBorrowDetailsResource::collection(
            LoanBorrowList::select(
                'loan_borrow_lists.id',
                'worker.id as worker_id',
                'worker.worker_id as worker_company_id',
                'worker.first_name',
                'worker.last_name',
                'worker.zipcode',
                'worker.additional_details',
                'company_experiences.name as experience_name',
                'expertises.name as expertise_name',
                'loaning_company.name as loaning_company_name',
                'borrowing_company.name as borrowing_company_name',
                'loan_borrow_lists.invoice_no',
                'loan_borrow_lists.rate',
                'loan_borrow_lists.date_from',
                'loan_borrow_lists.date_to',
                'IBR.days',
                'IBR.other_expense')
                ->join('workers AS worker', 'worker.id', '=', 'loan_borrow_lists.worker_id')
                ->join('worker_experiences', 'worker_experiences.worker_id', '=', 'loan_borrow_lists.worker_id')
                ->join('company_experiences', 'company_experiences.id', '=', 'worker_experiences.experience_id')
                ->join('expertises', 'expertises.id', '=', 'worker_experiences.expertise_id')
                ->join('companies AS loaning_company', 'loaning_company.id', '=', 'loan_borrow_lists.loaner_company_id')
                ->join('companies AS borrowing_company', 'borrowing_company.id', '=', 'loan_borrow_lists.borrower_company_id')
                ->join('inbound_billing_requests AS IBR', 'IBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                ->with('work_area_lists:work_area_id,worker_id,name')
                ->whereIn('loan_borrow_lists.status', $status)
                ->where('loan_borrow_lists.id', $id)
                ->limit(1)->get()
        )->response()->setStatusCode(201);
    }
}
