<?php

namespace App\Modules\Company\Account;

use App\Models\Worker;
use App\Models\PasswordResets;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Carbon\Carbon;

class ResetPassword
{
    public function verify($payload)
    {
        $token = $payload->token;
        $passwordResetData = PasswordResets::where('password_resets.token', $token)->limit(1)->get();
        if ($passwordResetData->isEmpty()) {
            return response()->json(['errors' => ['Password token not found.']])->setStatusCode(201);
        } else {
            return response()->json([
                'success' => ['Password token found.'],
                'email_address' => $passwordResetData[0]->email,
            ])->setStatusCode(201);
        }
    }

    public function reset($payload)
    {
        // start transaction
        DB::beginTransaction();

        $password = Hash::make($payload->password);
        $token = $payload->token;
        $emailAddress = $this->getEmailAssociatedWithToken($token);
        $workerData = array(
            'password' => $password,
            'email_verification_code' => null,
            'email_verified_at' => Carbon::now(),
        );
        $updateWorkerTransaction = Worker::where('email_address', $emailAddress)->update($workerData);
        $deletePasswordResetTransaction = PasswordResets::where('email', $emailAddress)->where('token', $token)->delete();

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

    public function getEmailAssociatedWithToken($token)
    {
        $passwordResetData = PasswordResets::select('email')
            ->where('password_resets.token', $token)
            ->first();
        return $passwordResetData->email;
    }
}
