from django.db import transaction
from .models import PointRule, Result, SchoolPoint, ParticipantPoint

def place_label(position):
    return {1: "I", 2: "II", 3: "III"}.get(position, "")

def recompute_results(item):
    results = list(
        Result.objects.filter(item=item)
        .select_related("participant", "group_entry__school")
        .order_by("-total", "id")
    )
    last_total = None
    current_place = 0
    for index, result in enumerate(results, start=1):
        if last_total != result.total:
            current_place = index
            last_total = result.total
        result.position = current_place
        result.place = place_label(current_place)
        result.save(update_fields=["position", "place"])
    return results

@transaction.atomic
def publish_item(item):
    rule, _ = PointRule.objects.get_or_create(
        item=item,
        defaults={"first": 10 if item.participation_type == "G" else 5,
                  "second": 6 if item.participation_type == "G" else 3,
                  "third": 3 if item.participation_type == "G" else 1},
    )
    for result in Result.objects.filter(item=item, confirmed=True):
        pts = {1: rule.first, 2: rule.second, 3: rule.third}.get(result.position, 0)

        SchoolPoint.objects.filter(result=result).delete()
        ParticipantPoint.objects.filter(result=result).delete()

        if pts:
            SchoolPoint.objects.create(
                school=result.competitor_school,
                result=result,
                points=pts,
            )
            if result.participant_id and item.participation_type == "I":
                ParticipantPoint.objects.create(
                    participant=result.participant,
                    result=result,
                    points=pts,
                )

        result.published = True
        result.save(update_fields=["published"])

@transaction.atomic
def reset_item(item):
    results = Result.objects.filter(item=item)
    for result in results:
        SchoolPoint.objects.filter(result=result).delete()
        ParticipantPoint.objects.filter(result=result).delete()
        result.published = False
        result.confirmed = False
        result.save(update_fields=["published", "confirmed"])
