from reviews.models import Keyword


PICOC_MAP = {"P": "population", "I": "intervention", "C": "comparison", "O": "outcome"}


def generate_search_string(review) -> str:
    parts = []
    for code, _ in PICOC_MAP.items():
        keywords = Keyword.objects.filter(review_id=review.id, related_to=code, synonym_of_id=None).all()
        if not keywords:
            continue
        groups = []
        for kw in keywords:
            terms = [kw.description] + [s.description for s in kw.synonyms]
            if len(terms) == 1:
                groups.append(f'"{terms[0]}"')
            else:
                groups.append("(" + " OR ".join(f'"{t}"' for t in terms) + ")")
        parts.append(" AND ".join(groups))
    return " AND ".join(f"({p})" for p in parts if p)


def import_keywords_from_picoc(review, merge: bool = False):
    
    if not merge:
        Keyword.objects.filter(review_id=review.id).delete()
    existing = set()
    if merge:
        for kw in Keyword.objects.filter(review_id=review.id).all():
            existing.add((kw.description.lower(), kw.related_to))
    for code, attr in PICOC_MAP.items():
        text = getattr(review, attr, "") or ""
        for term in [t.strip() for t in text.split(",") if t.strip()]:
            key = (term.lower(), code)
            if merge and key in existing:
                continue
            Keyword(review_id=review.id, description=term, related_to=code.save())
            existing.add(key)
    
