import logging
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5 import QtWidgets
import mc.mc_global
import mc.gui.breathing_dlg

BAR_WIDTH_FT = 24.0
LARGE_MARGIN_FT = 10.0
SMALL_MARGIN_FT = 2.0
POINT_SIZE_INT = 16
GRADIENT_IN_FT = 120.0
GRADIENT_OUT_FT = 150.0


class BreathingHistoryWt(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.show()
        self.setMinimumHeight(300)

        self.ib_qtimer = None
        self.ob_qtimer = None
        self.updating_gui_bool = False
        self.new_cycle_bool = True

        self.in_breath_graphics_qgri_list = []
        self.out_breath_graphics_qgri_list = []

        vbox_l2 = QtWidgets.QVBoxLayout()
        self.setLayout(vbox_l2)

        # vbox_l2.addWidget(QtWidgets.QLabel("Breathing History"))
        self.breathing_graphicsview = QtWidgets.QGraphicsView()  # QGraphicsScene
        vbox_l2.addWidget(self.breathing_graphicsview)
        self.breathing_graphicsscene = QtWidgets.QGraphicsScene()
        self.breathing_graphicsview.setScene(self.breathing_graphicsscene)
        # self.breathing_graphicsview.centerOn(QtCore.Qt.AlignRight)
        # alignment can be set with "setAlignment"
        self.breathing_graphicsview.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag)

    def add_from_dialog(self, i_ilist, i_olist):
        self.new_cycle_bool = True

        for in_length_ft, out_length_ft in zip(i_ilist, i_olist):
            # -using ob here ensures that we only add when there are complete breathing cycles
            self.add_new_breathing_rect(
                mc.mc_global.BreathingState.breathing_in,
                10 * in_length_ft,
            )
            self.add_new_breathing_rect(
                mc.mc_global.BreathingState.breathing_out,
                10 * out_length_ft,
            )
            logging.debug("in and out length = " + str(in_length_ft) + ", " + str(out_length_ft))
        self.new_cycle_bool = True

    def add_new_breathing_rect(self, i_io: mc.mc_global.BreathingState, i_length: int=1):
        if i_io == mc.mc_global.BreathingState.breathing_out:
            self.new_cycle_bool = False

        # Rectangle
        xpos_ft = 0.0
        if len(self.in_breath_graphics_qgri_list) > 0:
            margin_int = SMALL_MARGIN_FT
            if self.new_cycle_bool:
                margin_int = LARGE_MARGIN_FT
            last_graphics_rect_item = self.in_breath_graphics_qgri_list[-1]
            xpos_ft = float(last_graphics_rect_item.rect().right() + margin_int)
            if i_io == mc.mc_global.BreathingState.breathing_out:
                xpos_ft = float(last_graphics_rect_item.rect().left())
        ypos_ft = -i_length
        if i_io == mc.mc_global.BreathingState.breathing_out:
            ypos_ft = 0.0

        t_drawrect = QtCore.QRectF(xpos_ft, ypos_ft, BAR_WIDTH_FT, i_length)

        # Gradient
        x_gradient = t_drawrect.x() - GRADIENT_IN_FT
        if i_io == mc.mc_global.BreathingState.breathing_out:
            x_gradient = t_drawrect.x() + GRADIENT_OUT_FT
        t_start_qpointf = QtCore.QPointF(x_gradient, t_drawrect.y())
        t_stop_qpointf = t_drawrect.bottomRight()
        t_linear_gradient = QtGui.QLinearGradient(t_start_qpointf, t_stop_qpointf)
        if i_io == mc.mc_global.BreathingState.breathing_in:
            t_linear_gradient.setColorAt(0.0, QtGui.QColor(0, 153, 0))
            t_linear_gradient.setColorAt(1.0, QtGui.QColor(0, 204, 0))
        else:
            t_linear_gradient.setColorAt(0.0, QtGui.QColor(51, 255, 51))
            t_linear_gradient.setColorAt(1.0, QtGui.QColor(102, 255, 102))

        # Adding rectangle with gradient
        t_graphics_rect_item = self.breathing_graphicsscene.addRect(
            t_drawrect,
            pen=QtGui.QPen(QtCore.Qt.NoPen),
            brush=QtGui.QBrush(t_linear_gradient)
        )
        if i_io == mc.mc_global.BreathingState.breathing_in:
            self.in_breath_graphics_qgri_list.append(t_graphics_rect_item)
        elif i_io == mc.mc_global.BreathingState.breathing_out:
            self.out_breath_graphics_qgri_list.append(t_graphics_rect_item)
        # -an alternative to storing this separately might be to use ".items" and check for type
        #  as there is a QGraphicsRectItem
        # -another alternative: **http://doc.qt.io/qt-5/qgraphicsitem.html#type**