#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件    :led.py
@时间    :2022/01/14 09:31:20
@作者    :None
@版本    :2.0
@说明    :LED灯
'''


# from numpy import array, uint8
from utils.qt import QApplication, QColor, QSize, QPushButton


class Led(QPushButton):
    black = QColor(0x00, 0x00, 0x00)
    white = QColor(0xff, 0xff, 0xff)
    blue = QColor(0x73, 0xce, 0xf4)
    green = QColor(0xad, 0xff, 0x2f)
    orange = QColor(0xff, 0xa5, 0x00)
    purple = QColor(0xaf, 0x00, 0xff)
    red = QColor(0xf4, 0x37, 0x53)
    yellow = QColor(0xff, 0xff, 0x00)

    capsule = 1
    circle = 2
    rectangle = 3

    def __init__(self, parent, first_color=green, second_color=red, third_color=yellow, off_color=black, shape=circle):
        super().__init__()

        self._qss = 'QPushButton {{ \
                                   border: 3px solid lightgray; \
                                   border-radius: {}px; \
                                   background-color: \
                                       QLinearGradient( \
                                           y1: 0, y2: 1, \
                                           stop: 0 white, \
                                           stop: 0.2 #{}, \
                                           stop: 0.8 #{}, \
                                           stop: 1 #{} \
                                       ); \
                                 }}'
        self._first_qss = ''
        self._second_qss = ''
        self._third_qss = ''
        self._off_qss = ''

        self._status = 0
        self._end_radius = 0

        # Properties that will trigger changes on qss.
        self.__first_color = None
        self.__second_color = None
        self.__third_color = None
        self.__off_color = None
        self.__shape = None
        self.__height = 0

        self._first_color = first_color
        self._second_color = second_color
        self._third_color = third_color
        self._off_color = off_color
        self._shape = shape
        self._height = self.sizeHint().height()

    # =================================================== Reimplemented Methods
    def sizeHint(self):
        res_h = QApplication.desktop().screenGeometry().height()
        # res_w = QApplication.desktop().screenGeometry().width()

        # res_w, res_h = pyautogui.size()  # Available resolution geometry
        if self._shape == Led.capsule:
            base_w = 50
            base_h = 30
        elif self._shape == Led.circle:
            base_w = 30
            base_h = 30
        elif self._shape == Led.rectangle:
            base_w = 40
            base_h = 30

        width = int(base_w * res_h / 1080)
        height = int(base_h * res_h / 1080)
        return QSize(width, height)

    def resizeEvent(self, event):
        self._height = self.size().height()
        QPushButton.resizeEvent(self, event)

    def setFixedSize(self, width, height):
        self._height = height
        if self._shape == Led.circle:
            QPushButton.setFixedSize(self, height, height)
        else:
            QPushButton.setFixedSize(self, width, height)

    # ============================================================== Properties
    # 一级故障
    @property
    def _first_color(self):
        return self.__first_color

    @_first_color.setter
    def _first_color(self, color):
        self.__first_color = color
        self._update_first_qss()

    @_first_color.deleter
    def _first_color(self):
        del self.__first_color

    # 二级故障
    @property
    def _second_color(self):
        return self.__second_color

    @_second_color.setter
    def _second_color(self, color):
        self.__second_color = color
        self._update_second_qss()

    @_second_color.deleter
    def _second_color(self):
        del self.__second_color

    # 三级故障
    @property
    def _third_color(self):
        return self.__third_color

    @_third_color.setter
    def _third_color(self, color):
        self.__third_color = color
        self._update_third_qss()

    @_third_color.deleter
    def _third_color(self):
        del self.__third_color

    # 无故障
    @property
    def _off_color(self):
        return self.__off_color

    @_off_color.setter
    def _off_color(self, color):
        self.__off_color = color
        self._update_off_qss()

    @_off_color.deleter
    def _off_color(self):
        del self.__off_color

    @property
    def _shape(self):
        return self.__shape

    @_shape.setter
    def _shape(self, shape):
        self.__shape = shape
        self._update_end_radius()
        self._update_first_qss()
        self._update_second_qss()
        self._update_third_qss()
        self._update_off_qss()
        self.set_status(self._status)

    @_shape.deleter
    def _shape(self):
        del self.__shape

    @property
    def _height(self):
        return self.__height

    @_height.setter
    def _height(self, height):
        self.__height = height
        self._update_end_radius()
        self._update_first_qss()
        self._update_second_qss()
        self._update_third_qss()
        self._update_off_qss()
        self.set_status(self._status)

    @_height.deleter
    def _height(self):
        del self.__height

    # ================================================================= Methods
    def _update_first_qss(self):
        color, grad = self._get_gradient(self.__first_color)
        self._first_qss = self._qss.format(self._end_radius, grad, color, color)

    def _update_second_qss(self):
        color, grad = self._get_gradient(self.__second_color)
        self._second_qss = self._qss.format(self._end_radius, grad, color, color)

    def _update_third_qss(self):
        color, grad = self._get_gradient(self.__third_color)
        self._third_qss = self._qss.format(self._end_radius, grad, color, color)

    def _update_off_qss(self):
        color, grad = self._get_gradient(self.__off_color)
        self._off_qss = self._qss.format(self._end_radius, grad, color, color)

    def _get_gradient(self, color):
        grad = QColor(int((self.white.red() - color.red()) / 2) + color.red(), int((self.white.green() - color.green()) / 2) + color.green(), int((self.white.blue() - color.blue()) / 2) + color.blue())
        grad = '{:02X}{:02X}{:02X}'.format(grad.red(), grad.green(), grad.blue())
        color = '{:02X}{:02X}{:02X}'.format(color.red(), color.green(), color.blue())
        return color, grad

    def _update_end_radius(self):
        if self.__shape == Led.rectangle:
            self._end_radius = int(self.__height / 10)
        else:
            self._end_radius = int(self.__height / 2)

    def _toggle_first(self):
        self.setStyleSheet(self._first_qss)

    def _toggle_second(self):
        self.setStyleSheet(self._second_qss)

    def _toggle_third(self):
        self.setStyleSheet(self._third_qss)

    def _toggle_off(self):
        self.setStyleSheet(self._off_qss)

    def set_first_color(self, color):
        self._first_color = color

    def set_second_color(self, color):
        self._second_color = color

    def set_third_color(self, color):
        self._third_color = color

    def set_off_color(self, color):
        self._off_color = color

    def set_shape(self, shape):
        self._shape = shape

    def set_status(self, status):
        self._status = status
        if self._status == 0:
            self._toggle_off()
        elif self._status == 1:
            self._toggle_first()
        elif self._status == 2:
            self._toggle_second()
        else:
            self._toggle_third()
