import logging
from django.db.models import Q
from django.http import JsonResponse
from django.core.exceptions import ObjectDoesNotExist
from Subscriptions.models import RegistrationForm, Student
from Auth.models import Profile

logger = logging.getLogger('N3wtSchool')

def getAllObjects(_objectName):
    result = _objectName.objects.all()
    if not result:
        logger.warning("Aucun résultat n'a été trouvé      - " + _objectName.__name__)
    return result

def getObject(_objectName, _columnName, _value):
    result=None
    try :
        result = _objectName.objects.get(**{_columnName: _value})
    except _objectName.DoesNotExist:
        logger.error("Aucun résultat n'a été trouvé    - " + _objectName.__name__ + "  (" + _columnName + "=" + str(_value) + ")")

    return result

def getObjects(_objectName, _columnName, _value, _reverseCondition=False):
    results=None
    try :
        results = _objectName.objects.filter(**{_columnName: _value}) if _reverseCondition == False else _objectName.objects.filter(~Q(**{_columnName: _value}))
    except _objectName.DoesNotExist:
        logger.error("Aucun résultat n'a été trouvé    - " + _objectName.__name__ + "  (" + _columnName + "=" + str(_value) + ")")

    return results

def existsProfilInList(objectList, valueToCheck):
    result = False
    for objectInstance in objectList:
        if objectInstance.email == valueToCheck:
            result = True
    return result

def getProfile(objectList, valueToCheck):
    result = None
    for objectInstance in objectList:
        if objectInstance.email == valueToCheck:
            result = objectInstance
    return result

def getEleveByCodeFI(_codeFI):
    student = None
    ficheInscriptions_List=getAllObjects(RegistrationForm)
    for rf in ficheInscriptions_List:
        if rf.codeLienInscription == _codeFI:
            student = rf.student
    return student

def getLastId(_object):
    result = 1
    try:
        result = _object.objects.latest('id').id
    except:
        logger.warning("Aucun résultat n'a été trouvé      - ")
    return result

def searchObjects(_objectName, _searchTerm=None, _excludeStates=None):
    """
    Recherche générique sur les objets avec possibilité d'exclure certains états
    _objectName: SchoolClass du modèle
    _searchTerm: Terme de recherche
    _excludeStates: Liste d'état à exclure de la recherche (optionnel)
    """
    try:
        query = _objectName.objects.all()

        # Si on a un état à exclure
        if _excludeStates is not None:
            query = query.exclude(status__in=_excludeStates)

        # Si on a un terme de recherche
        if _searchTerm and _searchTerm.strip():
            terms = _searchTerm.lower().strip().split()
            for term in terms:
                query = query.filter(
                    Q(student__last_name__icontains=term) |
                    Q(student__first_name__icontains=term)
                )

        return query.order_by('student__last_name', 'student__first_name')

    except _objectName.DoesNotExist:
        logging.error(f"Aucun résultat n'a été trouvé - {_objectName.__name__} (recherche: {_searchTerm})")
        return None

def delete_object(model_class, object_id, related_field=None):
    try:
        obj = model_class.objects.get(id=object_id)

        if related_field and hasattr(obj, related_field):
            related_obj = getattr(obj, related_field)
            if related_obj:
                related_obj.delete()
        obj_name = str(obj)  # Utiliser la méthode __str__
        obj.delete()
        return JsonResponse({'message': f'La suppression de l\'objet {obj_name} a été effectuée avec succès'}, safe=False)
    except ObjectDoesNotExist:
        return JsonResponse({'error': f'L\'objet {model_class.__name__} n\'existe pas avec cet ID'}, status=404, safe=False)
    except Exception as e:
        return JsonResponse({'error': f'Une erreur est survenue : {str(e)}'}, status=500, safe=False)
