# -*- coding: utf-8 -*-
# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
from optparse import make_option
from django.core.management.base import BaseCommand

from catalogue.models import Book


class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('-q', '--quiet', action='store_false', dest='verbose', default=True,
            help='Suppress output'),
        make_option('-d', '--dry-run', action='store_true', dest='dry_run', default=False,
            help="Just check for problems, don't fix them"),
    )
    help = 'Checks integrity of catalogue data.'

    def handle(self, **options):
        from django.db import transaction

        verbose = options['verbose']

        with transaction.commit_on_success():
            for book in Book.objects.all().iterator():
                try:
                    info = book.wldocument().book_info
                except:
                    if verbose:
                        print "ERROR! Bad XML for book:", book.slug
                        print "To resolve: republish."
                        print
                else:
                    should_be = [p.slug for p in info.parts]
                    is_now = [p.slug for p in book.children.all().order_by('parent_number')]
                    if should_be != is_now:
                        if verbose:
                            print "ERROR! Wrong children for book:", book.slug
                            print "Is:       ", is_now
                            print "Should be:", should_be
                            print "To resolve: republish parent book."
                            print

                # Check for parent l-tags.
                parents = []
                parent = book.parent
                while parent:
                    parents.append(parent)
                    parent = parent.parent
                ltags = [b.book_tag() for b in parents]
                if set(ltags) != set(book.tags.filter(category='book')):
                    if options['verbose']:
                        print "Wrong book tags for book:", book
                        print "Is:       ", ", ".join(sorted(t.slug for t in book.tags.filter(category='book')))
                        print "Should be:", ", ".join(sorted(t.slug for t in ltags))
                    if not options['dry_run']:
                        book.tags = ltags + list(book.tags.exclude(category='book'))
                        if options['verbose']:
                            print "Fixed."
                    if options['verbose']:
                        print

                # TODO: check metadata tags, reset counters
