from PyQt5 import QtGui
from PyQt5.QtCore import pyqtSignal, Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import (
    QWidget,
    QVBoxLayout,
    QHBoxLayout,
    QLabel,
    QScrollArea,
    QGroupBox,
    QPushButton,
    QStackedWidget,
)

from rare.utils.extra_widgets import ImageLabel, WaitingSpinner
from rare.widgets.flow_layout import FlowLayout


class SearchResults(QStackedWidget):
    show_info = pyqtSignal(dict)

    def __init__(self, api_core):
        super(SearchResults, self).__init__()
        self.search_result_widget = QWidget()
        self.api_core = api_core
        self.addWidget(self.search_result_widget)
        self.main_layout = QVBoxLayout()
        self.back_button = QPushButton(self.tr("Back"))
        self.main_layout.addWidget(self.back_button)
        self.main_layout.addWidget(self.back_button)
        self.result_area = QScrollArea()
        self.widget = QWidget()
        self.result_area.setWidgetResizable(True)
        self.main_layout.addWidget(self.result_area)
        self.result_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)

        self.result_area.setWidget(self.widget)
        self.layout = FlowLayout()
        self.widget.setLayout(self.layout)

        self.search_result_widget.setLayout(self.main_layout)

        self.addWidget(WaitingSpinner())
        self.setCurrentIndex(1)

    def load_results(self, text: str):
        self.setCurrentIndex(1)
        if text != "":
            self.api_core.search_game(text, self.show_results)

    def show_results(self, results: dict):
        self.widget.deleteLater()
        self.widget = QWidget()
        self.layout = FlowLayout()
        if not results:
            self.layout.addWidget(QLabel(self.tr("No results found")))
        else:
            for res in results:
                w = _SearchResultItem(res)
                w.show_info.connect(self.show_info.emit)
                self.layout.addWidget(w)
        self.widget.setLayout(self.layout)
        self.result_area.setWidget(self.widget)
        self.setCurrentIndex(0)


class _SearchResultItem(QGroupBox):
    res: dict
    show_info = pyqtSignal(dict)

    def __init__(self, result: dict):
        super(_SearchResultItem, self).__init__()
        self.layout = QVBoxLayout()
        self.image = ImageLabel()
        for img in result["keyImages"]:
            if img["type"] == "DieselStoreFrontTall":
                width = 240
                self.image.update_image(img["url"], result["title"], (width, 360))
                break
        else:
            print("No image found")
        self.layout.addWidget(self.image)

        self.res = result
        self.title = QLabel(self.res["title"])
        title_font = QFont()
        title_font.setPixelSize(15)
        self.title.setFont(title_font)
        self.title.setWordWrap(True)
        self.layout.addWidget(self.title)
        price = result["price"]["totalPrice"]["fmtPrice"]["originalPrice"]
        discount_price = result["price"]["totalPrice"]["fmtPrice"]["discountPrice"]
        price_layout = QHBoxLayout()
        price_label = QLabel(price if price != "0" else self.tr("Free"))
        price_layout.addWidget(price_label)

        if price != discount_price:
            font = QFont()
            font.setStrikeOut(True)
            price_label.setFont(font)
            price_layout.addWidget(QLabel(discount_price))
        # self.discount_price = QLabel(f"{self.tr('Discount price: ')}{discount_price}")
        self.layout.addLayout(price_layout)

        self.setLayout(self.layout)

        self.setFixedWidth(260)

    def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
        if a0.button() == 1:
            self.show_info.emit(self.res)
