<?php

namespace App\Listeners\Company;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

use App\Events\Company\RequestWorkerApprovedEvent;
use App\Models\Company;
use App\Models\Worker;
use App\Models\Search;
use App\Models\LoanPendingWorkers;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

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

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle(RequestWorkerApprovedEvent $event)
    {
        $LPW = LoanPendingWorkers::where('id', $event->loan_pending_workers_id)->first();
        $company = Company::select('service_charge')
            ->join('company_users', 'company_users.company_id', 'companies.id')
            ->where('company_users.worker_id', $LPW->worker_id)
            ->first();

        $search_details = Search::select( "*", DB::raw("DATEDIFF(date_to,date_from) AS days"))
            ->where("id", $LPW->search_id)
            ->first();

        $current_rate = Worker::select('rate')->where('id', $LPW->worker_id)->first()->rate;

        $date_from = Carbon::parse($search_details->date_from);
        $date_to = Carbon::parse($search_details->date_to);
        $LPWDate_from = Carbon::parse($LPW->date_from);
        $LPWDate_to = Carbon::parse($LPW->date_to);

        $searchTenYearsFlag = $search_details->days >= 3650 ? true : false;
        $searchOccupatedFlag = ($date_from->diffInDays($date_to) == 0 && $LPWDate_from->diffInDays($LPWDate_to) == 0);

        if ($LPWDate_from->eq($date_from) && $LPWDate_to->eq($date_to)) {
            //Requested duration is exact duration on the search record
            $updated_data = array(
                'status' => 'Approved',
            );
            Search::where('id', $LPW->search_id)->update($updated_data);
            $current_search = Search::where('id', $LPW->search_id)->first();

            if ($searchTenYearsFlag) {
                $new_data1 = array(
                    'worker_company_id' => $search_details->worker_company_id,
                    'worker_id' => $search_details->worker_id,
                    'zip_code' => $search_details->zip_code,
                    'hourly_rate' => ($current_rate + ($current_rate * (0.01 * $company->service_charge))),
                    'original_rate' => $current_rate,
                    'date_from' => Carbon::parse($LPW->date_to)->add('1 day'),
                    'date_to' => Carbon::parse($LPW->date_to)->add('3651 day'),
                    'status' => 'Available',
                );
                $new_record1 = Search::create($new_data1);
            }

        } else if ($LPWDate_from->eq($date_from) && $LPWDate_to->ne($date_to)) {
            $updated_data = array(
                'status' => 'Approved',
                'date_to' => $LPWDate_to,
            );
            Search::where('id', $LPW->search_id)->update($updated_data);
            $current_search = Search::where('id', $LPW->search_id)->first();

            $new_data2 = array(
                'worker_company_id' => $search_details->worker_company_id,
                'worker_id' => $search_details->worker_id,
                'zip_code' => $search_details->zip_code,
                'hourly_rate' => ($current_rate + ($current_rate * (0.01 * $company->service_charge))),
                'original_rate' => $current_rate,
                'date_from' => $LPWDate_to->add('1 day'),
                'date_to' => $date_to,
                'status' => 'Available',
            );
            $new_record2 = Search::create($new_data2);

        } elseif ($LPWDate_from->ne($date_from) && $LPWDate_to->eq($date_to)) {
            $updated_data = array(
                'status' => 'Approved',
                'date_from' => $LPWDate_from,
            );
            Search::where('id', $LPW->search_id)->update($updated_data);
            $current_search = Search::where('id', $LPW->search_id)->first();

            $new_data2 = array(
                'worker_company_id' => $search_details->worker_company_id,
                'worker_id' => $search_details->worker_id,
                'zip_code' => $search_details->zip_code,
                'hourly_rate' => ($current_rate + ($current_rate * (0.01 * $company->service_charge))),
                'original_rate' => $current_rate,
                'date_from' => $date_from,
                'date_to' => $LPWDate_from->sub('1 day'),
                'status' => 'Available',
            );
            $new_record2 = Search::create($new_data2);

            /*    Update search row column to Approved and update search row column date_from = user_input_date_to
        Insert new data sa search with values of (date_from: search date_from_sa_giUpdate_nga_row, date_to: user_input_from_to + 1 day) */

        } elseif ($LPWDate_from->ne($date_from) && $LPWDate_to->ne($date_to)) {
            $updated_data = array(
                'status' => 'Approved',
                'date_to' => $LPWDate_to,
                'date_from' => $LPWDate_from,
            );
            Search::where('id', $LPW->search_id)->update($updated_data);
            $current_search = Search::where('id', $LPW->search_id)->first();

            $new_data1 = array(
                'worker_company_id' => $search_details->worker_company_id,
                'worker_id' => $search_details->worker_id,
                'zip_code' => $search_details->zip_code,
                'hourly_rate' => ($current_rate + ($current_rate * (0.01 * $company->service_charge))),
                'original_rate' => $current_rate,
                'date_from' => $date_from,
                'date_to' => $LPWDate_from->sub('1 day'),
                'status' => 'Available',
            );
            $new_record1 = Search::create($new_data1);

            $new_data2 = array(
                'worker_company_id' => $search_details->worker_company_id,
                'worker_id' => $search_details->worker_id,
                'zip_code' => $search_details->zip_code,
                'hourly_rate' => ($current_rate + ($current_rate * (0.01 * $company->service_charge))),
                'original_rate' => $current_rate,
                'date_from' => $LPWDate_to->add('1 day'),
                'date_to' => $date_to,
                'status' => 'Available',
            );
            $new_record2 = Search::create($new_data2);
        }
    }

    public function isRequestedDatesOccupiesSearchRecord($search_id,$date_from,$date_to){
        $search_record = Search::where('id', $search_id)->first();
        $search_date_from = Carbon::parse($search_record->date_from);
        $search_date_to   = Carbon::parse($search_record->date_to);
        return $search_date_from;
    }
}
