<?php

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

use App\Models\AssignedWorkers;

class AssignedAvailabilityConflictChecker
{
    public function checkConflictForAssignedAvailability($companyId, $workerId, $workerType, $userInputStartDate, $userInputEndDate)
    {
        $conflictingAssignedAvailabilityData = AssignedWorkers::select(
            'assigned_availability.start_date',
            'assigned_availability.end_date')
            ->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();

        if (count($conflictingAssignedAvailabilityData) > 0) {
            return response()->json([
                'error' => 'Worker was already assigned from one of the selected dates.',
                'conflicting_dates' => $conflictingAssignedAvailabilityData,
                'allow_override' => true,
            ])->setStatusCode(201);
        }
    }
}
