import bibtexparser
from bibtexparser.bparser import BibTexParser

from reviews.models import Article
from rsl.services.slug import slugify


def _get(entry, *keys, default=""):
    for key in keys:
        if key in entry and entry[key]:
            return str(entry[key]).strip()
    return default


def parse_bibtex(content: str) -> list[dict]:
    parser = BibTexParser()
    parser.ignore_nonstandard_types = False
    library = bibtexparser.loads(content, parser=parser)
    return library.entries


def _is_duplicate(review_id: int, title: str, doi: str, bibtex_key: str) -> bool:
    if doi:
        existing = Article.objects.filter(review_id=review_id, doi=doi).first()
        if existing:
            return True
    if bibtex_key:
        existing = Article.objects.filter(review_id=review_id, bibtex_key=bibtex_key).first()
        if existing:
            return True
    if title:
        key = slugify(title)
        for article in Article.objects.filter(review_id=review_id).all():
            if slugify(article.title or "") == key:
                return True
    return False


def import_bibtex_to_review(review, source, content: str, user) -> tuple[int, int]:
    """Retorna (importados, ignorados_duplicados)."""
    entries = parse_bibtex(content)
    imported = 0
    skipped = 0
    for entry in entries:
        title = _get(entry, "title")
        doi = _get(entry, "doi")
        bibtex_key = _get(entry, "ID")
        if _is_duplicate(review.id, title, doi, bibtex_key):
            skipped += 1
            continue
        article = Article(
            review_id=review.id,
            source_id=source.id if source else None,
            title=title,
            authors=_get(entry, "author"),
            journal=_get(entry, "journal", "booktitle"),
            year=_get(entry, "year"),
            volume=_get(entry, "volume"),
            number=_get(entry, "number"),
            pages=_get(entry, "pages"),
            doi=doi,
            abstract=_get(entry, "abstract"),
            bibtex_key=bibtex_key,
            entry_type=entry.get("ENTRYTYPE", ""),
            publisher=_get(entry, "publisher"),
            url=_get(entry, "url"),
            author_keywords=_get(entry, "keywords"),
            pmid=_get(entry, "pmid"),
            created_by_id=user.id,
            updated_by_id=user.id,
        )
        article.save()
        imported += 1
    
    return imported, skipped
