<?php

namespace App\Services;

use Google\Client as GoogleClient;
use Exception;
use Illuminate\Support\Facades\Log;

class GoogleOAuthService
{
    protected $client;

    public function __construct()
    {
        $this->client = new GoogleClient();
        $this->client->setClientId(config('services.google.client_id'));
        $this->client->setClientSecret(config('services.google.client_secret'));
        $this->client->setRedirectUri(config('services.google.redirect_uri'));
    }

    /**
     * Verifica e decodifica o token JWT do Google
     *
     * @param string $credential
     * @return array|null
     */
    public function verifyIdToken(string $credential): ?array
    {
        try {
            // Verifica o token ID do Google
            $payload = $this->client->verifyIdToken($credential);

            if (!$payload) {
                Log::warning('Google OAuth: Token inválido', [
                    'credential' => substr($credential, 0, 50) . '...'
                ]);
                return null;
            }

            // Extrai os dados do usuário
            return [
                'google_id' => $payload['sub'] ?? null,
                'email' => $payload['email'] ?? null,
                'email_verified' => $payload['email_verified'] ?? false,
                'name' => $payload['name'] ?? null,
                'given_name' => $payload['given_name'] ?? null,
                'family_name' => $payload['family_name'] ?? null,
                'picture' => $payload['picture'] ?? null,
                'locale' => $payload['locale'] ?? 'pt',
            ];
        } catch (Exception $e) {
            Log::error('Google OAuth: Erro ao verificar token', [
                'error' => $e->getMessage(),
                'credential' => substr($credential, 0, 50) . '...'
            ]);
            return null;
        }
    }

    /**
     * Obtém informações do usuário a partir do access token
     *
     * @param string $accessToken
     * @return array|null
     */
    public function getUserInfo(string $accessToken): ?array
    {
        try {
            $this->client->setAccessToken($accessToken);
            
            $oauth = new \Google\Service\Oauth2($this->client);
            $userInfo = $oauth->userinfo->get();

            return [
                'google_id' => $userInfo->id,
                'email' => $userInfo->email,
                'email_verified' => $userInfo->verifiedEmail,
                'name' => $userInfo->name,
                'given_name' => $userInfo->givenName,
                'family_name' => $userInfo->familyName,
                'picture' => $userInfo->picture,
                'locale' => $userInfo->locale ?? 'pt',
            ];
        } catch (Exception $e) {
            Log::error('Google OAuth: Erro ao obter informações do usuário', [
                'error' => $e->getMessage()
            ]);
            return null;
        }
    }

    /**
     * Gera URL de autenticação do Google
     *
     * @return string
     */
    public function getAuthUrl(): string
    {
        $this->client->addScope('email');
        $this->client->addScope('profile');
        
        return $this->client->createAuthUrl();
    }

    /**
     * Troca o código de autorização por access token
     *
     * @param string $code
     * @return array|null
     */
    public function fetchAccessTokenWithAuthCode(string $code): ?array
    {
        try {
            $token = $this->client->fetchAccessTokenWithAuthCode($code);
            
            if (isset($token['error'])) {
                Log::error('Google OAuth: Erro ao trocar código por token', [
                    'error' => $token['error_description'] ?? $token['error']
                ]);
                return null;
            }

            return $token;
        } catch (Exception $e) {
            Log::error('Google OAuth: Erro ao trocar código por token', [
                'error' => $e->getMessage()
            ]);
            return null;
        }
    }
}
