from django.core.management import BaseCommand
from media.models import BD, CD, Manga, Revue, Roman, Vinyle, Jeu


class Command(BaseCommand):
    """
    Extract the database into a user-friendly website written in Markdown.
    """
    def add_arguments(self, parser):
        parser.add_argument('--directory', '-d', type=str, default='.',
                            help="Directory where mkdocs is running.")

    def handle(self, *args, **options):
        directory = options["directory"]

        with open(directory + "/docs/index.md", "w") as f:
            f.write("# Media de la Mediatek\n\n\n")
            f.write("Ce site répertorie l'intégralité des media présents "
                    "à la Mediatek de l'ENS Paris-Saclay.\n")

        for model_class, file_name in [(BD, "bd.md"), (Manga, "mangas.md"),
                                       (Roman, "romans.md"),
                                       (CD, "cd.md"), (Vinyle, "vinyles.md")]:
            self.process_model_class(model_class, file_name, f, directory)

        # Traitement différent pour les revues
        with open(directory + "/docs/revues.md", "w") as f:
            f.write("# Revues\n\n\n")

            titles = list(set(obj["title"] for obj in
                              Revue.objects.values("title").distinct().all()))
            titles.sort()

            for title in titles:
                f.write(f"## {title}\n\n\n")

                for medium in Revue.objects.filter(title=title)\
                        .order_by("number").all():
                    f.write(f"### Numéro {medium.number}\n\n\n")
                    if medium.double:
                        f.write("Double revue\n\n")
                    if medium.year:
                        f.write(f"Année : {medium.year}\n\n")
                    if medium.month:
                        f.write(f"Mois : {medium.month}\n\n")
                    if medium.day:
                        f.write(f"Jour : {medium.day}\n\n")
                    f.write("\n\n\n")

        # Traitement différent pour les jeux
        with open(directory + "/docs/jeux.md", "w") as f:
            f.write("# Jeux\n\n\n")

            for game in Jeu.objects.order_by("name").all():
                f.write(f"## {game.name}\n\n\n")
                f.write(f"Durée : {game.duree}\n\n")
                f.write(f"Nombre de joueurs : {game.nombre_joueurs_min} "
                        f"- {game.nombre_joueurs_max}\n\n")
                if game.proprietaire.username != "Med":
                    f.write(f"Propriétaire : {game.proprietaire.username}\n\n")
                if game.comment:
                    f.write(f"Commentaire : {game.comment}\n\n")
                f.write("\n\n\n")

    def process_model_class(self, model_class, file_name, f, directory):
        with open(directory + "/docs/" + file_name, "w") as f:
            f.write("# " + str(model_class._meta.verbose_name_plural)
                    .capitalize() + "\n\n\n")

            titles = list(set(obj["title"] for obj in model_class.objects
                              .values("title").distinct().all()))
            titles.sort()

            for title in titles:
                f.write(f"## {title}\n\n\n")

                for medium in model_class.objects.filter(title=title) \
                        .order_by("side_identifier").all():
                    if hasattr(medium, "subtitle"):
                        f.write(f"### {medium.subtitle}\n\n\n")
                    if hasattr(medium, "isbn"):
                        f.write(f"ISBN : {medium.isbn}\n\n")
                    f.write(f"Cote : {medium.side_identifier}\n\n")
                    f.write("Auteurs : " + ", ".join(
                        author.name for author in medium.authors.all())
                        + "\n\n")
                    if hasattr(medium, "number_of_pages"):
                        f.write(f"Nombre de pages : "
                                f"{medium.number_of_pages}\n\n")
                    if hasattr(medium, "rpm"):
                        f.write(f"Tours par minute : "
                                f"{medium.rpm}\n\n")
                    if hasattr(medium, "publish_date"):
                        f.write(f"Publié le : "
                                f"{medium.publish_date}\n\n")
                    if hasattr(medium, "external_url"):
                        f.write(f"Lien : [{medium.external_url}]"
                                f"({medium.external_url})\n\n")
                    f.write("\n\n\n")