#! /usr/bin/python
# -*- coding: utf-8 -*-

import os, sys
from Tkinter import *
from PIL import ImageTk, Image
import tkFileDialog
import tkMessageBox

import otrapps
from otrapps.gibberbot import GibberbotProperties

class MenuBar(Menu):

    def __init__(self, parent):
        Menu.__init__(self, parent)

        fileMenu = Menu(self, tearoff=False)
        self.add_cascade(label="File",underline=0, menu=fileMenu)
        fileMenu.add_command(label='Convert', underline=1, command=parent.convert)
        fileMenu.add_separator()
        fileMenu.add_command(label="Exit", underline=1, command=self.quit)

    def quit(self):
        sys.exit(0)


class App(Tk):

    def __init__(self):
        Tk.__init__(self)
        menubar = MenuBar(self)
        self.config(menu=menubar)
        self.setupwindow(self)

    def setupwindow(self, master):
        fromcolor = 'grey'
        tocolor = 'lightblue'

        self.fromframe = LabelFrame(master, text='Convert from:',
                               bg=fromcolor, padx=5, pady=5)
        self.fromframe.pack(side=TOP, padx=5, pady=5, expand=True, fill=BOTH)

        optionslist = self.detectfiles()
        if len(optionslist) == 0:
            self.show_error("No supported OTR applications found.")
            sys.exit(1)
            return
        self.fromapp = StringVar(master)
        self.fromapp.set(optionslist[0]) # initial value
        self.option = OptionMenu(self.fromframe, self.fromapp, *optionslist,
                                           command=self.select_app)
        self.option.configure(bg=fromcolor, relief=RAISED, width=20)
        self.option.pack(side=TOP)
        self.option['menu'].add_separator()
        self.option['menu'].add_command(label='Selected Folder...',
                                        command=self.select_folder)

        self.fromfolder = StringVar()
        self.fromfolder.set(self.getpath(optionslist[0]))
        self.fromentry = Entry(self.fromframe, highlightbackground=fromcolor,
                               textvariable=self.fromfolder,
                               state='readonly')
        self.fromentry.pack(side=LEFT, expand=True, fill=X)
        self.fromchoosebutton = Button(self.fromframe, text='Choose...',
                                       highlightbackground=fromcolor,
                                       command=self.choose_fromfolder,
                                       state='disabled')
        self.fromchoosebutton.pack(side=LEFT)

        self.toframe = LabelFrame(master, text='to:',
                        bg=tocolor, padx=5, pady=5)
        self.toframe.pack(side=TOP, padx=5, pady=5, expand=True, fill=BOTH)
        self.wherelabel = Label(self.toframe, text='Your converted keys will be written to:',
                           bg=tocolor)
        self.wherelabel.pack(side=TOP, expand=True, fill=X, anchor=NW)
        self.tofolder = StringVar()
        self.tofolder.set(os.path.expanduser('~/Desktop'))
        self.filenameentry = Entry(self.toframe, highlightbackground=tocolor,
                                   textvariable=self.tofolder)
        self.filenameentry.pack(side=LEFT, expand=True, fill=X)
        self.choosebutton = Button(self.toframe, text='Choose...',
                                   highlightbackground=tocolor,
                                   command=self.choose_tofolder)
        self.choosebutton.pack(side=LEFT)

        self.button = Button(master, text="Convert!", command=self.convert)
        self.button.pack(side=BOTTOM, padx=5, pady=5)

    def show_error(self, error_msg):
        print(error_msg)
        tkMessageBox.showwarning("otrfileconverter error", error_msg)
        return

    def select_app(self, app=None):
        self.fromfolder.set(self.getpath(app))
        self.fromentry.configure(state='readonly')
        self.fromchoosebutton.configure(state='disabled')

    def select_folder(self):
        self.fromapp.set('Select Folder...')
        self.fromentry.configure(state='normal')
        self.fromchoosebutton.configure(state='normal')

    def choose_fromfolder(self):
        dirname = tkFileDialog.askdirectory(initialdir=self.fromfolder.get(),
                                            title='Please select a directory')
        if len(dirname) > 0:
            self.fromfolder.set(dirname)

    def choose_tofolder(self):
        dirname = tkFileDialog.askdirectory(initialdir=self.tofolder.get(),
                                            title='Please select a directory')
        if len(dirname) > 0:
            self.tofolder.set(dirname)

    def getpath(self, app):
        '''output the standard path of a given app'''
        try:
            return otrapps.apps[app].path
        except KeyError:
            print "Invalid app: %s" % ( app )
            return None

    def detectfiles(self):
        '''detect which apps are installed based on the existence of OTR files'''
        haveapps = []
        for app in otrapps.apps:
            if os.path.exists(otrapps.apps[app].path):
                haveapps.append(app)
        return haveapps

    def convert(self):
        '''run the conversion from one file set to another'''
        app = self.fromapp.get()
        keys = None
        print 'Parsing ', app
        try:
            keys = otrapps.apps[app].parse()
        except KeyError:
            print "Invalid app: %s" % ( app )
            return None
        if keys:
            import qrcode
            import tempfile

            otrapps.make_outdir(self.tofolder.get(), '')
            GibberbotProperties.write(keys, self.tofolder.get())

            qr = qrcode.QRCode(border=4)
            qr.add_data(GibberbotProperties.password)
            qr.make(fit=True)
            img = qr.make_image()

            self.qrwindow = Toplevel(self)
            self.qrframe = Frame(self.qrwindow)
            self.qrframe.pack(side = "top", fill = "both", expand = "yes")
            pwtxt = ('Enter this password into Gibberbot: \n'
                     + GibberbotProperties.password
                     + '\nor just scan this QRCode:')
            self.pwlabel = Label(self.qrframe, text=pwtxt)
            self.pwlabel.pack(side = "top", fill = "both", expand = "yes")
            self.tkimg = ImageTk.PhotoImage(img)
            self.qrlabel = Label(self.qrframe, image=self.tkimg)
            self.qrlabel.pack(side = "bottom", fill = "both", expand = "yes")


#------------------------------------------------------------------------------#
# main

root = App()
windowingsystem = root.tk.call('tk', 'windowingsystem')

root.title('OTRConverter')
root.geometry('520x240')
root.minsize(280, 220)
root.mainloop()

