<?php

namespace App\Packages\User\Service;

use Google_Client;
use Illuminate\Support\Arr;
use Laravel\Socialite\Facades\Socialite;
use Laravel\Socialite\Two\User;

/**
 * Class UserSocialService
 * @package App\Packages\User\Service
 */
class UserSocialService {

    /**
     * @param $provider
     * @param $token
     * @return User|null
     * @throws \Throwable
     */
    public static function getSocialUserByToken($provider, $token)
    {
        try {
            /** @var User $user */
            $user = Socialite::driver($provider)->userFromToken($token);
        } catch (\Throwable $exception) {
            if (config('app.debug')) {
                throw $exception;
            }

            return null;
        }

        return $user;
    }

    public static function getSocialUserByGoogleIdToken($token)
    {
        $client = new Google_Client(['client_id' => config('services.google.client_id')]);
        $payload = $client->verifyIdToken($token);

        if ($payload) {
            $user = $payload;
            $user['id'] = Arr::get($user, 'sub', null);
            $user['verified_email'] = Arr::get($user, 'email_verified', null);
            $user['link'] = Arr::get($user, 'profile', null);

            return (new User)->setRaw($user)->map([
                'id' => Arr::get($user, 'sub', null),
                'nickname' => Arr::get($user, 'nickname', null),
                'name' => Arr::get($user, 'name', null),
                'email' => Arr::get($user, 'email', null),
                'avatar' => $avatarUrl = Arr::get($user, 'picture', null),
                'avatar_original' => $avatarUrl,
            ]);
        }

        return false;
    }

}