<?php

namespace App\Modules\Company\Loan\Requests;

use App\Http\Resources\Company\LoanApprovedRequest as LoanApprovedRequestResource;
use App\Http\Resources\Company\LoanApprovedRequestDetails as LoanApprovedRequestDetailsResource;
use App\Models\LoanApproved;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use App\Traits\UserTraits;
use Illuminate\Support\Facades\DB;

class ApprovedRequests
{
    use SortingTraits, SearchTraits, UserTraits;

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

        // search parameters
        $employeeNameSearch = $this->searchField($payload->first_name);
        $contactNameSearch = $this->searchField($payload->contact_name);

        $companyId = $this->getCurrentUser()->company_id;
        return LoanApprovedRequestResource::collection(
            LoanApproved::select(
                'loan_approved_histories.id',
                'loan_approved_histories.created_at as approved_date',
                'loan_approved_histories.approver_note',
                'workers.first_name',
                'workers.last_name',
                'companies.contact_person_name',
                'companies.company_tel')
                ->join('companies', 'companies.id', '=', 'loan_approved_histories.borrower_company_id')
                ->join('workers', 'workers.id', '=', 'loan_approved_histories.worker_id')
                ->where('loan_approved_histories.loaner_company_id', $companyId)
                ->when(!empty($employeeNameSearch), function ($query) use ($employeeNameSearch) {
                    return $query->where(function ($query) use ($employeeNameSearch) {
                        $query->where('workers.first_name', 'LIKE', $employeeNameSearch . '%')
                            ->orWhere('workers.last_name', 'LIKE', $employeeNameSearch . '%')
                            ->orWhere(DB::raw('CONCAT(workers.first_name, " ", workers.last_name)'), 'LIKE', $employeeNameSearch . '%');
                    });
                })
                ->when(!empty($contactNameSearch), function ($query) use ($contactNameSearch) {
                    return $query->where('companies.contact_person_name', 'LIKE', $contactNameSearch . '%');
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }

    public function getDetails($id)
    {
        $companyId = $this->getCurrentUser()->company_id;
        return LoanApprovedRequestDetailsResource::collection(
            LoanApproved::select(
                'workers.worker_id',
                'workers.first_name',
                'workers.last_name',
                'loan_approved_histories.rate',
                'loan_approved_histories.original_rate',
                'loan_approved_histories.date_requested',
                'loan_approved_histories.date_from',
                'loan_approved_histories.date_to',
                'loan_approved_histories.request_contact_id',
                // 'companies.contact_person_name',
                // 'companies.contact_person_no',
                'companies.name as company_name', 
                'companies.company_tel',
                'companies.street_address',
                'companies.city',
                'companies.state',
                'companies.zipcode',
                'loan_approved_histories.requester_note',
                'loan_approved_histories.created_at as approved_date',
                'approver.first_name as approver_first_name',
                'approver.last_name as approver_last_name',
                'loan_approved_histories.approver_note')
                ->join('workers as approver', 'approver.id', '=', 'loan_approved_histories.approver_id')
                ->join('companies', 'companies.id', '=', 'loan_approved_histories.borrower_company_id')
                ->join('workers', 'workers.id', '=', 'loan_approved_histories.worker_id')
                ->with('request_contact')
                ->where('loan_approved_histories.loaner_company_id', $companyId)
                ->where('loan_approved_histories.id', $id)
                ->limit(1)->get()
        )->response()->setStatusCode(201);
    }
}
