<?php

namespace App\Modules\Company\Whiteboard\Project;

use App\Models\AssignedWorkers;
use App\Models\CompanyWorkerTimesheet;
use App\Models\Projects;
use App\Models\ProjectSupervisors;
use App\Models\ProjectWorkersTimesheet;
use App\Traits\CreateUserActionTraits;
use App\Traits\UserTraits;

use Illuminate\Support\Facades\DB; 

class DeleteProject
{
    use CreateUserActionTraits, UserTraits;

    public function delete($payload, $projectId)
    {
        // Check if project has assigned employee
        $validate = $this->validateIfProjectHasAssignedWorkers($projectId);
        if ($validate) 
        {
            return response()->json(['error' => ['Unable to delete project due to assigned workers.']])->setStatusCode(201);
        } 
        else 
        {

            DB::transaction(function () use ($projectId)
                {
                    Projects::find($projectId)->forceDelete();
                    ProjectSupervisors::where('project_id', '=', $projectId)->forceDelete();
                    CompanyWorkerTimesheet::where('reference_id', '=', $projectId)->forceDelete();

                    //! CLEAN TRASH
                    $assignedWorkerIds = AssignedWorkers::query()
                        ->withTrashed()
                        ->where('project_id', '=', $projectId)
                        ->pluck('id')
                        ->toArray();

                    ProjectWorkersTimesheet::query()
                        ->withTrashed()
                        ->whereIn('project_worker_id', $assignedWorkerIds)
                        ->forceDelete(); 

                    AssignedWorkers::query()
                    ->where('project_id', '=', $projectId)
                    ->forceDelete(); 
                }
            );

            // add a user action logs
            $this->createUserAction('Deleted the project ' . $payload->name);

            return response()->json(['success' => 'Data deleted successfully.'])->setStatusCode(201);
        }
    }

    public function validateIfProjectHasAssignedWorkers($projectId)
    {
        $assignedWorkerData = AssignedWorkers::where('project_id', $projectId)->limit(1)->get();
        if ($assignedWorkerData->isEmpty()) {
            return false;
        } else {
            return true;
        }
    }
}
