<?php

namespace Database\Seeders;

use App\Models\WorkerRequest; 
use App\Models\Company;
use App\Models\CompanyExperience;
use App\Models\Expertise; 
use App\Models\WorkAreaExpertise;
use App\Models\ZipcodeRange;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

/**
 * php artisan db:seed --class=WorkerRequestSeeder.
 */

class WorkerRequestSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $items          =   200; 

        if (Company::count() >= 1)
        {
            for ($i = 0; $i < $items; $i++)
            {
                //! FETCH COMPANY 
                $companyId      =   Company::select('id')->inRandomOrder()->first()->id;
    
                $experience     =   CompanyExperience::query()
                                        ->select('name')
                                        ->where('company_id', '=', $companyId)
                                        ->inRandomOrder() 
                                        ->first()
                                        ->name;
    
                if ($experience == null)
                {
                    $this->command->warn("Company Id #{$companyId} has no listed experiences"); 
    
                    continue; 
                } 
    
                $expertiseId    =   Expertise::query()
                                        ->select('id')
                                        ->inRandomOrder()
                                        ->first()
                                        ->id; 
    
                $zipCodeRangeId =   ZipcodeRange::select('id')->inRandomOrder()->first()->id; 
    
                $workAreas      =   WorkAreaExpertise::query()
                                        ->where('expertise_id', '=', $expertiseId)
                                        ->limit(rand(1, 3))
                                        ->pluck('work_area_id')
                                        ->toArray();  
    
                DB::transaction(
                    function () use ($companyId, $experience, $expertiseId, $zipCodeRangeId, $workAreas)
                    {
                        $workerRequest  =   WorkerRequest::factory()
                                                ->state(
                                                    [
                                                        'company_id'       => $companyId,
                                                        'expertise_id'     => $expertiseId,
                                                        'zipcode_range_id' => $zipCodeRangeId,
                                                        'experience'       => $experience
                                                    ]
                                                )
                                                ->create(); 
            
                        $workerRequest->workAreas()->attach($workAreas);
    
                        $this->command->info("WorkerRequest Id #{$workerRequest->id} Created");
                    }
                );   
            } 
        }
        else 
        {
            $this->command->warn("There are no Companies in the Database. Please create at least one");
        }
    }
}
