# -*- 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.base import OpProgress

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

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

    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(['tdesudo', '-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(['tdesudo', '-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()
