<?php

namespace App\Listeners\Company;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use App\Events\Company\UpdateSearchDataOnReservedWorker;
use App\Events\Company\CreateSearchWorkerEvent;
use App\Models\CompanyUser;
use App\Models\Search;
use App\Models\Worker;
use Illuminate\Support\Facades\Log;

class UpdateSearchDataOnReservedListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle(UpdateSearchDataOnReservedWorker $event)
    {
        $workerID = $event->workerID;

        $status = $event->status;

        if($this->isWorkerHasSearchData($workerID)){

            $workerData = $this->fetchWorkerZipCode($workerID);

            if($status == 'reserved'){
                $searchData = [
                    'status' => 'Haulted',
                    'zip_code' => $workerData->zipcode,
                ];
                $this->updateSearch($workerID, $searchData);
            }else{
                $searchData = [
                    'status' => 'Available',
                    'zip_code' => $workerData->zipcode,
                ];
                $this->updateSearch($workerID, $searchData);
            }

            Log::channel('background')->info('Update worker search data as ' . $status);
        }else{
            if($status == 'for-lease'){
                $companyUser = $this->getCompanyUser($workerID);
                event(new CreateSearchWorkerEvent($companyUser));
                Log::channel('background')->info('Trigger create search woker Data on update worker status as for-lease.');
            }
        }
    }

    public function isWorkerHasSearchData($workerID){
        return Search::where('worker_id', $workerID)->first();
    }

    public function updateSearch($workerID, $data){
        return Search::where('worker_id', $workerID)->update($data);
    }

    public function getCompanyUser($workerID){
        return CompanyUser::where('worker_id', $workerID)->first();
    }

    public function fetchWorkerZipCode($workerID){
        return Worker::select('zipcode')->where('id', $workerID)->first();
    }
}
