"""Persistência da extração de dados por artigo."""

from reviews.models import DataExtraction, DataExtractionLookup
from rsl.services.extraction_values import normalize_value, parse_lookup_ids


def _form_checkbox_bool(form_data, name: str) -> bool:
    """Interpreta checkbox enviado via form (on/off) ou ausente como False."""
    for val in form_data.getlist(name):
        if str(val).lower() in ("on", "true", "1", "yes"):
            return True
    return False


def save_article_extraction(
    article,
    fields,
    user_id: int,
    form_data,
) -> tuple[bool, str | None, dict]:
    """
    Salva extração, lembretes da tese e status de conclusão a partir de um form/multidict.
    Retorna (sucesso, mensagem_erro, metadados_para_ui).
    """
    for field in fields:
        extraction = next(
            (e for e in article.extractions.all() if e.field_id == field.id), None
        )
        if not extraction:
            extraction = DataExtraction(
                article_id=article.id, field_id=field.id, user_id=user_id
            )
            extraction.save()
        if field.field_type == "S":
            lookup_ids = parse_lookup_ids(form_data.getlist(f"field_{field.id}"))
            if lookup_ids:
                extraction.select_values = DataExtractionLookup.objects.filter(
                    DataExtractionLookup.id.in_(lookup_ids)
                ).all()
            else:
                extraction.select_values = []
            extraction.value = ""
        else:
            raw = form_data.get(f"field_{field.id}", "")
            value, err = normalize_value(field.field_type, raw)
            if err:
                return False, f"{field.description}: {err}", {}
            extraction.value = value or ""
        extraction.user_id = user_id

    article.finished_data_extraction = _form_checkbox_bool(form_data, "finished")
    article.thesis_highlight = _form_checkbox_bool(form_data, "thesis_highlight")
    article.thesis_tags = (form_data.get("thesis_tags") or "").strip()[:500]
    article.thesis_reminder = (form_data.get("thesis_reminder") or "").strip()
    article.updated_by_id = user_id
    

    return True, None, {
        "finished": article.finished_data_extraction,
        "highlighted": article.thesis_highlight,
        "article_id": article.id,
    }
