# -*- coding: utf-8 -*-
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of 
# the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Copyright 2007-2008 Martin Böhm <martin.bohm@kubuntu.org>
# Copyright 2007-2008 Michael Anderson <nosrednaekim@gmail.com>

# a class hosting the desktop-independent methods for the Desktop
# Effects Dialog

import sys
import os
from optparse import OptionParser

# for adept batch launching
import subprocess
# for compiz-kde package checking
import apt_pkg
from apt.progress import OpProgress

import gettext
def _(str):
    return unicode(gettext.gettext(str), 'UTF-8')
def __(catalog,str):
    return unicode(gettext.dgettext(catalog, str), 'UTF-8')
def utf8(str):
  if isinstance(str, unicode):
      return str
  return unicode(str, 'UTF-8')

class DesktopEffectsCommon(object):
    def __init__(self):
        self.action = 0
        self.ibText = ""
        self.check()
        self.DATADIR = "/opt/trinity/share/apps/desktop-effects-kde/"

    def checkInstalled(self):
        progress = OpProgress()
        cache = apt_pkg.GetCache(progress)
        for pkg in cache.Packages:
            if pkg.Name == "compiz-kde-trinity":
                if pkg.CurrentVer is not None:
                    return True
        # otherwise
        return False

    def checkEnabled(self):
	    '''checks if the compizasWM file is present, and if so, reads what mode we are in'''
	    if os.path.exists(os.path.expanduser("~/.trinity/share/config/compizasWM")):
		    compizasWM = open(os.path.expanduser("~/.trinity/share/config/compizasWM"))
		    state = compizasWM.readline()
		    return state
	    else:
		    return False

    def check(self):
      ''' checks the state and changes the UI accordingly. '''
      self.installed = self.checkInstalled()
      self.enabled   = self.checkEnabled()			
      if(self.installed == True):
          self.ibText = _("&Remove Desktop Effects")
          self.showWarning()
          self.enable()
          self.pText = _("The Compiz engine is installed in your system.")
          # remove, not install
          self.rm = True
      else:
          self.pText = _("In order for Compiz Desktop Effects to work,"
                         " the Compiz engine must be installed on your system.")
          self.ibText = _("&Install Desktop Effects")
          self.hideWarning()
          self.disable()
          # install, not remove
          self.rm = False
          #self.effectsBox.setDisabled(True)

    def showWarning(self):
        ''' shows the warning information, should be implemented in the UI class '''
        raise NotImplementedError

    def hideWarning(self):
        ''' hides the warning, should be implemented in the UI class '''
        raise NotImplementedError

    def disable(self):
        ''' disables the options, should be implemented in the UI '''
        raise NotImplementedError

    def enable(self):
        ''' enables the options, should be implemented in the UI '''
        raise NotImplementedError

    def done(self):
        ''' action to be done after the user clicks the "cancel" button '''
        print "signalled" # DEBUG
        self.close()

    def apply(self):
        ''' action to be done after the user clicks the "apply button '''
        print "apply clicked" #DEBUG
        if self.action > 0:
           if self.action == 1:
			 self.disableEffects()
			 
           elif self.action == 2:
			 self.enableStandardEffects()
           elif self.action == 3:
			 self.enableExtraEffects()
           elif self.action == 4:
			 self.enableCustomEffects()
	   if not self.enabled and not self.action == 1:
		 os.spawnl(os.P_NOWAIT, "/opt/trinity/bin/compiz", "--replace")
		 self.enabled = True		  	 		 

    def btnInstallClicked(self):
        if self.installed == True:
            self.remove()
            return
        try:
            ''' Installs the Compiz package. Not very nice as it is distribution dependent. '''
            subprocess.call(['kdesudo', '-c' '/opt/trinity/bin/adept_batch install compiz-kde-trinity compiz-fusion-plugins-main-trinity compiz-fusion-plugins-extra-trinity'])
        except:
            subprocess.call(['kdialog', '--sorry', 'Adept Batch is not installed on this system'])
        self.check()


    # the functions toggled by radio boxes
    def noEffects(self):
        print "radio toggled" # DEBUG
        self.action = 1
