from collections import OrderedDict

from misago.categories.models import Category

from . import PostingMiddleware


class SaveChangesMiddleware(PostingMiddleware):
    def __init__(self, **kwargs):
        super(SaveChangesMiddleware, self).__init__(**kwargs)
        self.reset_state()

    def reset_state(self):
        self.user.update_all = False
        self.thread.update_all = False
        self.post.update_all = False

        self.user.update_fields = []
        self.thread.update_fields = []
        self.post.update_fields = []

        try:
            self.thread.category.update_all = False
            self.thread.category.update_fields = []
        except Category.DoesNotExist:
            # Exception for cases when thread has no category associated
            # If this is the case, its Category's middleware job to set those flags
            pass

    def save_models(self):
        self.save_model(self.user)
        self.save_model(self.thread.category)
        self.save_model(self.thread)
        self.save_model(self.post)
        self.reset_state()

    def save_model(self, model):
        if model.update_all:
            model.save()
        elif model.update_fields:
            update_fields = list(OrderedDict.fromkeys(model.update_fields))
            model.save(update_fields=update_fields)

    def save(self, serializer):
        self.save_models()

    def post_save(self, serializer):
        self.save_models()