<?php

namespace App\Jobs\Command;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Models\BorrowRequest;
use App\Models\BorrowPendingWorkers;
use App\Models\LoanPendingWorkers;
use App\Models\BorrowDenied;
use App\Models\LoanDenied;
use Illuminate\Support\Facades\DB;

class ProcessExpiredLoanPendingWorkers implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        /*======================================================================================================== 
            Start Transaction
        ========================================================================================================*/
        DB::beginTransaction();

        $form_data = array(
            'status' => 'Declined',
        );

        $LoanPendingWorkers = $this->fetchExpiredLoanPendingWorkers();
        foreach($LoanPendingWorkers as $pendingWorker) {
            $id = $pendingWorker['id'];
            $LoanPendingWorkersTransaction = LoanPendingWorkers::where('id', $id)->update($form_data);
            $BorrowPendingWorkersTransaction = BorrowPendingWorkers::where('id', $id)->update($form_data);

            $borrow_request_id = $pendingWorker['borrow_request_id'];
            $borrowRequest = $this->fetchSelectedBorrowRequest($borrow_request_id);

            /*======================================================================================================== 
                preparing borrow denied worker to be saved on database
            ========================================================================================================*/
            $selectedPendingWorkerData = array(
                'loaner_company_id' => $borrowRequest[0]['loaner_company_id'],
                'borrower_company_id' => $borrowRequest[0]['borrower_company_id'],
                'date_requested' => $borrowRequest[0]['created_at'],
                'requested_by' => $borrowRequest[0]['requested_by'],
                'date_from' => $pendingWorker['date_from'],
                'date_to' => $pendingWorker['date_to'],
                'rate' => $pendingWorker['rate'],
                'original_rate' => $pendingWorker['original_rate'],
                'worker_id' => $pendingWorker['worker_id'],
                'requester_note' => $borrowRequest[0]['note'],
                'approver_id' => 0, // 0 = system
                'approver_note' => 'Declined by the system due to request was already expired.',
            );
            $borrowDeclinedTransaction = $this->savePendingWorkerToBorrowDeclinedHistories($selectedPendingWorkerData);

            /*======================================================================================================== 
                preparing loan denied worker to be saved on database
            ========================================================================================================*/
            $selectedPendingWorkerData = array(
                'loaner_company_id' => $borrowRequest[0]['loaner_company_id'],
                'borrower_company_id' => $borrowRequest[0]['borrower_company_id'],
                'date_requested' => $borrowRequest[0]['created_at'],
                'date_from' => $pendingWorker['date_from'],
                'date_to' => $pendingWorker['date_to'],
                'rate' => $pendingWorker['rate'],
                'original_rate' => $pendingWorker['original_rate'],
                'worker_id' => $pendingWorker['worker_id'],
                'requester_note' => $borrowRequest[0]['note'],
                'approver_id' => 0, // 0 = system
                'approver_note' => 'Declined by the system due to request was already expired.',
            );
            $loanDeclinedTransaction = $this->savePendingWorkerToLoanDeclinedHistories($selectedPendingWorkerData);

            /*======================================================================================================== 
                If there's an error or queries don't do their job, rollback!
            ========================================================================================================*/
            if ( !$LoanPendingWorkersTransaction || 
                !$BorrowPendingWorkersTransaction ||
                !$borrowDeclinedTransaction ||
                !$loanDeclinedTransaction )
            {
                DB::rollBack();
            } else {
                DB::commit();
            }
        }
    }

    public function fetchSelectedBorrowRequest($borrow_request_id)
    { 
        return BorrowRequest::select()->where('id', $borrow_request_id)->limit(1)->get();
    }

    public function fetchExpiredLoanPendingWorkers()
    { 
        return LoanPendingWorkers::whereRaw('date_from < CURDATE()')
            ->where('status', 'Pending')
            ->limit(100)
            ->get();
    }

    public function savePendingWorkerToBorrowDeclinedHistories($selectedPendingWorkerData)
    {
        return BorrowDenied::create($selectedPendingWorkerData);
    }

    public function savePendingWorkerToLoanDeclinedHistories($selectedPendingWorkerData)
    { 
        return LoanDenied::create($selectedPendingWorkerData);
    }
}
