#!/usr/bin/env python

import Ft.Xml
from Ft.Xml import EMPTY_NAMESPACE
import sys

books = [
    'Genesis',
    'Exodus',
    'Leviticus',
    'Numbers',
    'Deuteronomy',
    'Joshua',
    'Judges',
    'Ruth',
    'Samuel_1',
    'Samuel_2',
    'Kings_1',
    'Kings_2',
    'Chronicles_1',
    'Chronicles_2',
    'Ezra',
    'Nehemiah',
    'Esther',
    'Job',
    'Psalms',
    'Proverbs',
    'Ecclesiastes',
    'Song_of_Songs',
    'Isaiah',
    'Jeremiah',
    'Lamentations',
    'Ezekiel',
    'Daniel',
    'Hosea',
    'Joel',
    'Amos',
    'Obadiah',
    'Jonah',
    'Micah',
    'Nahum',
    'Habakkuk',
    'Zephaniah',
    'Haggai',
    'Zechariah',
    'Malachi',
];

class Reader:
    def __init__(self):
        self.book_number = -1 # hack
        self.books_data = []

    def read(self):
        v = None
        while 1:
            if not v:
                self.book_number = self.book_number + 1
                if self.book_number >= len(books): return
                doc = Ft.Xml.Parse("WLC/"+self.book_name()+".xml")
                v = doc.xpath(u'/Tanach/tanach/book/c/v[1]')[0]
                name_full = doc.xpath(u'/Tanach/tanach/book/names/name/text()')[0].data
                name_abbr = doc.xpath(u'/Tanach/tanach/book/names/abbrev/text()')[0].data
                self.books_data.append({'full': name_full, 'abbr': name_abbr})
            self.process_verse(v)
            # Go to the next verse
            v1 = v.xpath(u"following-sibling::v[1]")
            if v1:
                v = v1[0]
            else:
                v1 = v.xpath(u"../following-sibling::c[1]/v[1]")
                if v1:
                    v = v1[0]
                else:
                    v = None

    def book_name(self):
        return books[self.book_number]

class TextItem: pass

class Word(TextItem):
    def __init__(self,w):
        self.value = w

class Samekh(TextItem): pass

class Pe(TextItem): pass

class VerseMark:
    def __init__(self, book_number, chap, verse):
        self.book_number, self.chap, self.verse = book_number, chap, verse
    def book_name(self):
        return books[self.book_number]
    def chap_and_verse(self):
        return str(self.chap) + ':' + str(self.verse)
    def __str__(self):
        return self.book_name() + ' ' + self.chap_and_verse()

class Verse:
    def __init__(self, book_number, chap, verse):
        self.mark = VerseMark(book_number, chap, verse)
        self.list = []
    def book_name(self):
        return self.mark.book_name();
    def chap_and_verse(self):
        return self.mark.chap_and_verse();

def clean_word(w):
    res = ""
    for c in w:
        if c >= u"\u05D0" and c <= u"\u05EA":
            res = res + c
    return res

class MyReader(Reader):
    def __init__(self):
        Reader.__init__(self)
        self.verses = []

    def process_verse(self, v):
        chap = v.parentNode.getAttributeNS(EMPTY_NAMESPACE, 'n')
        verse = v.getAttributeNS(EMPTY_NAMESPACE, 'n')
        verse_obj = Verse(self.book_number, chap, verse)
        items = v.xpath(u'w|pe|samekh')
        for i in items:
            if i.tagName == u'pe':
                verse_obj.list.append(Pe())
            elif i.tagName == u'samekh':
                verse_obj.list.append(Samekh())
            elif i.tagName == u'w':
                childs = i.xpath(u'.//text()')
                str = [c.data for c in childs]
                word = clean_word("".join(str))
                verse_obj.list.append(Word(word))
        self.verses.append(verse_obj)

reader = MyReader()
reader.read()
#print reader.parashot

def wiki_title(v):
    #book_data = reader.books_data[par.start.book_number]
    return 'Tanakh:' + reader.books_data[v.mark.book_number]['full'] + " " + v.mark.chap_and_verse();

def format_verse(verse):
    p = u'<sup class="verse-number">' + verse.chap_and_verse() + u'</sup>'
    for elem in verse.list:
        if isinstance(elem, Word):
            word = elem.value
            p = p + u'[[Hebrew:'+ word + u'|' + word + u']] '
        elif isinstance(elem, Samekh):
            p = p + u'| '
        elif isinstance(elem, Pe):
            p = p + u'|| '
    if p[-1] == u' ': p = p[:-1]
    return p

# Write actual paragraph wiki files
for i in range(len(reader.verses)):
    verse = reader.verses[i]
    book_data = reader.books_data[verse.mark.book_number]
    filename = wiki_title(verse)
    #print verse.chap_and_verse()
    title = book_data['full'] + ' ' + verse.chap_and_verse()
    p = u""
    if i > 0 and verse.mark.book_number == reader.verses[i - 1].mark.book_number:
        p = p + u'<span class="next-prev-addon">' + format_verse(reader.verses[i - 1]) + u'</span> '
    p = p + format_verse(verse)
    if i < len(reader.verses) - 1 and verse.mark.book_number == reader.verses[i + 1].mark.book_number:
        p = p + u' <span class="next-prev-addon">' + format_verse(reader.verses[i + 1]) + u'</span>'

    if i > 0:
        prev = u'[[' + wiki_title(reader.verses[i-1]) + u'|Previous]]'
    else:
        prev = ""
    if i < len(reader.verses) - 1:
        next = u'[[' + wiki_title(reader.verses[i+1]) + u'|Next]]'
    else:
        next = ""

    if prev != "" and next != "":
        prev_next = prev + ' ' + next
    elif prev != "":
        prev_next = prev
    elif next != "":
        prev_next = next

    exegesis_link = 'Exegesis:' + book_data['full'] + ' ' + verse.chap_and_verse()
    fmt = u"""<noinclude>
{prev_next}
</noinclude>

<div dir="rtl">
{par}
</div>

<noinclude>
[[{exegesis_link}|Exegesis]]
</noinclude>
"""
    wiki = fmt.format(title=title, prev_next=prev_next, par=p, exegesis_link=exegesis_link)

    file = open('out/'+filename, 'w')
    file.write(wiki.encode('utf-8'))
    file.close()

book_ranges = [[] for i in books]
for p in reader.verses:
    book_ranges[p.mark.book_number].append(p)
for i in range(len(books)):
    book_data = reader.books_data[i]
    book_name = book_data['full']
    file = open('out/TanakhIndex:'+book_name, 'w')
    file.write("=Tanakh book: " + book_name + "=")
    for r in book_ranges[i]:
        text = book_data['abbr'] + ' ' + r.chap_and_verse()
        link = wiki_title(r)
        file.write("\n\n[["+link+"|"+text+"]]")
    file.close()

file = open('out/TanakhIndex', 'w')
file.write("=Tanakh books=")
for i in range(len(books)):
    book_data = reader.books_data[i]
    book_name = book_data['full']
    file.write('\n\n[[TanakhIndex:'+book_name+'|'+book_name+']]')
file.close()