<?php

namespace App\Modules\Company\Users;

use App\Jobs\Company\ProcessSendEmailForCompanyUserResetPassword;
use App\Models\Worker;
use App\Models\PasswordResets;
use App\Traits\CreateUserActionTraits;
use App\Traits\UserTraits;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class RecoverUserPassword
{
    use UserTraits;
    use CreateUserActionTraits;

    public function sendPasswordRecoveryEmail($id)
    {
        // start transaction
        DB::beginTransaction();

        $companyName = $this->getCurrentUserCompanyName()->name;

        $worker = $this->getWorkerData($id);
        $firstName = $worker->first_name;
        $lastName = $worker->last_name;
        $emailAddress = $worker->email_address;
        $token = Str::random(60);
        $passwordResetTransaction = $this->savePasswordResets($emailAddress, $token);

        $userActionTransaction = 1;
        $userAction = $this->createUserAction('An email reset password request sent for company user ' . $firstName . ' ' . $lastName . '.');

        if (!$userAction) {
            $userActionTransaction = 0;
        }

        $worker_data = [
            'company_name' => $companyName,
            'email_address' => $emailAddress,
            'first_name' => $firstName,
            'last_name' => $lastName,
            'reset_password_token' => $token,
        ];
        ProcessSendEmailForCompanyUserResetPassword::dispatch($emailAddress, $worker_data)->onQueue('sendemail')->onConnection('jobs_emails');

        // if there's an error or queries don't do their job, rollback!
        if (!$passwordResetTransaction ||
            !$userActionTransaction) {
            DB::rollBack();
            return response()->json([
                'error' => 'Server error.',
                'passwordResetTransaction' => $passwordResetTransaction,
                'userActionTransaction' => $userActionTransaction,
            ]);
        } else {
            DB::commit();
            return response()->json(['success' => 'Data updated successfully.'])->setStatusCode(201);
        }
    }

    public function getWorkerData($id)
    {
        $worker = Worker::select(
            'workers.first_name',
            'workers.last_name',
            'workers.email_address')
            ->where('workers.id', $id)
            ->first();
        return $worker;
    }

    public function savePasswordResets($email_address, $token)
    {
        $user_data = array(
            'email' => $email_address,
            'token' => $token,
            'created_at' => date("Y-m-d H:i:s"),
        );
        PasswordResets::where('email', $email_address)->where('token', $token)->delete();
        return PasswordResets::create($user_data);
    }
}
