#!/usr/bin/env python

import sys
import gtk
import re
import os
import ParrotZik
import BluetoothPairedDevices

UPDATE_FREQUENCY = 30 # seconds

class ParrotZikIndicator:
    def __init__(self):

        self.menu_setup()      
                
        if sys.platform=="linux2":
            import appindicator
            self.icon_directory = os.path.sep + 'usr' + os.path.sep+ 'share' + os.path.sep+'icons' + os.path.sep+'zik'+ os.path.sep
            self.statusicon = appindicator.Indicator("new-parrotzik-indicator",
                                           "indicator-messages",
                                           appindicator.CATEGORY_APPLICATION_STATUS)
            self.statusicon.set_status(appindicator.STATUS_ACTIVE)
            self.statusicon.set_icon_theme_path(self.icon_directory)            
            self.statusicon.set_menu(self.menu)
        else:
            print "Win32"
            self.icon_directory = os.path.dirname(os.path.realpath(sys.argv[0])) + os.path.sep+ 'share' + os.path.sep+'icons' + os.path.sep+'zik'+ os.path.sep
            self.statusicon = gtk.StatusIcon()            
            self.statusicon.connect("popup-menu", self.gtk_right_click_event)
            self.statusicon.set_tooltip("Parrot Zik")
            self.menu_shown=False            
            sys.stdout = open("debug.log", "w")
            sys.stderr = open("debug.log", "w")
        
        self.setIcon("audio-headset")
        self.connected=False

        self.p = re.compile('90:03:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}')

        return

    def pos(menu, ignore, icon):
        return (Gtk.StatusIcon.position_menu(menu, icon))

    def setIcon(self,   name):
        if sys.platform=="linux2":
            self.statusicon.set_icon(name)
        else:
            self.statusicon.set_from_file(self.icon_directory+name+'.png') 

    def gtk_right_click_event(self, icon, button, time):
        if not self.menu_shown:
            self.menu_shown=True
            self.menu.popup(None, None, gtk.status_icon_position_menu, button, time, self.statusicon)
        else:
            self.menu_shown=False
            self.menu.popdown()

    def menu_setup(self):
        self.menu = gtk.Menu()

        self.info_item = gtk.MenuItem("Parrot Zik Not connected..")  
        self.info_item.set_sensitive(False)      
        self.info_item.show()
        self.menu.append(self.info_item)

        self.check = gtk.CheckMenuItem("Noise Cancellation")
        self.check.connect("activate", self.toggleANC)
        self.check.set_sensitive(False)
        self.check.show()
        self.menu.append(self.check)

        self.check2 = gtk.CheckMenuItem("Auto Connection")
        self.check2.connect("activate", self.toggleAuto)
        self.check2.set_sensitive(False)
        self.check2.show()
        self.menu.append(self.check2)

        self.check3 = gtk.CheckMenuItem("Lou Reed Mode")
        self.check3.connect("activate", self.toggleLouReedMode)
        self.check3.set_sensitive(False)
        self.check3.show()
        self.menu.append(self.check3)

        self.check4 = gtk.CheckMenuItem("Concert Hall Mode")
        self.check4.connect("activate", self.toggleLouReedMode)
        self.check4.set_sensitive(False)
        self.check4.show()
        self.menu.append(self.check4)

        self.about = gtk.MenuItem()
        self.about.set_label("About")
        self.about.connect("activate", self.show_about_dialog)
        self.about.show()
        self.menu.append(self.about)

        self.quit_item = gtk.MenuItem("Quit")
        self.quit_item.connect("activate", self.quit)
        self.quit_item.show()
        self.menu.append(self.quit_item)

    def EstablishConnection(self):
        if self.connected:
            if not self.parrot.sock:
                print "Lost connection"
                self.connected = False
            else:
                print "Connection already established"
        else:
            mac=BluetoothPairedDevices.ParrotZikMac()
            if mac:
                self.parrot = ParrotZik.ParrotZik(mac)
                if not self.parrot.sock:
                    print "Failed to connect to Parrot Zik %s" % mac
                    return False

                self.connected = True
                self.name = self.parrot.getFriendlyName()
                self.version = self.parrot.getVersion()

                self.check.set_sensitive(True)
                self.check2.set_sensitive(True)
                self.check3.set_sensitive(True)
                self.check4.set_sensitive(True)

                if self.parrot.getNoiseCancel() == "true":
                    self.check.set_active(True)
                else:
                    self.check.set_active(False)

                if self.parrot.getAutoConnection() == "true":
                    self.check2.set_active(True)
                else:
                    self.check2.set_active(False)

                if self.parrot.getLouReedMode() == "true":
                    self.check3.set_active(True)
                else:
                    self.check3.set_active(False)

                if self.parrot.getParrotConcertHall() == "true":
                    self.check4.set_active(True)
                else:
                    self.check4.set_active(False)

                self.CheckBattery()
        return True

    def toggleANC(self,widget):
        if self.connected:
            if self.check.get_active():
                self.parrot.setNoiseCancel("true")
            else:
                self.parrot.setNoiseCancel("false")

    def toggleAuto(self,widget):
        if self.connected:
            if self.check2.get_active():
                self.parrot.setAutoConnection("true")
            else:
                self.parrot.setAutoConnection("false")

    def toggleLouReedMode(self,widget):
        if self.connected:
            if self.check3.get_active():
                self.parrot.setLouReedMode("true")
            else:
                self.parrot.setLouReedMode("false")            
            if self.parrot.getLouReedMode() == "true":
                self.check3.set_active(True)
            else:
                self.check3.set_active(False)

            if self.parrot.getParrotConcertHall() == "true":
                self.check4.set_active(True)
            else:
                self.check4.set_active(False)

    def toggleParrotConcertHall(self,widget):
        if self.connected:
            if self.check4.get_active():
                self.parrot.setParrotConcertHall("true")
            else:
                self.parrot.setParrotConcertHall("false")
            
            if self.parrot.getLouReedMode() == "true":
                self.check3.set_active(True)
            else:
                self.check3.set_active(False)

            if self.parrot.getParrotConcertHall() == "true":
                self.check4.set_active(True)
            else:
                self.check4.set_active(False)

    def CheckBattery(self):
        if self.connected:
            print "Updating battery"
            self.batteryLevel = int(self.parrot.getBatteryLevel())
            
            if self.parrot.BatteryCharging:
                self.batteryLevel = "Charging"
                self.setIcon("zik-battery-charging")
                self.batteryLevel="Unknown"
                self.batteryState="Charging"
            elif self.batteryLevel>80:
                self.setIcon("zik-battery-100")
                self.batteryState="In Use"
            elif self.batteryLevel>60:
                self.setIcon("zik-battery-080")
                self.batteryState="In Use"
            elif self.batteryLevel>40:                
                self.setIcon("zik-battery-060")
                self.batteryState="In Use"
            elif self.batteryLevel>20:
                self.setIcon("zik-battery-040")
                self.batteryState="In Use"
            else:
                self.setIcon("zik-battery-low")
                self.batteryState="In Use"

            self.info_item.set_label("Connected to: "+self.name+
                                    "\nFirmware version: "+self.version+
                                    "\nState: "+self.batteryState+
                                    "\nBattery Level: "+str(self.batteryLevel))
        else:
            self.setIcon("zik-audio-headset")
            self.info_item.set_label("Parrot Zik Not connected..")
            self.check.set_sensitive(False)
            self.check2.set_sensitive(False)
            self.check3.set_sensitive(False)
            self.check4.set_sensitive(False)
        return True

    def show_about_dialog(self, widget):
        about_dialog = gtk.AboutDialog()

        about_dialog.set_destroy_with_parent(True)
        about_dialog.set_name("Parrot Zik Tray")
        about_dialog.set_version("0.1")
        about_dialog.set_authors(["Dmitry Moiseev m0sia@m0sia.ru"])
        about_dialog.run()
        about_dialog.destroy()

    def main(self):
        self.EstablishConnection()
        gtk.timeout_add(UPDATE_FREQUENCY * 1000, self.EstablishConnection)
        gtk.timeout_add(UPDATE_FREQUENCY * 1000, self.CheckBattery)
        gtk.main()       

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

if __name__ == "__main__":
    indicator = ParrotZikIndicator()
    indicator.main()