#!/usr/bin/env python.1

"""
        PyBook - Project Gutenberg e-book reader.

Usage:
    pybook.py   no args         run pybook
                -h              this help message
                -v              print version
                -r              read last book
                -d              debugging on

                -u              update list of books from PG server
                (NOTE: must be run as root as it saves to /usr/share)

 Copyright (C) 2001, 2002 Andrei Kulakov <ak@silmarill.org>
 License: GPL [see http://www.gnu.org/copyleft/gpl.html]
"""

import os 
import sys 
import time 
import avk_util
from pybookm import *

def debug(line):
    """Print line if DEBUG_ON is set to 1."""

    if conf.debugging:
        print line

def help():
    """Help screen."""

    print "\t\tPyBook help"
    for s, l, desc, _ in keymap.keys:
        if not (s or l):
            # divider
            print
        else:
            print ' '*4 + "%s, %-20s%s" % (s,l,desc)
    print """
                Vim help
    Ctrl-F or Space         page down
    Ctrl-B                  page up
    Ctrl-G                  print position in file
    /                       search
    ZZ                      exit
    :help or F1             help
    """

def init():
    """Create dirs in ~user."""

    if not os.path.exists(conf.progdir):
        os.mkdir(conf.progdir)
    if not os.path.exists(conf.local_books_path):
        os.mkdir(conf.local_books_path)
    if not os.path.exists(conf.booklist):
        print "Error: booklist file not found."
        sys.exit()
    if not os.path.exists(conf.vimrc):
        print "Error: pybook vimrc not found at this location:", conf.vimrc

def quit():
    """Save data, print time used and quit."""

    data.save()
    print avk_util.ftime(time.time() - start)
    sys.exit()


def main():
    """Main ui loop."""

    while 1:
        try: 
            line = raw_input(conf.prompt)
        except EOFError: 
            quit()
        if not line:
            pass
        if line in keymap.bindings.keys():
            keymap.bindings[line]()
        else:
            print "Unknown command."


def parse_args():
    """Parse command-line arguments."""

    a = sys.argv
    del a[0]
    if a:
        if a[0] in ("-h", "--help"):
            print __doc__
            sys.exit()
        elif a[0] in ("-v", "--version"):
            print __version__
            sys.exit()
        elif a[0] in ("-r", "--read"):
            conf.start_reading = 1
        elif a[0] in ("-u", "--update"):
            pgdb = PGDB()
            pgdb.get()
            books = pgdb.parse(conf.pgdb_f)
            pgdb.save(books)
            sys.exit()
        elif a[0] in ("-d", "--debug"):
            conf.debug = 1
        else:
            print "Error: Invalid argument."

def license():
    """Print Project Gutenberg License."""

    f = open(conf.license)
    l = f.readlines()
    h = term.size()[0]
    n = 0
    while 1:
        for line in  l[n:n + h - 2]:
            print line,
        answer = raw_input("""
------------------------------------------------------------------
(c)lose | (n)ever show again | Enter to page: """)
        if n > len(l):
            break
        if not answer:
            n = n+height-2
            if n > len(l)-2:
                print
                break
        elif answer == 'c':
            term.clear()
            break
        elif answer == 'n':
            data.show_license = 0
            term.clear()
            break

class Keymap:
    """Key bindings."""

    def init(self):
        """Initialize key map.
        
        Go through the list of mappings checking for duplicates and
        adding them to self.bindings.
        """

        self.keys = [
            # it's ok to leave '' for either short or long command
            # short command | long command | description | function
        ('a', "author",     "search by author", books.find_author),
        ('t', "title",      "search by title", books.find_title),
        ('r', "read",       "read last book", last.read),
        ('l', "last",       "list last read books", last.choose),
        ('q', "quit",       "quit pybook", quit),

        ('', '', '', None),                           # separator
        ('b', "browse",     "browse booklist", books.browse),
        ('B', "browse_authors", "browse authors", books.browse_authors),
        ('R', "random",     "read a random book", books.read_random),
        ('d', "delete",     "choose local book to delete", last.delete),
        ('h', "help",       "this help message", help),
        ]
        self.bindings = {}
        for s, l, _, func in self.keys:
            if not (self.bindings.has_key(s) or
                self.bindings.has_key(l)):
                    self.bindings[s] = func
                    self.bindings[l] = func
            else:
                print "Duplicate key binding. Edit Keymap at the top of %s" % sys.argv[0]

if __name__ == "__main__":
    init()
    term = avk_util.Term()
    parse_args()
    data = Data()
    data.load()
    if data.show_license:
        license()
    books.lst = data.booklist
    books.mk_authors_dict()
    last.lst = data.last_list
    keymap = Keymap()
    keymap.init()
    start = time.time()
    print "\t\t\tPyBook v" + conf.__version__
    print " Books in db: %d." % len(books.lst)
    print " Random book: %s." % books.pick_random()
    print "  'h' for help."
    if conf.start_reading:
        last.read()
    main()
