<?php

namespace App\Packages\User\Extensions\Auth;

use App\Packages\User\Models\User;
use App\Packages\User\Models\UserToken;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Support\Str;

/**
 * Class TokenToUserProvider
 * @package App\Extensions\Auth
 */
class TokenToUserProvider implements UserProvider
{
	/** @var UserToken */
	private $token;

	/** @var User */
	private $user;

	/**
	 * TokenToUserProvider constructor.
	 *
	 * @param User $user
	 * @param UserToken $token
	 */
	public function __construct(User $user, UserToken $token)
	{
		$this->user = $user;
		$this->token = $token;
	}

	/**
	 * @param mixed $identifier
	 *
	 * @return mixed
	 */
	public function retrieveById($identifier)
	{
		return $this->user->newQuery()->find($identifier);
	}

	/**
	 * @param mixed $identifier
	 * @param string $token
	 *
	 * @return mixed|null
	 */
	public function retrieveByToken($identifier, $token)
	{
		$token = $this->token->with('user')->where($identifier, '=', $token)->first();

		if ( $token && $token->user ) {
		    return $token->user;

		    /*

		    $user = $token->user;
		    if (request()->routeIs('settings.update-nickname')) {
		        return $user;
            }

		    if (validateNickname($user->nickname)) {
		        return $user;
            } else {
		        $token->delete();
            }
		    */
        }

		return null;
	}

	/**
	 * @param Authenticatable $user
	 * @param string $token
	 */
	public function updateRememberToken(Authenticatable $user, $token)
	{
		// update via remember token not necessary
	}

	/**
	 * @param array $credentials
	 *
	 * @return mixed
	 */
	public function retrieveByCredentials(array $credentials)
	{
		$user = $this->user->newQuery();
		foreach ($credentials as $credentialKey => $credentialValue) {
			if (!Str::contains($credentialKey, 'password')) {
				$user->where($credentialKey, $credentialValue);
			}
		}

		return $user->first();
	}

	/**
	 * @param Authenticatable $user
	 * @param array $credentials
	 *
	 * @return mixed
	 */
	public function validateCredentials(Authenticatable $user, array $credentials)
	{
		$plain = $credentials['password'];

		return app('hash')
			->check($plain, $user->getAuthPassword());
	}
}