#!/usr/bin/python
"""
-ro                csak olvasás mód teszteléshez, nem módosít a lapokon
 
Ez a bot a magyar wikipédia szubcsonk lapjainak adminisztrációját
segíti. Végigmegy a {{szubcsonk}} sablonnal megjelölt szócikkeken,
csoportosítja őket aszerint, hogy a jelzést mikor helyezték el, az
eredményként kapott listát pedig kiteszi a [[Wikipédia:Szubcsonk]] lap
\"Aktuális szubcsonkok\" szakaszába. Módosítja a Szubcsonkok és a
Tennivalók-lista/szubcsonkok sablont. Pótolja a hiányzó időbélyegeket.
 
(C) Dhanak, Hunyadym, Bináris, Tgr, Dani, ato, Tacsipacsi, 2006-2023
"""
 
from pywikibot import re, datetime
import pywikibot
from pywikibot import date, pagegenerators

 
site = pywikibot.Site()
monthptrn = "(?:" + '|'.join(date.makeMonthNamedList(site.lang, '%s')) + ")"
dateptrn  = r"[0-9]{4}\. *" + monthptrn + r" *[0-9]{1,2}\."
 
 
class SzubcsonkBot:
    def __init__(self, gen, readOnly = False):
        self.gen = gen
        self.readOnly = readOnly
        self.substubs = {}
 
        self.substubRe = re.compile(r"\{\{szubcsonk\|(?:\[\[[^]]+\]\] )?(" +
                                    dateptrn + ").*?\}\}", re.IGNORECASE)
        self.fixSubstubRe = re.compile(r"(?<=\{\{szubcsonk)(?=\}\})", re.IGNORECASE)
 
    def run(self):
        self.collectStubs()
        if len(self.substubs):
            self.listStubs()
            self.chgTemplate()
 
    def collectStubs(self):
        for page in self.gen:
            try:
                self.substubs.setdefault(self.getTimestamp(page), []).append(page)
            except pywikibot.NoPage:
                pywikibot.output(u"HIBA: Nem találom a %s lapot" % page.title())
                continue
            except pywikibot.IsRedirectPage:
                continue
 
    def getTimestamp(self, page):
        unknown = "Ismeretlen"
 
        text = page.get()
        match = self.substubRe.search(text)
        if match:
            return match.group(1)
 
        if self.readOnly:
            return unknown
 
        (newText, count) = self.fixSubstubRe.subn("|~~~~~", text, count=1)
        if count == 0:
            pywikibot.output(("HIBA: A %s lapon nem találtam " +
                              "megfelelő szubcsonkjelzést") % page.title())
            return unknown
 
        page.put(newText, u"Robot: szubcsonkjelzés-időbélyeg pótlása")
 
        text = page.get(force=True)
        match = self.substubRe.search(text)
        if match:
            return match.group(1)
        else:
            pywikibot.output("HIBA: Az időbélyeget nem sikerült pótolnom")
            return unknown
 
    def shortenedMark(self, page):
        """ Vandalizmus következtében szubcsonkká vált cikkek figyelése.
        
        Ha a szubcsonk volt már a jelenlegi méretének kétszerese vagy +1000 
        byte, akkor visszaad egy figyelmeztető jelet, amit a cím mellé lehet 
        tenni. Különben üres stringet ad."""
        
        versions = list(page.revisions())
        curLength = versions[0]['size']
        sizes = [r['size'] for r in versions]
        maxLength = max(sizes)
        if maxLength >= 2 * curLength or maxLength > curLength + 1000:
          return '[[File:Ambox warning orange.svg|16px|A cikk jelentősen megrövidült!]]'
        else:
          return ''
 
 
    def listStubs(self):
        listText = u"\n"
        dates = sorted(self.substubs)
        for date in dates:
            listText += "=== %s ===\n" % date
            for page in self.substubs[date]:
                listText += "* %s%s\n" % (page.title(as_link=True), self.shortenedMark(page))
 
        pywikibot.output(listText)
 
        if not self.readOnly:
            listPage = pywikibot.Page(site, "Wikipédia:Szubcsonk")
            oldText = listPage.get()
            listRe = re.compile("(?<=" + re.escape("<!-- szubcsonklista eleje -->") +
                                ").*?(?=" + re.escape("<!-- szubcsonklista vége -->") + ")",
                                flags = re.DOTALL)
            newText = listRe.sub(listText, oldText)
            if newText != oldText:
                listPage.put(newText, "Robot: szubcsonklista frissítése")
 
    def chgTemplate(self):
        if self.readOnly:
            return
        for pageName in iter([u"Sablon:Szubcsonkok", u"Sablon:Tennivalók-lista/szubcsonkok"]):
            tmpl = pywikibot.Page(site, pageName)
            oldText = tmpl.get()
            groupRe = re.compile("(?<=" + re.escape("<!-- kezdet:") + "([<=>][0-9])" + re.escape(" -->") +
                                 ").*?(?=" + re.escape(u"<!-- vég:") + "\\1" + re.escape(" -->") + ")",
                                 flags = re.DOTALL)
            newText = groupRe.sub(self.listStubsOfGivenAge, oldText)
            if newText != oldText:
                pywikibot.showDiff(oldText, newText)
                tmpl.put(newText, u"Robot: szubcsonklista frissítése")
 
    def listStubsOfGivenAge(self, match):
        op = match.group(1)[0]
        if op == "=":
            op = "==" 
        delta = datetime.timedelta(int(match.group(1)[1]))
        today = datetime.date.today()
 
        dates = sorted(self.substubs)
        liststr = ""
        for date in dates:
            if not eval("today - str2date(date) %s delta" % op):
                continue
            for page in self.substubs[date]:
                if liststr != "":
                    liststr += ", "
                liststr += page.title(as_link=True)+self.shortenedMark(page);
 
        if liststr == "":
            liststr = "''nincs ilyen szubcsonk''"
        return liststr
 
 
def datesort(date1, date2):
    return cmp(str2date(date1), str2date(date2))
 
def monthIdx(month):
    """Hotfix for [[phab:T273573]]"""
    months = ['január', 'február', 'március', 'április',
              'május', 'június', 'július', 'augusztus',
              'szeptember', 'október', 'november', 'december']
    return months.index(month) + 1

def str2date(date):
    datere = re.compile("([0-9]{4}). (" + monthptrn + ") ([0-9]{1,2}).")
    m = datere.match(date)
    if m:
        return datetime.date(int(m.group(1)), monthIdx(m.group(2)), int(m.group(3)))
    else:
        return datetime.date.today()
 
 
def main():
    readOnly = False
    for arg in pywikibot.handle_args():
        if arg == '-ro':
            readOnly = True
        else:
            pywikibot.output("Nem várt argumentum: " + arg)
            sys.exit(1)
 
    tmpl = pywikibot.Page(site, "Sablon:Szubcsonk")
    gen = pagegenerators.PreloadingGenerator(
        tmpl.getReferences(only_template_inclusion=True))
 
    SzubcsonkBot(gen, readOnly=readOnly).run()
 
 
if __name__ == "__main__":
    try:
        main()
 
    finally:
        pywikibot.stopme()