
import os, sys
from PyQt4 import QtGui, QtCore
from um import UMWrapper

class UMCheckThread(QtCore.QThread):

  def __init__(self, um_wrapper):
    QtCore.QThread.__init__(self)
    self.um_wrapper = um_wrapper

  def run(self):
    self.um_wrapper.check()

class UMApplyThread(QtCore.QThread):

  def __init__(self, um_wrapper):
    QtCore.QThread.__init__(self)
    self.um_wrapper = um_wrapper

  def run(self):
    self.um_wrapper.manage()

class CUpdateManager(QtCore.QThread):

  restart_requested = QtCore.pyqtSignal()
  manage_requested = QtCore.pyqtSignal()
  manage_started = QtCore.pyqtSignal()

  def __init__(self):
    QtCore.QThread.__init__(self)
    self.um_wrapper = UMWrapper()
    self.check_thread = UMCheckThread(self.um_wrapper)
    self.apply_thread = UMApplyThread(self.um_wrapper)
    self.check_thread.finished.connect(self.apply)
    self.manage_requested.connect(self.apply)
    self.manage_started.connect(self.apply_thread.start)
    self.apply_thread.finished.connect(self.prepare_restart)
    self.init = True
    self.lock = True
    self.first = True
    self.mutex = QtCore.QMutex()

  def check(self):
    mutex_locker = QtCore.QMutexLocker(self.mutex)
    if self.init:
      self.init = False
      QtCore.QTimer.singleShot(1000, self.check_thread.start)

  def is_unlocked(self):
    return not self.lock

  def manage(self):
    mutex_locker = QtCore.QMutexLocker(self.mutex)
    if not self.lock:
      self.lock = True
      self.manage_requested.emit()

  def apply(self):
    if not self.first or self.um_wrapper.new_available():
      msg = self.um_wrapper.msg_manage(self.first)
      qbox = QtGui.QMessageBox()
      qbox.setWindowTitle(msg[0])
      qbox.setText('<b><font size="+1">%s</font></b>' %msg[1])
      qbox.setInformativeText('\n\n'.join(msg[2]))
      qbox.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
      if self.um_wrapper.can_manage():
        qbox.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        qbox.setDefaultButton(QtGui.QMessageBox.Yes)
        qbox.setIcon(QtGui.QMessageBox.Question)

      else:
        qbox.setStandardButtons(QtGui.QMessageBox.Ok)
        qbox.setDefaultButton(QtGui.QMessageBox.Ok)
        qbox.setIcon(QtGui.QMessageBox.Information)

      if qbox.exec_() == QtGui.QMessageBox.Yes:
        self.manage_started.emit()

      else:
        self.lock = False

    else:
      self.lock = False

    self.first = False

  def prepare_restart(self):
      if self.um_wrapper.updates_applied:
        msg = self.um_wrapper.msg_restart()
        summary = '<b><font size="+1">%s</font></b>' %msg[1]
        QtGui.QMessageBox.information(None, msg[0], summary)
        QtCore.QCoreApplication.instance().aboutToQuit.connect(self.restart)
        self.restart_requested.emit()

      else:
        self.lock = False

  def restart(self):
    browser_path = os.path.join(os.environ['CCP4I2'], 'bin', 'browser.py')
    QtCore.QProcess.startDetached(sys.executable, [browser_path])

um = CUpdateManager()

