"""
Un mixin à utiliser avec BaseCommand pour charger des objets depuis un json
"""

import json
import os

from django.core.management.base import BaseCommand


class MyBaseCommand(BaseCommand):
    """
    Ajoute une méthode ``from_json`` qui charge des objets à partir d'un json.
    """

    def from_json(self, filename, data_dir, klass, callback=lambda obj: obj):
        """
        Charge les objets contenus dans le fichier json référencé par
        ``filename`` dans la base de donnée. La fonction callback est appelées
        sur chaque objet avant enregistrement.
        """
        self.stdout.write("Chargement de {:s}".format(filename))
        with open(os.path.join(data_dir, filename), "r") as file:
            descriptions = json.load(file)
        objects = []
        nb_new = 0
        for description in descriptions:
            qset = klass.objects.filter(**description)
            try:
                objects.append(qset.get())
            except klass.DoesNotExist:
                obj = klass(**description)
                obj = callback(obj)
                obj.save()
                objects.append(obj)
                nb_new += 1
        self.stdout.write("- {:d} objets créés".format(nb_new))
        self.stdout.write(
            "- {:d} objets gardés en l'état".format(len(objects) - nb_new)
        )
        return objects
