#!/usr/bin/env python3
"""
Script de test pour appeler l'API Generative AI (Gemini).

Fonctionnalités:
- supporte clé API via `GOOGLE_API_KEY` (paramètre `?key=`) pour tests rapides
- supporte compte de service via `GOOGLE_APPLICATION_CREDENTIALS` (recommandé)
- affiche la réponse JSON formatée

Usage:
  - Définir `GOOGLE_APPLICATION_CREDENTIALS` vers le JSON du service account, ou
  - Définir `GOOGLE_API_KEY` pour tests rapides
  - Lancer: `python scripts/gemini_request.py "Votre prompt ici"`

Remarques de sécurité:
  Ne commitez jamais le fichier JSON du compte de service ni de clés dans le dépôt.
"""
from __future__ import annotations

import json
import os
import sys
from typing import Optional

import requests

try:
    from google.oauth2 import service_account
    from google.auth.transport.requests import Request
except Exception:
    service_account = None  # type: ignore
    Request = None  # type: ignore


def get_bearer_token() -> Optional[str]:
    """Return a bearer token if a service account is configured, otherwise None.

    Requires `google-auth` (install with `pip install google-auth`).
    """
    api_key = os.environ.get("GOOGLE_API_KEY")
    if api_key:
        return None

    sa_path = os.environ.get("GOOGLE_APPLICATION_CREDENTIALS")
    if not sa_path:
        raise RuntimeError("Neither GOOGLE_API_KEY nor GOOGLE_APPLICATION_CREDENTIALS is set in the environment.")

    if service_account is None or Request is None:
        raise RuntimeError("google-auth library is required for service account auth. Install with `pip install google-auth`.")

    creds = service_account.Credentials.from_service_account_file(
        sa_path, scopes=["https://www.googleapis.com/auth/cloud-platform"]
    )
    creds.refresh(Request())
    return creds.token


def build_request(prompt: str, model: str = "text-bison-001") -> dict:
    return {
        "prompt": {"text": prompt},
        "maxOutputTokens": 300
    }


def main():
    prompt = "Donne-moi 3 idées de titres pour un article sur l'énergie solaire." if len(sys.argv) < 2 else " ".join(sys.argv[1:])
    model = os.environ.get("GEMINI_MODEL", "text-bison-001")

    api_key = os.environ.get("GOOGLE_API_KEY")
    try:
        token = None if api_key else get_bearer_token()
    except Exception as e:
        print("Erreur d'authentification:", str(e))
        sys.exit(2)

    base_url = f"https://generativelanguage.googleapis.com/v1/models/{model}:generate"
    url = base_url + (f"?key={api_key}" if api_key else "")

    headers = {"Content-Type": "application/json"}
    if token:
        headers["Authorization"] = f"Bearer {token}"

    payload = build_request(prompt, model=model)

    resp = requests.post(url, headers=headers, json=payload)
    try:
        resp_json = resp.json()
        print(json.dumps(resp_json, ensure_ascii=False, indent=2))
    except ValueError:
        print("Réponse non JSON (status", resp.status_code, ")")
        print(resp.text)


if __name__ == "__main__":
    main()
