import requests
from bs4 import BeautifulSoup
from newspaper import Article
import ollama
import tldextract
import urllib.parse
from langdetect import detect
from argostranslate.package import update_package_index, install_from_path, get_available_packages
from argostranslate.translate import translate as argo_translate


# Surse suspecte
SURSE_FALS = ["clickbait.ro", "fake-news-site.com"]

# --- FUNCȚII PRINCIPALE ---

def extrage_articol(url):
    try:
        article = Article(url)
        article.download()
        article.parse()

        # Detectăm limba
        lang = detect(article.text) if article.text else 'necunoscut'

        # Extragem data și autorul din HTML
        headers = {'User-Agent': 'Mozilla/5.0'}
        r = requests.get(url, headers=headers, timeout=10)
        soup = BeautifulSoup(r.text, 'html.parser')

        data = None
        for meta in soup.find_all('meta'):
            if 'name' in meta.attrs and meta.attrs['name'].lower() == 'date':
                data = meta.attrs.get('content')
            elif 'property' in meta.attrs and meta.attrs['property'] == 'article:published_time':
                data = meta.attrs.get('content')

        autor = None
        for byline in soup.select('.author, .byline, .author-name'):
            if byline:
                autor = byline.get_text().strip()
                break

        # Curățăm lista de autori
        authors_clean = [a for a in article.authors if isinstance(a, str)]
        if not authors_clean and autor:
            authors_clean = [autor]
        if not authors_clean:
            authors_clean = ["Autor necunoscut"]

        return {
            "url": url,
            "title": article.title,
            "text": article.text,
            "authors": authors_clean,
            "publish_date": str(article.publish_date) if article.publish_date else data,
            "lang": lang
        }

    except Exception as e:
        print(f"Eroare la extragere: {e}")
        return None


# Generare rezumat cu Ollama
def genereaza_rezumat(text):
    prompt = f"Rezumă următorul articol în maxim 5 propoziții:\n\n{text[:2048]}"
    response = ollama.generate(model="llama3", prompt=prompt)
    return response["response"].strip()


# Analiză AI dacă este real/fals
def analiza_fact_check(text):
    prompt = f"""
Ai primit următorul articol. Analizează-l și răspunde doar cu un verdict între 0 și 100 despre cât de probabil este real, explicând foarte scurt de ce:
0 = Foarte probabil fals
100 = Foarte probabil real

Articol:
{text[:2048]}
"""
    response = ollama.generate(model="llama3", prompt=prompt)
    return response["response"].strip()


# Traducere text EN -> RO
def traduce_en_ro(text):
    try:
        update_package_index()
        available_pkgs = get_available_packages()
        pkg = next(filter(lambda x: x.from_code == 'en' and x.to_code == 'ro', available_pkgs))
        install_from_path(pkg.download())
        return argo_translate(text, from_code='en', to_code='ro')
    except Exception as e:
        return f"[EROARE TRADUCERE: {e}]"


# Caută în GDELT – VERSIUNE ACTUALIZATĂ
def cauta_in_gdelt(url, titlu):
    """Caută în baza de date GDELT pe baza titlului articolului."""
    query = urllib.parse.quote(titlu[:100])  # Limităm la 100 caractere
    gdelt_url = f"https://api.gdeltproject.org/api/v2/doc/doc?query={query}"

    try:
        response = requests.get(gdelt_url, timeout=10)
        result = response.json()

        if 'articles' in result and len(result['articles']) > 0:
            print("\n⚠️ Stirea a fost găsită în GDELT:")
            for art in result['articles'][:3]:
                print(f" - {art['title']} ({art['seendate']})")
                print(f"   Sursă: {art['url']}")
            return True
        else:
            print("Stirea nu apare în baza de date GDELT.")
            return False
    except Exception as e:
        print(f"Eroare la accesarea GDELT: {e}")
        return False


# Calculare scor general
def calculeaza_scor(articol):
    scor_total = 50

    # Sensaționalism în titlu
    if len(articol["title"]) < 30 and "!" in articol["title"][-2:]:
        scor_total -= 15

    # Autor necunoscut?
    if not articol["authors"] or articol["authors"][0] == "Autor necunoscut":
        scor_total -= 10

    # Limbă necunoscută
    if articol["lang"] == "necunoscut":
        scor_total -= 10

    # Sursă suspicioasă
    extracted = tldextract.extract(articol["url"])
    domeniu = f"{extracted.domain}.{extracted.suffix}"
    if domeniu in SURSE_FALS:
        scor_total -= 30

    # Limitare scor între 0 și 100
    scor_final = max(0, min(100, scor_total))

    if scor_final >= 75:
        verdict = "Probabil real"
    elif scor_final >= 50:
        verdict = "Necesită verificare suplimentară"
    elif scor_final >= 25:
        verdict = "Probabil fals"
    else:
        verdict = "Foarte probabil fals"

    return scor_final, verdict


# --- MAIN ---
if __name__ == "__main__":
    url = input("Introduceți link-ul articolului: ")
    articol = extrage_articol(url)

    if not articol:
        print("Nu s-a putut procesa articolul.")
    else:
        print("\n--- INFORMAȚII EXTRASE ---")
        print(f"Titlu: {articol['title']}")
        print(f"Autor(i): {', '.join(articol['authors'])}")
        print(f"Data publicării: {articol['publish_date'] or 'Necunoscută'}")
        print(f"Limbă detectată: {articol['lang']}")

        print("\n--- REZUMAT AUTOMAT ---")
        rezumat = genereaza_rezumat(articol["text"])
        print(f"EN: {rezumat}")
        print(f"RO: {traduce_en_ro(rezumat)}")

        print("\n--- ANALIZĂ IA (LLM) ---")
        verdict_ai = analiza_fact_check(articol["text"])
        print(f"EN: {verdict_ai}")
        print(f"RO: {traduce_en_ro(verdict_ai)}")

        print("\n--- VERIFICARE ÎN GDELT ---")
        cauta_in_gdelt(url, articol["title"])

        print("\n--- SCOR GENERAL ---")
        scor, verdict = calculeaza_scor(articol)
        print(f"Scor final: {scor}%")
        print(f"Verdict: {verdict} | RO: {traduce_en_ro(verdict)}")
