<?php

namespace App\Listeners\Company;

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

use App\Models\AssignedWorkers;
use App\Events\Company\UpdateAssignedAvailabilityEndDateEvent;
use App\Events\Company\UpdateAssignedAvailabilityStartDateEvent;
use App\Models\ProjectWorkersTimesheet;

class UpdateAssignedAvailabilityListener
{
    public function updateAssignedAvailabilityStartDate(UpdateAssignedAvailabilityStartDateEvent $event)
    {
        $action = $event->action;
        if ($action == 'assign' || $action == 're-assign') {
            $assigned_worker_id = $event->assigned_worker_id;
            $assigned_workers_data = AssignedWorkers::select(
                'assigned_workers.worker_id',
                'assigned_availability.rate',
                'assigned_availability.start_date',
                'projects.clock_in',
                'projects.clock_out',
                'workers.first_name',
                'workers.last_name')
                ->join('projects', 'projects.id', '=', 'assigned_workers.project_id')
                ->join('workers', 'workers.id', '=', 'assigned_workers.worker_id')
                ->join('assigned_availability', 'assigned_availability.assigned_worker_id', '=', 'assigned_workers.id')
                ->where('assigned_workers.id', $assigned_worker_id)
                ->where('assigned_availability.is_draft', 0)
                ->first();
            $worker_id = $assigned_workers_data->worker_id;
            $rate = $assigned_workers_data->rate;
            $start_date = $assigned_workers_data->start_date;
            $clock_in = $assigned_workers_data->clock_in;
            $clock_out = $assigned_workers_data->clock_out;
            $first_name = $assigned_workers_data->first_name;
            $last_name = $assigned_workers_data->last_name;
            $full_name = $first_name . ' ' . $last_name;

            for ($date = $event->start_date; $date < $start_date; $date = date('Y-m-d', strtotime($date . '+1 day'))) {
                $project_workers_timesheet_data = array(
                    'project_worker_id' => $assigned_worker_id,
                    'worker_id' => $worker_id,
                    'rate' => $rate,
                    'total_hours' => 0,
                    'date' => $date,
                    'time_in' => $clock_in,
                    'time_out' => $clock_out,
                    'status' => 'pending',
                    'request_modification_message' => null,
                    'requested_by' => $full_name,
                    'approved_by' => null,
                );
                ProjectWorkersTimesheet::create($project_workers_timesheet_data);
            }
        } else if ($action == 're-assign') {

        } else if ($action == 'remove') {

        }
    }

    public function updateAssignedAvailabilityEndDate(UpdateAssignedAvailabilityEndDateEvent $event)
    {
        $action = $event->action;
        if ($action == 'assign') {
            $assigned_worker_id = $event->assigned_worker_id;
            $end_date = $event->end_date;
            $assigned_workers_data = AssignedWorkers::select(
                'assigned_workers.worker_id',
                'assigned_availability.rate',
                'assigned_availability.end_date',
                'projects.clock_in',
                'projects.clock_out',
                'workers.first_name',
                'workers.last_name')
                ->join('projects', 'projects.id', '=', 'assigned_workers.project_id')
                ->join('workers', 'workers.id', '=', 'assigned_workers.worker_id')
                ->join('assigned_availability', 'assigned_availability.assigned_worker_id', '=', 'assigned_workers.id')
                ->where('assigned_workers.id', $assigned_worker_id)
                ->where('assigned_availability.is_draft', 0)
                ->first();
            $worker_id = $assigned_workers_data->worker_id;
            $rate = $assigned_workers_data->rate;
            $clock_in = $assigned_workers_data->clock_in;
            $clock_out = $assigned_workers_data->clock_out;
            $first_name = $assigned_workers_data->first_name;
            $last_name = $assigned_workers_data->last_name;
            $full_name = $first_name . ' ' . $last_name;
            $end_date_plus_one_day = date('Y-m-d', strtotime($assigned_workers_data->end_date . '+1 day'));

            for ($date = $end_date_plus_one_day; $date <= $end_date; $date = date('Y-m-d', strtotime($date . '+1 day'))) {
                $project_workers_timesheet_data = array(
                    'project_worker_id' => $assigned_worker_id,
                    'worker_id' => $worker_id,
                    'rate' => $rate,
                    'total_hours' => 0,
                    'date' => $date,
                    'time_in' => $clock_in,
                    'time_out' => $clock_out,
                    'status' => 'pending',
                    'request_modification_message' => null,
                    'requested_by' => $full_name,
                    'approved_by' => null,
                );
                ProjectWorkersTimesheet::create($project_workers_timesheet_data);
            }
        } else if ($action == 're-assign') {

        } else if ($action == 'remove') {
            $assigned_worker_id = $event->assigned_worker_id;
            $assigned_availability_original_end_date = $event->end_date;

            $assigned_workers_data = AssignedWorkers::select(
                'assigned_workers.worker_id')
                ->join('assigned_availability', 'assigned_availability.assigned_worker_id', '=', 'assigned_workers.id')
                ->where('assigned_workers.id', $assigned_worker_id)
                ->where('assigned_availability.is_draft', 0)
                ->first();

            if ($assigned_workers_data) {
                $worker_id = $assigned_workers_data->worker_id;
                $date_today = date('Y-m-d');
                ProjectWorkersTimeSheet::where('project_workers_timesheet.worker_id', $worker_id)
                    ->where(function ($query) use ($date_today, $assigned_availability_original_end_date) {
                        $query->where('date', $date_today)
                            ->orWhere('date', $assigned_availability_original_end_date)
                            ->orWhereBetween('date', [$date_today, $assigned_availability_original_end_date])
                            ->orWhereBetween('date', [$date_today, $assigned_availability_original_end_date]);
                    })
                    ->delete();
            }
        }
    }
}
