#!/usr/bin/python
# -*- coding: utf-8  -*-
from __future__ import generators
import login
import wikipedia, pagegenerators, catlib, config
import sys
import re

def displayPage(text):
    wikipedia.output(u'---Anteprima it.wiki------')
    wikipedia.output(text[:300])
    wikipedia.output(u'--------------------------')
    return

def findPattern(text, patterns):
    for p in patterns:
        if text.find(p)!=-1:
            wikipedia.output(u'Trovato pattern: %s' %p)
            return True
    return False
            
patterns_no = [u'{{Comune',u'{{comune', u'{{Template:Comune', u'{{Template:comune', u'{{Geobox coordinate', u'{{geobox coordinate', u'{{Geobox Coordinate', u'{{geobox Coordinate', u'{{Città', u'{{città', u'Municipalità', u'{{Aeroporto',u'{{Municipi','{{Infobox Azienda','{{S|aziende',u'{{Template:Città',u'{{disambigua}}',u'{{Disambigua}}',u'{{Frazione',u'{{Template:Frazione',u'{{frazione',u'{{Template:frazione','{{Squadra calcistica',u'#REDIRECT',u'{{Passo',u'{{Bundesland tedesco']

preTemplateEn = 70
postTemplateEn = 30

def findNo(text_it):
    return findPattern(text_it,patterns_no)

patterns_coor_it = [u'{{Coord', u'{{coord']

def findCoord(text_it):
    return findPattern(text_it,patterns_coor_it)

patterns_yes_text = [u'è un comune',u'è una città',u'è una municipalità',u'è un fiume',u'è un lago', u'è una provincia', u'è una regione', u'è un villaggio', u'è una frazione', u'è il capoluogo', u'è la capitale', u'è una cittadina', u'è un paese']

def findYesText(text_it):
    return findPattern(text_it,patterns_yes_text)

def change(page,stringa,text=''):
    global conta
    if text=='':
        text = page.get()    
    try:
        page.put(stringa + '\n' + text )
    except wikipedia.EditConflict:
        wikipedia.output(u'Skipping %s because of edit conflict' % (page.title()))
    except wikipedia.SpamfilterError, url:
        wikipedia.output(u'Cannot change %s because of blacklist entry %s' %(page.title(),url))
    conta = conta + 1
    
def svuotaCoda():
    global codaAsk
    global acceptall
    global codait
    global codaen
    global codaen_titlepage
    global codaen_context
    codaYN = []
    codatext = []
    choice = 'n'
    l = len(codaAsk)
    for i in range(0,l):
        text = codaAsk[i].get()
        codatext.append(text)
        stringatemp = u'Candidato (%d): %s' %((i+1),codaAsk[i].title())
        lunghezzatemp = len(stringatemp)                                             
        wikipedia.output(stringatemp,colors=[12]*lunghezzatemp)
        stringatemp = u'              %s' %(codaen_titlepage[i])
        lunghezzatemp = len(stringatemp)
        wikipedia.output(stringatemp,colors=[12]*lunghezzatemp)
        displayPage(text)
        colortemp = [None] * preTemplateEn + [12] * len(codaen[i]) + [None] * postTemplateEn
        wikipedia.output(u'---Contesto en.wiki-------')
        wikipedia.output(codaen_context[i],colors=colortemp)
        wikipedia.output(u'--------------------------')
        stringatemp = u'Inserisco: %s' % codait[i]
        colortemp = [None] * 11 + [12] * len(codait[i])
        wikipedia.output(stringatemp, colors=colortemp)
        choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
        codaYN.append(choice)
    for i in range(0,l):
        wikipedia.setAction(u'Aggiungo [[Template:Coord]] dalla pagina %s' %codaen_titlepage[i]  )
        if codaYN[i] in ['a', 'A']:
            acceptall = True
        if acceptall or codaYN[i] in ['y', 'Y']:
            change(codaAsk[i], codait[i], codatext[i])
        if codaYN[i] in ['n', 'N']:
            wikipedia.output(u'Non hai accettato %s' %codaen_titlepage[i])
            saveNoChanged(codaAsk[i])
    del codaAsk[0:len(codaAsk)]
    del codait[0:len(codait)]
    del codaen[0:len(codaen)]
    del codaen_titlepage[0:len(codaen_titlepage)]
    del codaen_context[0:len(codaen_context)]
    scrivistat()

def scrivistat():
    global conta
    f = file('numero_d.dat','w')
    stringa = '%d' %conta
    f.write(stringa)
    f.close()

def leggistat():
    global conta
    f = file('numero_d.dat','r')
    stringa = f.read()
    conta = int(stringa)
    f.close()

def saveLast(last):
    f = file('last','w')
    f.write((last + u'\n').encode('utf8'))
    f.close()
    wikipedia.output(u'Salvato ultimo')

def saveNoChanged(page):
    f = file('Nochanged.dat','a')
    f.write((page.aslink() + u'\n').encode('utf8'))
    f.close()  

