# -*- coding: utf-8 -*-
#
# (c) Copyright 2011-2015 HP Development Company, L.P.
#
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
#
# Authors: Amarnath Chitumalla
#

#global
import os
import os.path
import sys
import signal

# Local
from base.g import *
from base import utils
from prnt import cups
from base.codes import *
from base import validation
from .ui_utils import *


# Qt
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
HPLIP_INFO_SITE ="http://hplip.sourceforge.net/hplip_web.conf"

class Ui_Dialog(object):
    def setupUi(self, Dialog, printerName, device_uri,Error_msg):
        Dialog.setObjectName("Dialog")
        Dialog.resize(700, 180)
        self.printerName=printerName
        self.device_uri=device_uri
        self.Error_msg=Error_msg
        self.gridlayout = QGridLayout(Dialog)
        self.gridlayout.setObjectName("gridlayout")
        self.StackedWidget = QStackedWidget(Dialog)
        self.StackedWidget.setObjectName("StackedWidget")
        self.page = QWidget()
        self.page.setObjectName("page")
        self.gridlayout1 = QGridLayout(self.page)
        self.gridlayout1.setObjectName("gridlayout1")
        self.label = QLabel(self.page)
        font = QFont()
        font.setPointSize(16)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridlayout1.addWidget(self.label, 0, 0, 1, 1)
        self.line = QFrame(self.page)
        self.line.setFrameShape(QFrame.HLine)
        self.line.setFrameShadow(QFrame.Sunken)
        self.line.setObjectName("line")
        self.gridlayout1.addWidget(self.line, 1, 0, 1, 2)
        self.TitleLabel = QLabel(self.page)
        self.TitleLabel.setWordWrap(True)
        self.TitleLabel.setObjectName("TitleLabel")
        self.gridlayout1.addWidget(self.TitleLabel, 2, 0, 1, 2)
        spacerItem = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
        spacerItem2 = QSpacerItem(200, 51, QSizePolicy.Minimum, QSizePolicy.Expanding)
        self.gridlayout1.addItem(spacerItem2, 5, 1, 1, 1)
        self.StackedWidget.addWidget(self.page)
        self.gridlayout.addWidget(self.StackedWidget, 0, 0, 1, 5)
        self.line_2 = QFrame(Dialog)
        self.line_2.setFrameShape(QFrame.HLine)
        self.line_2.setFrameShadow(QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.gridlayout.addWidget(self.line_2, 1, 0, 1, 4)
        self.NextButton = QPushButton(Dialog)
        self.NextButton.setObjectName("NextButton")
        self.gridlayout.addWidget(self.NextButton, 2, 3, 1, 1)
        self.CancelButton = QPushButton(Dialog)
        self.CancelButton.setObjectName("CancelButton")
        self.gridlayout.addWidget(self.CancelButton, 2, 4, 1, 1)

        self.retranslateUi(Dialog)
        self.StackedWidget.setCurrentIndex(0)
        QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        if self.Error_msg ==  QUEUES_SMART_INSTALL_ENABLED:
            Dialog.setWindowTitle(QApplication.translate("Dialog", "HP SmartInstall/Mass storage Disabler", None))
        else:
            Dialog.setWindowTitle(QApplication.translate("Dialog", "HP Device Manager - Queues diagnose", None))
        if self.Error_msg == QUEUES_PAUSED:
            self.label.setText(QApplication.translate("Dialog", "Print/Fax Queue is Paused", None))
        elif self.Error_msg ==  QUEUES_SMART_INSTALL_ENABLED:
            self.label.setText(QApplication.translate("Dialog", "Smart Install Device(s) Detected", None))
        else:
            self.label.setText(QApplication.translate("Dialog", "Queue needs to be reconfigured", None))
            
        if self.Error_msg ==  QUEUES_SMART_INSTALL_ENABLED:
            text= "Smart Install is enabled in "+ self.printerName + " device(s). \nDo you want to download and disable smart install to perform device functionalities?"
        elif self.Error_msg == QUEUES_INCORRECT_PPD:
            text= "'"+ self.printerName + "' is using incorrect PPD file. Do you want to remove and reconfigure queue?"
        elif self.Error_msg == QUEUES_PAUSED:
            text="'"+ self.printerName + "' is paused. Do you want to enable queue?"
        elif self.Error_msg == QUEUES_CONFIG_ERROR:
            text="'"+ self.printerName + "' is not configured using hp-setup utility. Click 'Remove and Setup' to remove and reconfigure queue."

        if self.Error_msg != QUEUES_MSG_SENDING:
            self.TitleLabel.setText(QApplication.translate("Dialog", text, None))
#            if self.Error_msg == QUEUES_PAUSED or self.Error_msg == QUEUES_INCORRECT_PPD or self.Error_msg ==  QUEUES_SMART_INSTALL_ENABLED:
            if self.Error_msg == QUEUES_PAUSED or self.Error_msg == QUEUES_INCORRECT_PPD:
                self.NextButton.setText(QApplication.translate("Dialog", "Yes", None))
                self.CancelButton.setText(QApplication.translate("Dialog", "No", None))

            elif self.Error_msg ==  QUEUES_SMART_INSTALL_ENABLED:
                self.NextButton.setText(QApplication.translate("Dialog", "Download and Disable", None))
                self.CancelButton.setText(QApplication.translate("Dialog", "Cancel", None))

            else:
                self.NextButton.setText(QApplication.translate("Dialog", "Remove and Setup", None))
                self.CancelButton.setText(QApplication.translate("Dialog", "Cancel", None))


# Ui

class QueuesDiagnose(QDialog, Ui_Dialog):
    def __init__(self, parent, printerName, device_uri, Error_msg,passwordObj=None):
        QDialog.__init__(self, parent)
        self.result = False
        self.printerName = printerName
        self.device_uri = device_uri
        self.Error_msg = Error_msg
        self.passwordObj = passwordObj
        self.setupUi(self, self.printerName, self.device_uri,self.Error_msg)
        self.user_settings = UserSettings()
        self.user_settings.load()
        self.user_settings.debug()

        self.initUi()

    def init(self, printerName, device_uri, Error_msg):
        QDialog.__init__(self,None)
        self.printerName = printerName
        self.device_uri = device_uri
        self.Error_msg = Error_msg
        self.setupUi(self, printerName, device_uri,Error_msg)
        self.user_settings = UserSettings()
        self.user_settings.load()
        self.user_settings.debug()

        self.initUi()


    def initUi(self):
        # connect signals/slots
        self.CancelButton.clicked.connect(self.CancelButton_clicked)
        self.NextButton.clicked.connect(self.NextButton_clicked)
        signal.signal(signal.SIGINT, signal.SIG_DFL)

        # Application icon
        self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))


    #
    # Misc
    #
    def displayPage(self, page):
        self.updateStepText(page)
        self.StackedWidget.setCurrentIndex(page)

    def CancelButton_clicked(self):
        self.close()


    def NextButton_clicked(self):
        beginWaitCursor()
        try:
            if self.Error_msg ==  QUEUES_SMART_INSTALL_ENABLED:
                self.disable_smart_install()

            elif  self.Error_msg == QUEUES_PAUSED:
                cups.enablePrinter(self.printerName)
                msg ="'"+self.printerName+"' is enabled successfully"
                SuccessUI(self, self.__tr(msg))

            else:
                status, status_str = cups.cups_operation(cups.delPrinter, GUI_MODE, 'qt4', self, self.printerName)

                if status != cups.IPP_OK:
                    msg="Failed to remove ' "+self.printerName+" ' queue.\nRemove using hp-toolbox..."
                    FailureUI(self, self.__tr(msg))
                else:
                    msg="' "+self.printerName+" ' removed successfully.\nRe-configuring this printer by hp-setup..."
                    log.debug(msg)
                    path = utils.which('hp-setup')
                    if path:
                        log.debug("Starting hp-setup")
                        utils.run('hp-setup --gui')

        finally:
            endWaitCursor()
        self.result = True
        self.close()

    def showMessage(self,msg):
        FailureUI(self, self.__tr(msg))

    def showSuccessMessage(self,msg):
        SuccessUI(self, self.__tr(msg))

    def __tr(self,s,c = None):
        return qApp.translate("PluginDialog",s,c)


    def disable_smart_install(self):
        if not utils.check_network_connection():
            FailureUI(self, queryString(ERROR_NO_NETWORK))
        else:
            sts, HPLIP_file = utils.download_from_network(HPLIP_INFO_SITE)
            if sts == 0:
                hplip_si_conf = ConfigBase(HPLIP_file)
                source = hplip_si_conf.get("SMART_INSTALL","url","")
                if not source :
                    FailureUI(self, queryString(ERROR_FAILED_TO_DOWNLOAD_FILE, 0, HPLIP_INFO_SITE))
                    return 

            response_file, smart_install_run = utils.download_from_network(source)
            response_asc, smart_install_asc = utils.download_from_network(source+'.asc')
            
            if response_file == 0   and response_asc == 0:

                gpg_obj = validation.GPG_Verification()
                digsig_sts, error_str = gpg_obj.validate(smart_install_run, smart_install_asc)

                if ERROR_SUCCESS == digsig_sts:
                    sts, out = utils.run("sh %s"%smart_install_run)
                else:
                
                    if QMessageBox.question(self, " ",
                        self.__tr("<b>%s</b><p>Without this, it is not possible to authenticate and validate this tool prior to installation.</p>Do you still want to run Smart Install disabler?" %error_str),
                                            QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes:
                        # Disabling without verification.
                        sts, out = utils.run("sh %s"%smart_install_run)

            else:
                if response_asc:
                    FailureUI(self, queryString(ERROR_FAILED_TO_DOWNLOAD_FILE, 0, source + ".asc"))
                else:
                    FailureUI(self, queryString(ERROR_FAILED_TO_DOWNLOAD_FILE, 0, source))


