<?php

namespace App\Listeners\Company;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use App\Events\Company\BulkUpdateBillableRateEvent;
use Illuminate\Support\Facades\Log;
use App\Models\Worker;
use App\Events\Company\WorkerRateUpdatedEvent;
use App\Events\Company\PusherTriggerEvent;
use App\Traits\UserTraits;

class BulkUpdateBillableRateListener implements ShouldQueue
{
    use UserTraits;

    public $connection = 'jobs_loan_borrow_lists'; //queue channel/connection
    public $queue = 'updatesearch';  //nanme of the dispatched queue
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle(BulkUpdateBillableRateEvent $event)
    {
        $payloadData = (object) $event->payload;
        $userData = $payloadData->userData;
        $overHeadCharge = (float) $payloadData->overheadAmount;
        $overHeadType = $payloadData->overheadType;
        
        $companyID = $userData->company_id;
        $userID = $userData->id;
        

        $workers = $this->fethchWorkersWithExperience($payloadData->level_of_experience, $companyID); //fetch worker with experience to be updated

        foreach($workers as $workers){
            $workerData = array(
                'overhead_charge' => $overHeadCharge,
                'overhead_type' => $overHeadType,
            );
            $this->updateWorker($workers->worker_id, $workerData);
            event(new WorkerRateUpdatedEvent($workers->worker_id, $companyID));
        }

        $data = array(
            'user_id' => $userID,
        );
    
        event(new PusherTriggerEvent($data));
        
    }


    public function fethchWorkersWithExperience($experienceID, $companyID){
        return Worker::select(
            'workers.id as worker_id',
            'workers.flat_rate as original_rate',
            'workers.overhead_charge as overhead_amount',
            'workers.worker_id as worker_company_id',
            'workers.overhead_type',
            'workers.zipcode',
            'workers.date_hired',
            'companies.service_charge',
            'company_burden_rate.burden_rate',
            'company_burden_rate.burden_rate_type',
            'worker_experiences.worker_id as worker_experience',
        )
        ->join('worker_experiences', 'worker_experiences.worker_id', 'workers.id')
        ->join('company_burden_rate', 'company_burden_rate.id', 'worker_experiences.burden_rate_id')
        ->join('company_users', 'company_users.worker_id', 'workers.id')
        ->join('companies', 'companies.id', 'company_users.company_id')
        ->where('companies.id', $companyID)
        ->where('worker_experiences.experience_id', $experienceID)
        ->distinct()
        ->get();
    }

    public function updateWorker($id, $data){
        return Worker::where('id', $id)->update($data);
    }
}
