<?php

namespace App\Modules\Company\Whiteboard\ReassignWorker\ConflictChecker;

use App\Models\AssignedWorkers;

class AssignedAvailabilityConflictChecker
{
    public function checkConflictForAssignedAvailability($companyId, $workerId, $workerType, $userInputStartDate, $userInputEndDate)
    {
        return AssignedWorkers::select(
            'assigned_availability.id',
            'assigned_availability.availability_id',
            'assigned_availability.assigned_worker_id',
            'assigned_availability.worker_type',
            'assigned_availability.rate',
            'assigned_availability.start_date',
            'assigned_availability.end_date',
            'assigned_availability.is_draft')
            ->join('assigned_availability', 'assigned_availability.assigned_worker_id', '=', 'assigned_workers.id')
            ->join('projects', 'projects.id', '=', 'assigned_workers.project_id')
            ->where('assigned_workers.worker_id', $workerId)
            ->where('projects.company_id', $companyId)
            ->when($workerType == 'inhouse', function ($query) {
                return $query->where('assigned_availability.worker_type', 'inhouse');
            })
            ->when($workerType == 'borrowed', function ($query) {
                return $query->where('assigned_availability.worker_type', 'borrowed');
            })
            ->where(function ($query) use ($userInputStartDate, $userInputEndDate) {
                $query->where('assigned_availability.start_date', $userInputStartDate)
                    ->orWhere('assigned_availability.end_date', $userInputEndDate)
                    ->orWhereBetween('assigned_availability.start_date', [$userInputStartDate, $userInputEndDate])
                    ->orWhereBetween('assigned_availability.end_date', [$userInputStartDate, $userInputEndDate])
                    ->orWhereRaw('? BETWEEN assigned_availability.start_date and assigned_availability.end_date', [$userInputStartDate])
                    ->orWhereRaw('? BETWEEN assigned_availability.start_date and assigned_availability.end_date', [$userInputEndDate]);
            })
            ->orderBy('assigned_availability.start_date', 'asc')
            ->orderBy('assigned_availability.end_date', 'asc')
            ->get();
    }
}
