<?php

namespace App\Modules\Company\Account;

use App\Models\Worker;
use App\Models\PasswordResets;
use App\Jobs\Company\ProcessSendEmailCompanyForgotPassword;
use App\Traits\ValidatorTraits;
use Illuminate\Support\Str;

class ForgotPassword
{
    use ValidatorTraits;

    public function forgot($payload)
    {
        $emailAddress = $payload->email_address;

        // validate query params
        $rules = array(
            'email_address' => 'required',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        // validate email address if existed
        $workerData = $this->validateEmailAddress($emailAddress);
        if (!$workerData) {
            return response()->json(['errors' => ['Email address not found.']])->setStatusCode(201);
        } else {
            $this->sendForgotPasswordEmail($workerData);
            return response()->json(['success' => ['Email sent successfully.']])->setStatusCode(201);
        }
    }

    public function validateEmailAddress($emailAddress)
    {
        $workerData = Worker::select(
            'workers.first_name',
            'workers.last_name',
            'workers.email_address')
            ->where('workers.email_address', $emailAddress)
            ->limit(1)
            ->get();
        if ($workerData->isEmpty()) {
            return false;
        }
        return $workerData;
    }

    public function sendForgotPasswordEmail($workerData)
    {
        $emailAddress = $workerData[0]->email_address;
        $first_name = $workerData[0]->first_name;
        $last_name = $workerData[0]->last_name;
        $token = hash('sha256', $plainTextToken = Str::random(80));
        $this->savePasswordResets($emailAddress, $token);
        $workerData = [
            'first_name' => $first_name,
            'last_name' => $last_name,
            'reset_password_token' => $token,
        ];
        ProcessSendEmailCompanyForgotPassword::dispatch($emailAddress, $workerData)->onConnection('jobs_emails')->onQueue('sendemail');
    }

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