from collections import namedtuple
from typing import Any, List
from django.db import models

class GenericResponseObject():    
    def __init__(self, status=False, validation_errors={}):
        self.status = status
        self.validation_errors = validation_errors   

class EagerLoadingMixin():
    
    @classmethod
    def setup_eager_loading(cls, queryset):
        if hasattr(cls, "SELECT"):
            queryset = queryset.select_related(*cls.SELECT)
        if hasattr(cls, "PREFETCH"):
            queryset = queryset.prefetch_related(*cls.PREFETCH)
        return queryset
    
def objJsonDecode(_dict: dict):
    return namedtuple('X', _dict.keys())(*_dict.values())
    
class Sorting():
    def __init__(self, field_name:str, operation:str):
        self.field_name=field_name
        self.operation=operation

class Filter():
    def __init__(self, field_name:str, filter_condition:str, filter_value:Any):
        self.field_name=field_name
        self.filter_condition=filter_condition
        self.filter_value=filter_value

class FilterAndSorting():
    def __init__(self, filters:List[Filter]=[], sortings:List[Sorting]=[]):
        self.filters = filters
        self.sortings = sortings


class PagedAndFilterResponse():
    def __init__(self, total_count, page, items):
        self.total_count = total_count
        self.page = page
        self.items = items

class PagedFilterAndSorting(FilterAndSorting):
    def __init__(self, filters:List[Filter]=[], sortings:List[Sorting]=[], page_size=10, page_index=1):
        super(filters,sortings)
        
        self.page_size=page_size
        self.page_index=page_index
