import io
import os
from typing import Tuple

from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseUpload

SCOPES = ["https://www.googleapis.com/auth/drive"]


def _get_drive_service():
    credentials_file = os.environ.get(
        "GOOGLE_DRIVE_CREDENTIALS_FILE",
        "config/google_drive_credentials.json",
    )
    credentials = service_account.Credentials.from_service_account_file(
        credentials_file,
        scopes=SCOPES,
    )
    return build("drive", "v3", credentials=credentials)


def upload_file(
    file_data: bytes,
    filename: str,
    content_type: str,
) -> Tuple[str, str]:
    """Upload a file to the configured Google Drive folder.

    Returns:
        (file_id, view_url) — the Drive file ID and public-ish view link.
    """
    folder_id = os.environ.get("GOOGLE_DRIVE_FOLDER_ID", "")
    service = _get_drive_service()

    file_metadata = {
        "name": filename,
    }
    if folder_id:
        file_metadata["parents"] = [folder_id]

    media = MediaIoBaseUpload(
        io.BytesIO(file_data),
        mimetype=content_type,
        resumable=False,
    )

    uploaded = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )

    file_id = uploaded.get("id")
    view_url = f"https://drive.google.com/file/d/{file_id}/view"
    return file_id, view_url


def delete_file(file_id: str) -> None:
    """Permanently delete a file from Google Drive by its file ID."""
    service = _get_drive_service()
    service.files().delete(fileId=file_id).execute()
