game_manager_lib\commands/
ai_translation.rs

1//! Comando Tauri para traduzir descrições de jogos usando o serviço Gemini AI.
2//!
3//! **Fluxo:**
4//! 1. Recupera a chave API do banco de dados seguro.
5//! 2. Chama o serviço Gemini para traduzir o texto.
6//! 3. Salva a tradução no banco de dados local para evitar custos futuros.
7
8use crate::database;
9use crate::database::AppState;
10use crate::errors::AppError;
11use crate::services::gemini;
12use rusqlite::params;
13use tauri::{AppHandle, Manager, State};
14use tracing::{error, info};
15
16/// Traduz a descrição de um jogo
17#[tauri::command]
18pub async fn translate_description(
19    app: AppHandle,
20    game_id: String,
21    text: String,
22) -> Result<String, AppError> {
23    info!("Comando de tradução recebido para jogo ID: {}", game_id);
24
25    // 1. Busca a chave no banco seguro
26    let api_key = database::get_secret(&app, "gemini_api_key").map_err(|e| {
27        error!("Falha ao ler banco de secrets: {}", e);
28        AppError::DatabaseError("Erro interno de banco de dados".to_string())
29    })?;
30
31    if api_key.is_empty() {
32        error!("Chave Gemini não encontrada no banco!");
33        return Err(AppError::ValidationError(
34            "API Key do Gemini não configurada. Vá em Configurações.".to_string(),
35        ));
36    }
37
38    // 2. Chama o serviço de tradução
39    let translated_text = gemini::translate_text(&api_key, &text)
40        .await
41        .map_err(AppError::NetworkError)?;
42
43    // 3. Salva a tradução no banco para não gastar cota depois
44    let state: State<AppState> = app.state();
45    let conn = state.library_db.lock()?;
46
47    conn.execute(
48        "UPDATE game_details SET description_ptbr = ?1 WHERE game_id = ?2",
49        params![translated_text, game_id],
50    )?;
51
52    Ok(translated_text)
53}