"""
Google OAuth integration
"""
import requests
from flask import current_app, redirect, url_for, session
from urllib.parse import urlencode


class GoogleOAuth:
    """Google OAuth 2.0 client"""

    AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth'
    TOKEN_URL = 'https://oauth2.googleapis.com/token'
    USER_INFO_URL = 'https://www.googleapis.com/oauth2/v3/userinfo'
    SCOPES = [
        'openid',
        'email',
        'profile',
        'https://www.googleapis.com/auth/calendar',
        'https://www.googleapis.com/auth/gmail.readonly',
        'https://www.googleapis.com/auth/gmail.send'
    ]

    def __init__(self):
        self.client_id = current_app.config.get('GOOGLE_CLIENT_ID')
        self.client_secret = current_app.config.get('GOOGLE_CLIENT_SECRET')
        self.redirect_uri = current_app.config.get('GOOGLE_REDIRECT_URI')

    def authorize_redirect(self, state):
        """Generate authorization URL and redirect"""
        params = {
            'client_id': self.client_id,
            'redirect_uri': self.redirect_uri,
            'scope': ' '.join(self.SCOPES),
            'response_type': 'code',
            'state': state,
            'access_type': 'offline',  # Get refresh token
            'prompt': 'consent'  # Force consent to get refresh token
        }
        url = f"{self.AUTH_URL}?{urlencode(params)}"
        return redirect(url)

    def fetch_token(self, code):
        """Exchange authorization code for access token"""
        data = {
            'code': code,
            'client_id': self.client_id,
            'client_secret': self.client_secret,
            'redirect_uri': self.redirect_uri,
            'grant_type': 'authorization_code'
        }

        response = requests.post(self.TOKEN_URL, data=data)

        if response.status_code != 200:
            current_app.logger.error(f'Google OAuth token error: {response.text}')
            return None

        return response.json()

    def get_user_info(self, access_token=None):
        """Get user information from Google"""
        if not access_token:
            return None

        headers = {'Authorization': f'Bearer {access_token}'}
        response = requests.get(self.USER_INFO_URL, headers=headers)

        if response.status_code != 200:
            current_app.logger.error(f'Google user info error: {response.text}')
            return None

        return response.json()

    def refresh_token(self, refresh_token):
        """Refresh access token"""
        data = {
            'refresh_token': refresh_token,
            'client_id': self.client_id,
            'client_secret': self.client_secret,
            'grant_type': 'refresh_token'
        }

        response = requests.post(self.TOKEN_URL, data=data)

        if response.status_code != 200:
            current_app.logger.error(f'Google token refresh error: {response.text}')
            return None

        return response.json()


# Singleton instance
google = None


def get_google():
    """Get Google OAuth client"""
    global google
    if google is None:
        google = GoogleOAuth()
    return google
