import json
import logging
import subprocess
import urllib.parse

from google import genai
from google.genai import types

from app.config import GEMINI_API_KEY, GEMINI_MODEL

logger = logging.getLogger(__name__)

_client = genai.Client(api_key=GEMINI_API_KEY)

_WIKI_API = "https://en.wikipedia.org/w/api.php"
_HTTP_TIMEOUT = 15
_EXTRACT_MAX_CHARS = 6000
_USER_AGENT = "shorts-fact-checker/1.0 (local automation)"


def _curl_json(params: dict) -> dict:
    """Wikipedia'nın API'sine curl ile istek atar.

    httpx/requests gibi Python HTTP kütüphaneleriyle yapılan istekler Wikimedia'nın
    bot-koruma katmanı tarafından fingerprint üzerinden 403 ile engelleniyor; sistem
    curl'ü aynı istekte sorunsuz geçiyor, bu yüzden bilinçli olarak subprocess kullanılıyor.
    """
    url = f"{_WIKI_API}?{urllib.parse.urlencode(params)}"
    result = subprocess.run(
        ["curl", "-s", "-A", _USER_AGENT, url],
        capture_output=True, text=True, timeout=_HTTP_TIMEOUT, check=True,
    )
    return json.loads(result.stdout)


def _extract_search_query(fact_text: str) -> str:
    prompt = (
        "Aşağıdaki Türkçe bilgi cümlesinin konusunu Wikipedia'da aratmak için kısa, İngilizce "
        "bir arama sorgusu yaz (konu/kişi adı + iddianın özeti, 3-8 kelime). Sadece sorguyu "
        "yaz, başka hiçbir şey ekleme, tırnak kullanma.\n\n"
        f'Bilgi: "{fact_text}"'
    )
    response = _client.models.generate_content(
        model=GEMINI_MODEL,
        contents=prompt,
        config=types.GenerateContentConfig(temperature=0.0),
    )
    return (response.text or "").strip().strip('"')


def _wikipedia_extract(query: str) -> tuple[str, str] | None:
    search_data = _curl_json(
        {"action": "query", "list": "search", "srsearch": query, "srlimit": 1, "format": "json"}
    )
    results = search_data.get("query", {}).get("search", [])
    if not results:
        return None
    title = results[0]["title"]

    extract_data = _curl_json(
        {"action": "query", "prop": "extracts", "explaintext": 1, "titles": title, "format": "json"}
    )
    pages = extract_data.get("query", {}).get("pages", {})
    page = next(iter(pages.values()), {})
    extract = page.get("extract", "")
    if not extract:
        return None
    return title, extract[:_EXTRACT_MAX_CHARS]


def verify_fact(fact_text: str) -> tuple[bool, str | None]:
    """Wikipedia'dan çekilen gerçek metinle bilgiyi karşılaştırarak doğrular.

    İlgili bir Wikipedia maddesi bulunamazsa (ör. genel/soyut bilgiler) doğrulama
    atlanır ve bilgi kabul edilir -- yalnızca bulunan maddeyle AÇIKÇA ÇELİŞEN
    bilgiler reddedilir. Herhangi bir adımda hata olursa (ağ, API vb.) doğrulama
    sessizce atlanır; pipeline'ın bu yüzden tamamen durmaması önceliklidir.
    """
    try:
        query = _extract_search_query(fact_text)
        result = _wikipedia_extract(query)
        if result is None:
            logger.info("No Wikipedia match for fact-check query %r, skipping verification", query)
            return True, None
        title, extract = result

        prompt = (
            "Aşağıda bir Wikipedia maddesinden alınan metin ve doğruluğu kontrol edilecek bir "
            "Türkçe bilgi cümlesi var. SADECE bilgi bu metinle AÇIKÇA ÇELİŞİYORSA (özellikle "
            "sayı, tarih, rekor gibi somut detaylarda) geçersiz say. Metin konuyu doğrulamıyor "
            "ama çelişmiyorsa (ör. o detaydan hiç bahsetmiyorsa) yine de GEÇERLİ kabul et.\n\n"
            f'Wikipedia maddesi ("{title}"):\n{extract}\n\n'
            f'Kontrol edilecek bilgi: "{fact_text}"\n\n'
            "Yanıtını KESİNLİKLE şu iki formattan biriyle ver, başka hiçbir şey yazma:\n"
            "GEÇERLİ\n"
            "veya\n"
            "GEÇERSİZ: <Wikipedia metniyle çelişen kısım>"
        )
        response = _client.models.generate_content(
            model=GEMINI_MODEL,
            contents=prompt,
            config=types.GenerateContentConfig(temperature=0.0),
        )
        text = (response.text or "").strip()
        if text.startswith("GEÇERSİZ"):
            reason = text.split(":", 1)[1].strip() if ":" in text else "Wikipedia ile çelişiyor"
            return False, reason
        return True, None
    except Exception:
        logger.exception("Fact-check failed unexpectedly, skipping verification for this fact")
        return True, None
