from django.db import OperationalError

from .models import Sighting, Tag


def get_new_sighting_tag_ids():
    try:
        existing = set(Tag.objects.values_list("tag_id", flat=True))
        return list(
            Sighting.objects.values_list("tag_id", flat=True)
            .distinct()
            .order_by("tag_id")
            .exclude(tag_id__in=existing)
        )
    except OperationalError:
        return []


def get_existing_sighting_tag_count():
    try:
        existing = set(Tag.objects.values_list("tag_id", flat=True))
        return (
            Sighting.objects.values_list("tag_id", flat=True)
            .distinct()
            .filter(tag_id__in=existing)
            .count()
        )
    except OperationalError:
        return 0


def import_sighting_tags(note=""):
    new_ids = get_new_sighting_tag_ids()
    created = 0
    for tag_id in new_ids:
        _, was_created = Tag.objects.get_or_create(
            tag_id=tag_id, defaults={"note": note}
        )
        if was_created:
            created += 1
    return created, len(new_ids) - created
