import requests
from bs4 import BeautifulSoup
from newspaper import Article
import ollama
import tldextract
import urllib.parse
from langdetect import detect


# Surse suspecte
SURSE_FALS = ["clickbait.ro", "fake-news-site.com"]

# Funcția principală pentru extragerea datelor din URL
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 din HTML (opțional)
        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

        return {
            "url": url,
            "title": article.title,
            "text": article.text,
            "authors": article.authors or [autor],
            "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()


# Verificare în GDELT
def cauta_in_gdelt(url, titlu):
    query = urllib.parse.quote(titlu if len(titlu) < 100 else url)
    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] is None:
        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']) if articol['authors'] else 'Autor necunoscut'}")
        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(rezumat)

        print("\n--- ANALIZĂ IA (LLM) ---")
        verdict_ai = analiza_fact_check(articol["text"])
        print(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}")
