#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: Bertrand256
# Created on: 2017-04
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMessageBox, QDialog, QLayout
import hw_intf as hw_intf
import wnd_utils as wnd_utils
from app_defs import HWType
from ui import ui_hw_setup_dlg


class HwSetupDlg(QDialog, ui_hw_setup_dlg.Ui_HwSetupDlg, wnd_utils.WndUtils):
    def __init__(self, main_ui):
        QDialog.__init__(self)
        wnd_utils.WndUtils.__init__(self, main_ui.app_config)
        self.main_ui = main_ui
        self.main_ui.connect_hardware_wallet()
        self.hw_session = self.main_ui.hw_session
        self.version = '?'
        self.pin_protection = None
        self.passphrase_protection = None
        if self.hw_session and  self.hw_session.hw_client:
            self.version = hw_intf.get_hw_firmware_version(self.main_ui.hw_session)
            self.read_hw_features()
        self.setupUi()

    def setupUi(self):
        ui_hw_setup_dlg.Ui_HwSetupDlg.setupUi(self, self)
        self.setWindowTitle('Hardware Wallet Setup')
        self.lblVersion.setText(self.version)
        self.updateControlsState()
        if self.main_ui.app_config.hw_type == HWType.ledger_nano_s:
            self.lblMessage.setVisible(True)
        else:
            self.lblMessage.setVisible(False)
        self.layout().setSizeConstraint(QLayout.SetFixedSize)

    def updateControlsState(self):
        if self.hw_session and self.hw_session.hw_client:
            if self.pin_protection is True:
                self.lblPinStatus.setText('enabled')
                self.btnEnDisPin.setText('Disable')
                self.btnChangePin.setEnabled(True)
                self.lblPinStatus.setStyleSheet('QLabel{color: green}')
            elif self.pin_protection is False:
                self.lblPinStatus.setText('disabled')
                self.btnEnDisPin.setText('Enable')
                self.btnChangePin.setEnabled(False)
                self.lblPinStatus.setStyleSheet('QLabel{color: red}')
            else:
                self.lblPinStatus.setVisible(False)
                self.lblPinStatusLabel.setVisible(False)
                self.btnEnDisPin.setVisible(False)
                self.btnChangePin.setVisible(False)

            if self.passphrase_protection is True:
                self.lblPassStatus.setText('enabled')
                self.lblPassStatus.setStyleSheet('QLabel{color: green}')
                self.btnEnDisPass.setText('Disable')
            elif self.passphrase_protection is False:
                self.lblPassStatus.setText('disabled')
                self.lblPassStatus.setStyleSheet('QLabel{color: red}')
                self.btnEnDisPass.setText('Enable')
            else:
                self.lblPassStatus.setVisible(False)
                self.lblPassStatusLabel.setVisible(False)
                self.lblPassStatus.setVisible(False)
                self.btnEnDisPass.setVisible(False)

    def read_hw_features(self):
        if self.main_ui.app_config.hw_type in (HWType.trezor, HWType.keepkey):
            features = self.hw_session.hw_client.features
            self.pin_protection = features.pin_protection
            self.passphrase_protection = features.passphrase_protection

    @pyqtSlot()
    def on_btnEnDisPin_clicked(self):
        try:
            if self.hw_session and self.hw_session.hw_client:
                if self.pin_protection is True:
                    # disable
                    if self.queryDlg('Do you really want to disable PIN protection of your %s?' % self.main_ui.getHwName(),
                                     buttons=QMessageBox.Yes | QMessageBox.Cancel, default_button=QMessageBox.Cancel,
                                     icon=QMessageBox.Warning) == QMessageBox.Yes:
                        hw_intf.change_pin(self.main_ui.hw_session, remove=True)
                        self.read_hw_features()
                        self.updateControlsState()
                elif self.pin_protection is False:
                    # enable PIN
                    hw_intf.change_pin(self.main_ui.hw_session, remove=False)
                    self.read_hw_features()
                    self.updateControlsState()

        except Exception as e:
            self.errorMsg(str(e))

    @pyqtSlot()
    def on_btnChangePin_clicked(self):
        try:
            if self.hw_session and self.hw_session.hw_client and self.pin_protection is True:
                hw_intf.change_pin(self.main_ui.hw_session, remove=False)
                self.read_hw_features()
                self.updateControlsState()

        except Exception as e:
            self.errorMsg(str(e))

    @pyqtSlot()
    def on_btnEnDisPass_clicked(self):
        try:
            if self.hw_session and self.hw_session.hw_client:
                if self.passphrase_protection is True:
                    # disable passphrase
                    if self.queryDlg('Do you really want to disable passphrase protection of your %s?' % self.main_ui.getHwName(),
                                     buttons=QMessageBox.Yes | QMessageBox.Cancel, default_button=QMessageBox.Cancel,
                                     icon=QMessageBox.Warning) == QMessageBox.Yes:
                        hw_intf.enable_passphrase(self.hw_session, passphrase_enabled=False)
                        self.read_hw_features()
                        self.updateControlsState()
                elif self.passphrase_protection is False:
                    # enable passphrase
                    if self.queryDlg('Do you really want to enable passphrase protection of your %s?' % self.main_ui.getHwName(),
                                     buttons=QMessageBox.Yes | QMessageBox.Cancel, default_button=QMessageBox.Cancel,
                                     icon=QMessageBox.Warning) == QMessageBox.Yes:
                        hw_intf.enable_passphrase(self.hw_session, passphrase_enabled=True)
                        self.read_hw_features()
                        self.updateControlsState()

        except Exception as e:
            self.errorMsg(str(e))

    @pyqtSlot()
    def on_buttonBox_accepted(self):
        self.accept()