# ══════════════════════════════════════════════════════════
#  engines/gemini_client.py
#  Failover: Pro key1→N, lalu Flash key1→N
#  Notif hanya saat ganti tier atau semua habis
# ══════════════════════════════════════════════════════════

import logging
from typing import Optional
import google.generativeai as genai
from google.generativeai.types import HarmCategory, HarmBlockThreshold

from config import GEMINI_API_KEYS, GEMINI_PRO, GEMINI_FLASH

logger = logging.getLogger(__name__)

_SAFETY = {
    HarmCategory.HARM_CATEGORY_HATE_SPEECH:       HarmBlockThreshold.BLOCK_NONE,
    HarmCategory.HARM_CATEGORY_HARASSMENT:        HarmBlockThreshold.BLOCK_NONE,
    HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE,
}

_VALID_KEYS = [k for k in GEMINI_API_KEYS
               if k and not k.startswith("GEMINI_KEY_")]


def _is_quota(e: Exception) -> bool:
    s = str(e).lower()
    return any(x in s for x in ("429", "quota", "limit", "exhausted", "resource_exhausted"))


async def call_gemini(prompt: str, message, task: str = "title") -> Optional[str]:
    if not _VALID_KEYS:
        await message.reply_text("Tidak ada Gemini API key valid di config")
        return None

    tiers = [("Pro", GEMINI_PRO), ("Flash", GEMINI_FLASH)]

    for tier_idx, (tier_name, model_name) in enumerate(tiers):
        exhausted_count = 0

        for key_idx, key in enumerate(_VALID_KEYS):
            genai.configure(api_key=key)
            model = genai.GenerativeModel(model_name, safety_settings=_SAFETY)
            try:
                logger.info(f"[Gemini] {tier_name} key {key_idx+1}/{len(_VALID_KEYS)}")
                resp = model.generate_content(prompt)
                return resp.text
            except Exception as e:
                if _is_quota(e):
                    exhausted_count += 1
                    logger.warning(f"[Gemini] {tier_name} key {key_idx+1} quota habis")
                    continue
                else:
                    logger.error(f"[Gemini] Error: {e}")
                    await message.reply_text(f"Gemini error\n`{e}`", parse_mode="Markdown")
                    return None

        # Semua key di tier ini habis
        if tier_idx == 0:
            # Masih ada Flash tier — notif singkat
            await message.reply_text(
                f"_Gemini Pro ({exhausted_count} key) quota habis, beralih ke Flash_",
                parse_mode="Markdown"
            )
        # Kalau tier_idx == 1 (Flash) juga habis, loop selesai

    # Semua tier habis
    await message.reply_text(
        "Semua Gemini key habis quota hari ini\nCoba lagi besok atau gunakan Claude",
        parse_mode="Markdown"
    )
    return None