#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-file:<file>      Minden <file>-ban szereplő lapon frissíti a számlálókat
-cat:<kat>        A <kat> kategória minden lapján frissíti a számlálókat
-link:<lap>       A <lap> lapról hivatkozott minden lapon frissíti a számlálókat

-update           Csak frissítés (ahol nincs darabszám, oda nem szúr be)
-noconfirm        Ne kérdezzen rá a változtatásokra

Ez a bot a megadott wikipédia-lap(ok)on a laphivatkozások után beszúrja
(ill. frissíti) a hivatkozott lapokon szereplő szakaszcímek számát.
"""

import sys, re
import wikipedia, pagegenerators, catlib


class SzakaszszamBot:
    def __init__(self, generator, updateOnly = False, confirm = True):
        self.generator = generator
        self.updateOnly = updateOnly
        self.confirm = confirm

        # group 1: wikicode of link, group 2: linked page name
        linkPtrn = r"(\[\[([^]|]*?)(?:\|[^]]*?)?\]\])(?: *\([0-9]+ db\.?\))"
        if not updateOnly:
            linkPtrn += "?"
        self.linkRe = re.compile(linkPtrn)
        self.sectRe = re.compile(r"(==+).*?\1")


    def run(self):
        if self.confirm:
            answer = ''
        else:
            answer = 'm'
            
        for page in self.generator:
            try:
                text = page.get()
            except wikipedia.NoPage:
                wikipedia.output(u'HIBA: Nem találom a %s lapot' % page.title())
                continue
            except wikipedia.IsRedirectPage:
                continue

            newText = self.linkRe.sub(self.countSections(page.title()), text)
            if newText != text:
                wikipedia.showDiff(text, newText)
                if answer != 'm':
                    answer = wikipedia.input(u"Módosítsam a %s lapot [(i)gen/(N)em/(m)ind]?" %
                                             page.title())
                if answer == 'i' or answer == 'm':
                    page.put(newText, u"Robot: szakaszszámlálók" +
                             (self.updateOnly and " " or u" beillesztése és ") +
                             u"frissítése")

    def countSections(self, referringTitle):
        def cS(match):
            pageTitle = match.group(2)
            if pageTitle.startswith("/"):
                pageTitle = referringTitle + pageTitle
            page = wikipedia.Page(wikipedia.getSite(), pageTitle)
            if page.namespace() != 0:
                return match.group()

            try:
                text = page.get()
            except wikipedia.NoPage: 
                wikipedia.output(u'HIBA: Nem találom a %s lapot' % page.title())
                return match.group()
            except wikipedia.IsRedirectPage, arg:
                try:
                    page = wikipedia.Page(wikipedia.getSite(), arg[0])
                    text = page.get()
                except wikipedia.NoPage:
                    wikipedia.output(u"HIBA: Redirekt a nemlétező %s lapra" % arg[0].title())
                    return match.group()
                except wikipedia.IsRedirectPage:
                    wikipedia.output(u"HIBA: Kettős redirekt: %s" % page.title())
                    return match.group()
    
            count = len(self.sectRe.findall(text))
            wikipedia.output(u"%s: %d db. szakaszcím" % (pageTitle, count))
            return "%s (%d db)" % (match.group(1), count)

        return cS
    

def main():
    gen = None
    updateOnly = False
    confirm = True
    pageTitle = []
    
    for arg in wikipedia.handleArgs():
        if arg.startswith('-file:'):
            gen = pagegenerators.TextfilePageGenerator(arg[6:])
        elif arg.startswith('-cat:'):
            cat = catlib.Category(wikipedia.getSite(), u"Kategória:" + arg[5:])
            gen = pagegenerators.CategorizedPageGenerator(cat)
        elif arg.startswith('-link:'):
            page = wikipedia.Page(wikipedia.getSite(), arg[6:])
            gen = pagegenerators.LinkedPageGenerator(page)
        elif arg == '-update':
            updateOnly = True
        elif arg == '-noconfirm':
            confirm = False
        else:
            pageTitle.append(arg)

    if pageTitle:
        page = wikipedia.Page(wikipedia.getSite(), ' '.join(pageTitle))
        gen = iter([page])

    if not gen:
        wikipedia.showHelp('szakaszszam')
    else:
        gen = pagegenerators.PreloadingGenerator(gen)
        bot = SzakaszszamBot(gen, updateOnly = updateOnly, confirm = confirm)
        bot.run()


if __name__ == "__main__":
    try:
        main()
        
    finally:
        wikipedia.stopme()