<?php

namespace App\Modules\Admin\Financials;

use App\Models\LoanBorrowList;
use App\Http\Resources\Admin\LoanerApprovedInvoice as AdminLoanerApprovedInvoiceResource;
use App\Http\Resources\Admin\LoanerApprovedInvoiceDetails as AdminLoanerApprovedInvoiceDetailsResource;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use Illuminate\Support\Facades\DB;

class LoanersInvoices
{
    use SortingTraits, SearchTraits;

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

        // searching
        $invoiceNumberSearch = $this->searchField($payload->invoice_no);
        $nameSearch = $this->searchField($payload->first_name);
        $loaningCompanyNameSearch = $this->searchField($payload->loaning_company);
        $loaningCompanyNameSearch = $this->searchField($payload->loaning_company);
        $loanerStatusSearch = $payload->loaner_status;

        $status = 'Approved';
        return AdminLoanerApprovedInvoiceResource::collection(
            LoanBorrowList::select(
                'loan_borrow_lists.id',
                'loan_borrow_lists.invoice_no',
                'loan_borrow_lists.original_rate',
                'loan_borrow_lists.rate',
                'loan_borrow_lists.tax',
                'workers.first_name',
                'workers.last_name',
                'OBR.loaner_status',
                'OBR.cutoff_date',
                'IBR.days',
                'IBR.other_expense',
                'borrowing_company.name as borrowing_company',
                'loaning_company.name as loaning_company')
                ->join('outbound_billing_requests AS OBR', 'OBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                ->join('inbound_billing_requests AS IBR', 'IBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                ->join('companies as borrowing_company', 'borrowing_company.id', '=', 'loan_borrow_lists.borrower_company_id')
                ->join('companies as loaning_company', 'loaning_company.id', '=', 'loan_borrow_lists.loaner_company_id')
                ->join('workers', 'workers.id', '=', 'loan_borrow_lists.worker_id')
                ->where('OBR.conx_status', '!=', 'Unpaid')
                ->where('loan_borrow_lists.status', $status)
                ->when(!empty($invoiceNumberSearch), function ($query) use ($invoiceNumberSearch) {
                    return $query->where('loan_borrow_lists.invoice_no', 'LIKE', $invoiceNumberSearch . '%');
                })
                ->when(!empty($nameSearch), function ($query) use ($nameSearch) {
                    return $query->where(function ($query) use ($nameSearch) {
                        $query->where('workers.first_name', 'LIKE', $nameSearch . '%')
                            ->orWhere('workers.last_name', 'LIKE', $nameSearch . '%')
                            ->orWhere(DB::raw('CONCAT(workers.first_name, " ", workers.last_name)'), 'LIKE', $nameSearch . '%');
                    });
                })
                ->when(!empty($loaningCompanyNameSearch), function ($query) use ($loaningCompanyNameSearch) {
                    return $query->where('loaning_company.name', 'LIKE', $loaningCompanyNameSearch . '%');
                })
                ->when(!empty($loaningCompanyNameSearch), function ($query) use ($loaningCompanyNameSearch) {
                    return $query->where('loaning_company.name', 'LIKE', $loaningCompanyNameSearch . '%');
                })
                ->when(!empty($loanerStatusSearch), function ($query) use ($loanerStatusSearch) {
                    return $query->whereIn('OBR.loaner_status', $loanerStatusSearch);
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }

    public function getDetails($id)
    {
        $status = 'Approved';
        return AdminLoanerApprovedInvoiceDetailsResource::collection(
            LoanBorrowList::select(
                'loan_borrow_lists.id',
                'loan_borrow_lists.invoice_no',
                'loan_borrow_lists.original_rate',
                'loan_borrow_lists.rate',
                'loan_borrow_lists.tax',
                'loan_borrow_lists.updated_at as transaction_date',
                'workers.worker_id',
                'workers.first_name',
                'workers.last_name',
                'OBR.loaner_status',
                'OBR.outstanding_balance',
                'IBR.days',
                'IBR.other_expense',
                'loaning_company.name as loaning_company',
                'loaning_company.company_tel',
                'loaning_company.email_address',
                'loaning_company.street_address',
                'loaning_company.city',
                'loaning_company.state',
                'loaning_company.zipcode')
                ->join('outbound_billing_requests AS OBR', 'OBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                ->join('inbound_billing_requests AS IBR', 'IBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                ->join('companies as loaning_company', 'loaning_company.id', '=', 'loan_borrow_lists.loaner_company_id')
                ->join('workers', 'workers.id', '=', 'loan_borrow_lists.worker_id')
                ->where('loan_borrow_lists.status', $status)
                ->where('loan_borrow_lists.id', $id)
                ->limit(1)->get()
        )->response()->setStatusCode(201);
    }
}
