<?php

namespace App\Modules\Jobseeker;
use App\Models\Worker;
use App\Models\PasswordResets;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Jobs\Jobseeker\ProcessSendEmailJobseekerForgotPassword;

class Password
{
    public function processForgotPasswordEmail($payload)
    {
        $emailAddress = $payload->email_address;

        // Validate email address if existed
        $validate = $this->validateEmailAddress($emailAddress);
        if (!$validate) {
            return response()->json(['errors' => ["Sorry, we don't recognize that jobseeker email address."]])->setStatusCode(201);
        } else {
            $this->sendForgotPasswordEmail($validate);
            return response()->json(['success' => ['Email sent successfully.']])->setStatusCode(201);
        }
    }

    public function validateEmailAddress($emailAddress)
    {
        $jobseekerRoleId = 6;

        return Worker::select(
            'workers.email_address',
            'workers.first_name',
            'workers.last_name',
            'company_users.worker_id',
            )
            ->join('company_users', 'company_users.worker_id', '=', 'workers.id')
            ->where('company_users.role_id', $jobseekerRoleId)
            ->where('email_address', $emailAddress)
            ->first();
    }

    public function sendForgotPasswordEmail($userData)
    {
        $emailAddress = $userData->email_address;
        $first_name = $userData->first_name;
        $last_name = $userData->last_name;
        $token = Str::random(60);
        $this->savePasswordResets($emailAddress, $token);
        $userData = [
            'first_name' => $first_name,
            'last_name' => $last_name,
            'reset_password_token' => $token,
        ];
        ProcessSendEmailJobseekerForgotPassword::dispatch($emailAddress, $userData)->onConnection('jobs_emails')->onQueue('sendemail');
    }

    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);
    }


    public function verifyPasswordReset($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 resetPassword($payload)
    {
        DB::beginTransaction();
        $password = Hash::make($payload->password);
        $token = $payload->token;
        $emailAddress = $this->getEmailAssociatedWithToken($token);
        $user_data = array(
            'password' => $password,
        );
        $updateUserTransaction = Worker::where('email_address', $emailAddress)->update($user_data);
        $deletePasswordResetTransaction = PasswordResets::where('email', $emailAddress)->where('token', $token)->delete();

        // If there's an error or queries don't do their job, rollback!
        if (!$updateUserTransaction || !$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)
            ->limit(1)
            ->get();
        return $passwordResetData[0]->email;
    }
}
