<?php

namespace App\Jobs\Company;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

use App\Models\CompanyUser;
use App\Models\PasswordResets;
use App\Models\Worker;
use Carbon\Carbon;
use App\Traits\GenerateAndValidateWorkerID;
use Illuminate\Bus\Batchable;
use Illuminate\Support\Facades\Mail;

class ProcessFileWorkerInvitation implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Batchable, GenerateAndValidateWorkerID;
    public $tries = 1;

    public $data;
    public $company_id;
    public $hostname;
    public $compname;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($data, $company_id, $hostname, $compname)
    {
        $this->data = $data;
        $this->company_id = $company_id;
        $this->hostname = $hostname;
        $this->compname = $compname;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        // Log::channel('job')->debug($this->data);
        $company_id = $this->company_id;
        $date_now = Carbon::now()->format('mdy');
        $latestWorkerId = $this->getLatestWorkerId($company_id, $date_now);
        $latestWorkerIdArray = str_split($latestWorkerId, 12);
        $workerId = (int) $latestWorkerIdArray[1];

        foreach ($this->data as $user) {
            $workerId++;

            $user->worker_id = sprintf("%04d", $company_id) . '-' . $date_now . '-' . sprintf("%04d", $workerId);
            $userData = Worker::create((array) $user);
            if (str_contains($userData->email_verification_code, 'admin_verified')) {
                PasswordResets::create([
                    'email' => $userData->email_address,
                    'token' => $userData->email_verification_code,
                ]);
            }

            $company_user = array(
                'worker_id' => $userData->id,
                'company_id' => $company_id,
                'role_id' => 5,
                'availability_status' => 'reserved',
            );

            CompanyUser::create($company_user);
            $user_data = [
                'host_name' => $this->hostname,
                'title' => 'ConX Invitation',
                'email' => $userData->email_address,
                'email_token' => $userData->email_verification_code,
                'company_name' => $this->compname,
                'type' => 'Worker',
            ];

            Mail::to($userData->email_address)->send(new \App\Mail\Company\WorkerInvitation($user_data));
        }

    }
}
