<?php

namespace App\Traits;

use App\Models\Worker;
use Carbon\Carbon;

trait GenerateAndValidateWorkerID
{
    public function generateWorkerId($companyId)
    {
        $dateNow = date("mdy");
        $latestWorkerId = $this->getLatestWorkerId($companyId, $dateNow);
        $newWorkerId = $this->generateNewWorkerId($latestWorkerId, $companyId, $dateNow);
        return $newWorkerId;
    }

    public function getLatestWorkerId($companyId, $date_now)
    {
        $workerData = Worker::select('workers.worker_id')
            ->join('company_users', 'company_users.worker_id', '=', 'workers.id')
            ->where('company_users.company_id', $companyId)
            ->whereNotNull('workers.worker_id')
            ->where('workers.created_at', '>=', Carbon::today())
            ->orderBy('workers.worker_id', 'desc')
            ->first();

        if (!$workerData) {
            return sprintf("%04d", $companyId) . '-' . $date_now . '-' . '0000';
        } else {
            return $workerData->worker_id;
        }
    }

    public function generateNewWorkerId($latestWorkerId, $companyId, $date_now)
    {
        $latestWorkerIdArray = str_split($latestWorkerId, 12);
        $workerId = (int) $latestWorkerIdArray[1];
        $workerId++;
        return sprintf("%04d", $companyId) . '-' . $date_now . '-' . sprintf("%04d", $workerId);
    }

    public function validateWorkerGeneratedId($companyId, $workerGeneratedId)
    {
        $employeeData = Worker::join('company_users', 'company_users.worker_id', '=', 'workers.id')
            ->where('company_users.company_id', $companyId)
            ->where('workers.worker_id', $workerGeneratedId)
            ->get();
        if ($employeeData->isEmpty()) {
            return true;
        } else {
            return false;
        }
    }

}
