<?php

namespace App\Modules\Jobseeker\Authentication;

use App\Models\Worker;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class LoginByPassword
{
    public function login($payload)
    {
        $email_address = $payload->email_address;
        $password = $payload->password;

        $rules = array(
            'email_address' => 'required|max:255',
            'password' => 'required|max:255',
        );

        $error = Validator::make($payload->all(), $rules);

        if ($error->fails()) {
            return response()->json(['errors' => $error->errors()->all()]);
        }

        $user = Worker::select(
            'workers.id',
            'workers.first_name',
            'workers.last_name',
            'workers.email_address',
            'workers.password',
        )
            ->with('roles')->whereHas('roles', function ($query) {
            return $query->join('roles', 'roles.id', '=', 'company_users.role_id')
                ->where('roles.id', 6);
        })
            ->where('email_address', $email_address)
            ->first();

        if (!$user || !Hash::check($password, $user->password)) {
            return response()->json([
                'errors' => ['These credentials do not match our job seeker records.'],
            ], 201);
        } else {
            $roles = $user->roles;
            if (!$this->checkRoles($roles)) {
                return response()->json([
                    'errors' => ['These credentials is not a job seeker.'],
                ], 201);
            }
        }

        $token = $user->createToken('access_token')->plainTextToken;
        $response = [
            'token' => $token,
            'refresh_token' => $token,
        ];
        return response($response, 201);
    }

    public function checkRoles($roles){
        $count = 0;
        // return $roles;
        foreach ($roles as $role){
            if ($role->role_id == 6){
                $count++;
            }
        }
        return ($count > 0)? true: false;
    }

    public function fetchUserData($payload)
    {
        return ['user' =>  Worker::where('id', $payload->user()->id)->with('roles:worker_id,name')->first()];
    }

    public function logout($payload) {
        $user = request()->user();
        
        $isLoggedOut = $user->tokens()->where('id', $user->currentAccessToken()->id)->delete();

        if ($isLoggedOut) {
            return response()->json(['success' => 'User successfully logged out.'])->setStatusCode(201);
        }
        else {
            return response()->json(['error' => 'Something went wrong on logged out of user.'])->setStatusCode(201);
        }
    }
    
    public function refreshToken($payload) {
        return $response = [
            'token' => $payload->refresh_token,
            'refresh_token' => $payload->refresh_token
        ];
    }
}