#        self.apply()
    def standardEffects(self):
        print "radio toggled" # DEBUG
        self.action = 2
#        self.apply()
    def extraEffects(self):
        print "radio toggled" # DEBUG
        self.action = 3
    def customEffects(self):
        print "radio toggled" # DEBUG
        self.action = 4
#        self.apply()

    def remove(self):
        removeAnswer = subprocess.call(['kdialog', "--warningyesno", "Are you sure you wish to remove Compiz KDE?"])
        if removeAnswer == 0:
            try:
                ''' Remove the Compiz package. Not very nice as it is distribution dependent. '''
                subprocess.call(['kdesudo', '-c' '/opt/trinity/bin/adept_batch remove compiz-kde-trinity compiz-fusion-plugins-main-trinity compiz-fusion-plugins-extra-trinity'])
            except:
                subprocess.call(['kdialog', '--sorry', 'Adept Batch is not installed on this system'])
			 	 

    def disableEffects(self):
	    '''remove compiz as the default WM'''
	    os.remove(os.path.expanduser("~/.trinity/share/config/compizasWM"))
	    self.enabled = False 

    
    def enableStandardEffects(self):
	    '''copy the .ini to Default.ini and enable compiz as default WM'''
	    code = os.system('mkdir -p ~/.config/compiz/compizconfig')
	    try:
	    		enable = open(os.path.expanduser("~/.trinity/share/config/compizasWM"),"w")
	    		if enable.readline() == "custom":
	    			customeffects = open(os.path.expanduser("~/.config/compiz/compizconfig/Default.ini"),"r")
				backupfile = open(os.path.expanduser("~/.config/compiz/compizconfig/Custom.ini"),"w")
				backupfile.write(customeffects)
				backupfile.close()
				customeffects.close()
	    except:
			print "error"		
	    enable.write("standardeffects")
	    enable.close()
	    config = open(os.path.join(self.DATADIR,"MediumEffects.ini"),"r")
	    dest = open(os.path.expanduser("~/.config/compiz/compizconfig/Default.ini"),"w")
	    dest.write(config.read())
	    dest.close()
	    config.close()
	    print "standardEffects enabled" #DEBUG
	    
    def enableExtraEffects(self):
	    ''' copy the extraeffects.ini to Default.ini and enable compiz as defaultWM'''
	    code = os.system('mkdir -p ~/.config/compiz/compizconfig')
	    if os.path.exists(os.path.expanduser("~/.trinity/share/config/compizasWM")):
	    		enable = open(os.path.expanduser("~/.trinity/share/config/compizasWM"),"r")
	    		if enable.readline() == "custom":
	    			customeffects = open(os.path.expanduser("~/.config/compiz/compizconfig/Default.ini"),"r")
				backupfile = open(os.path.expanduser("~/.config/compiz/compizconfig/Custom.ini"),"w")
				backupfile.write(customeffects)
				backupfile.close()
				customeffects.close()
				enable.close()

	    enable = open(os.path.expanduser("~/.trinity/share/config/compizasWM"),"w")	
	    enable.write("extraeffects")
	    enable.close()
	    config = open(os.path.join(self.DATADIR,"HighEffects.ini"),"r")
	    dest = open(os.path.expanduser("~/.config/compiz/compizconfig/Default.ini"),"w")
	    dest.write(config.read())
	    dest.close()
	    config.close()
	    print "extraEffects enabled" #DEBUG
	    
    def enableCustomEffects(self):
	    code = os.system('mkdir -p ~/.config/compiz/compizconfig')
	    try:
		    config = open(os.path.expanduser("~/.config/compiz/compizconfig/Custom.ini"),"r")
	    except:
		    print "no custom effects file, creating blank .ini" #DEBUG
		    config = open(os.path.join(self.DATADIR,"BlankEffects.ini"),"r")
	    enable = open(os.path.expanduser("~/.trinity/share/config/compizasWM"),"w")
	    enable.write("custom")
	    enable.close()	    
	    dest = open(os.path.expanduser("~/.config/compiz/compizconfig/Default.ini"),"w")
	    dest.write(config.read())
	    dest.close()
	    config.close()
