# -*- coding: utf-8 -*-
#
# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
from librarian import RDFNS, WLURI, ValidationError
from librarian.dcparser import BookInfo
from catalogue.management import XmlUpdater
from catalogue.management.commands import XmlUpdaterCommand


def fix_wluri(elem, change, verbose):
    try:
        WLURI.strict(elem.text)
    except ValidationError:
        correct_field = unicode(WLURI.from_slug(
            WLURI(elem.text.strip()).slug))
        try:
            WLURI.strict(correct_field)
        except ValidationError:
            # Can't make a valid WLURI out of it, leave as is.
            return False
        if verbose:
            print "Changing %s from %s to %s" % (
                elem.tag, elem.text, correct_field
            )
        elem.text = correct_field
        return True


class FixDC(XmlUpdater):
    commit_desc = "auto-fixing DC"
    retain_publishable = True
    only_first_chunk = True

    for field in BookInfo.FIELDS:
        if field.validator == WLURI:
            XmlUpdater.fixes_elements('.//' + field.uri)(fix_wluri)

    # unused
    @XmlUpdater.fixes_elements(".//" + RDFNS("Description"))
    def fix_rdfabout(elem, change, verbose):
        correct_about = change.tree.book.correct_about()
        attr_name = RDFNS("about")
        current_about = elem.get(attr_name)
        if current_about != correct_about:
            if verbose:
                print "Changing rdf:about from %s to %s" % (
                        current_about, correct_about
                    )
            elem.set(attr_name, correct_about)
            return True


class Command(XmlUpdaterCommand):
    updater = FixDC
    help = 'Fixes obvious errors in DC: rdf:about and WLURI format.'
