<?php

namespace App\Modules\Admin\Account;

use App\Models\AdminUser;
use App\Models\PasswordResets;
use App\Traits\ValidatorTraits;
use Illuminate\Support\Facades\Mail;
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
        $validate = $this->validateEmailAddress($emailAddress);
        if (!$validate) {
            return response()->json(['errors' => ['Email address not found.']])->setStatusCode(201);
        } else {
            $this->sendForgotPasswordEmail($validate);
            return response()->json(['success' => ['Email sent successfully.']])->setStatusCode(201);
        }
    }

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

    public function sendForgotPasswordEmail($userData)
    {
        $emailAddress = $userData[0]->email_address;
        $first_name = $userData[0]->first_name;
        $last_name = $userData[0]->last_name;
        $token = Str::random(60);
        $this->savePasswordResets($emailAddress, $token);
        $userData = [
            'first_name' => $first_name,
            'last_name' => $last_name,
            'reset_password_token' => $token,
        ];
        Mail::to($emailAddress)->send(new \App\Mail\Admin\ForgotPassword($userData));
    }

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