<?php

namespace App\Jobs\Company;

use App\Models\CompanyUser;
use App\Models\PasswordResets;
use App\Traits\GenerateAndValidateWorkerID;
use App\Models\Worker;
use Carbon\Carbon;
use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\Company\WorkerInvitation;


use Illuminate\Support\Facades\Mail;

class ProcessFileUserInvitation implements ShouldQueue
{
    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels, 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($user->roles);

        $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,
                ]);
            }
            $roles = $user->roles;

            foreach ($roles as $role) {
                $company_user = array(
                    'worker_id' => $userData->id,
                    'company_id' => $company_id,
                    'role_id' => $role,
                    'availability_status' => 'reserved',
                );
                CompanyUser::create($company_user);

            }

            //check if only worker position
            if (in_array(5, $roles) && count($roles) > 1) {
                $is_user = true;
            } else if (in_array(5, $roles) && count($roles) == 1) {
                $is_user = false;
            } else {
                $is_user = true;
            }

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

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