try:
    start = []
    test = False
    acceptall = False
    codait = []
    codaen = []
    codaen_titlepage = []
    codaen_context = []
    conta = 0
    
    
    for arg in wikipedia.handleArgs():
        if arg.startswith("-test"):
            test = True
        if arg.startswith("-start:"):
            start = arg[7:]
    if start:
        start = (start);
    else:
        start = "!"
    print start

    auto = False;
    print auto;

    lenMax = 20

    sen=wikipedia.Site('en')
    sit=wikipedia.Site('it')
    login.LoginManager('la tua password', False, sit)

    #template_coor_en = wikipedia.Page(sen,'Template:Coord')
    #text_template_coor_en = template_coor_en.get()

    templateName = 'Coor dm'


    pages_with_template = pagegenerators.ReferringPageGenerator(wikipedia.Page(sen, sen.template_namespace() + ':' + templateName ), onlyTemplateInclusion = True)
    
    regex_coord_titolo = re.compile('\{\{ ?[Cc]oor([ _]dm) ?\|(.*?)\|?\}\}')
    

    patterns_title = [u'{{Coord']
    patterns_coord = [u'{{Coord', u'{{coord']
    
    patterns_yes = [u'castello', u'Castello', u'museo', u'Museo', u'contea', u'Contea', u'tomba', u'Tomba', u'palazzo', u'Palazzo', u'università', u'Università', u'Abbazia', u'abbazia', u'Voivodato', u'Gallery', u'gallery', u'Monastero', u'Chiesa', u'Cattedrale', u'Teatro', u'Parco', u'Mare', u'Mar', u'Battaglia', u'Campo', u'Giardini', u'park', u'Park', u'Stadium', u'Basilica', u'Stato', u'Hall', u'Hall',u'Canale',u'Torre',u'Theatre',u'Golfo', u'Stretto', u'College', u'Center', u'Mausoleo',u'University',u'Monte',u'Deserto',u'stato', u'teatro', u'Club', u'teatro',u'Rocca',u'Centre',u'Studios',u'Ghiacciaio',u'provincia',u'tempio',u'battaglia',u'Grattacielo',u'Circuito',u'Penisola',u'Isola',u'Lago',u'Santuario',u'Miniere',u'Stadio',u'Falls',u'Arco',u'Cascate',u'Telescopio',u'Ponte',u'Fontana',u'Villa',u'Street',u'Grotta',u'Baia',u'Bridge',u'Tower',u'Towers',u'Hills',u'fiume',u'Diga',u'Piazza',u'Laguna',u'Biblioteca',u'City',u'Padiglione',u'Giardino',u'Mura',u'Borsa',u'Grotte',u'Capo',u'Colonna',u'Reggia',u'Foro',u'Tempio',u'Carcere',u'Piramide',u'Autodromo',u'Osservatorio',u'Ghetto',u'Building',u'Island',u'Duomo',u'Museum',u'Tunnel',u'Piramidi',u'Residenza',u'Offensiva',u'Isole',u'Hôtel',u'Notre Dame',u'Universität',u'Oracolo',u'(dipartimento)',u'Cappella',u'Passo',u'Monti',u'Theater',u'Fortezza',u'Colle',u'Porta',u'Alpi',u'Provincia',u'Valle',u'Cantone',u'cantone',u'Arcipelago',u'Val',u'regione',u'distretto',u'isola']

    leggistat()
    if start!='!':
        for page_en in pages_with_template:
            wikipedia.output(u'Salto: %s' %page_en.title())
            if page_en.title() == start:
                break

    wikipedia.output(u'Parto')
    codaAsk = []
    for page_en in pages_with_template:
        if page_en.namespace()!=0:
            wikipedia.output(u'Pagina non nel namespace principale')
            continue
        interwiki_list = page_en.interwiki()
        for page_it in interwiki_list:
            if page_it.site()==sit:
                abort = False;
                wikipedia.output(u' Candidato: ')
                wikipedia.output(u'%s' % page_en.aslink(),colors=[13]*len(page_en.aslink()))
                wikipedia.output(u' italiano: ');
                wikipedia.output(u'%s' % page_it.aslink(),colors=[13]*len(page_it.aslink()))
                try:
                    text_it = page_it.get()
                    if not page_it.canBeEdited():
                        wikipedia.output(u'Skipping locked page %s' % page_it.title())
                        continue
                except wikipedia.NoPage:
                    wikipedia.output(u'Page %s not found' % page_it.title())
                    continue
                except wikipedia.IsRedirectPage:
                    wikipedia.output(u'Seguo il redirect')
                    page_it = wikipedia.Page(sit,page_it.getRedirectTarget())
                    text_it = page_it.get()
                if findCoord(text_it):
                    abort = True
                if findNo(text_it):
                    abort = True            
                if abort==False:
                    try:
                        text_en = page_en.get()
                    except wikipedia.NoPage:
                        wikipedia.output(u'Page %s not found' % page_en.title())
                        continue
                    search = regex_coord_titolo.search(text_en)
                    if search:
                        string_coord_en = text_en[search.start():search.end()]
                        string_coord_it = '{{Coord|' + search.group(2) + '|display=title}}'
                        wikipedia.setAction(u'Aggiungo [[Template:Coord]] dalla pagina %s' % page_en.aslink() )
                        if not acceptall:
                            if ( auto and (findPattern(page_it.title(),patterns_yes) or findYesText(text_it)) ):
                                wikipedia.output(u'Cambio automatico',colors=[12]*17)
                                wikipedia.output(u'Stringa originale: %s' %string_coord_en)
                                wikipedia.output(u'Stringa nuova: %s' %string_coord_it,colors=[14]*(15+len(string_coord_it)))
                                wikipedia.setAction(u'Aggiungo [[Template:Coord]] dalla pagina %s' % page_en.aslink() )
                                change(page_it,string_coord_it,text_it)
                            else:
                                wikipedia.output(u'Accodo (%d)' %(len(codaAsk)+1))
                                codaAsk.append(page_it)
                                codait.append(string_coord_it)
                                codaen.append(string_coord_en)
                                codaen_context.append(text_en[search.start()-preTemplateEn:search.end()+postTemplateEn])
                                codaen_titlepage.append(page_en.aslink())
                                if len(codaAsk) == lenMax:
                                    svuotaCoda()
                    else:
                        wikipedia.output(u'PROBLEMA: TEMPLATE NON TROVATO SULLA en')
                break
finally:
    svuotaCoda()
    saveLast(page_en.title())
    wikipedia.stopme()