class VolunteerGui(QMainWindow):
    def __init__(self, data, parent=None):
        super(VolunteerGui, self).__init__(parent)
        self.data = data
        try:
            self._init_ui()
        except Exception as e:
            logger_current.error("初始化异常:%s" % e)
        self.setWindowIcon(QIcon(ICON_PATH))
        self.setWindowTitle("填报专业--简易浏览器")

    def _init_ui(self):
        vlay_main = QVBoxLayout()
        vlay_main.setContentsMargins(0, 0, 0, 0)
        self.splitter = QSplitter(Qt.Horizontal)
        self._init_tree()
        self._init_content()

        vlay_main.addWidget(self.splitter)
        self.setCentralWidget(QWidget(self))
        self.centralWidget().setLayout(vlay_main)

    def eventFilter(self, obj, evt):
        if isinstance(evt, QMouseEvent) and isinstance(obj, TreeWidget):
            self.slot_show_selected_item()
        return False

    def _init_tree(self):
        self.file_tree_wgt = TreeWidget()
        self.file_tree_wgt.setItemsExpandable(True)

        self.file_tree_wgt.header().setSectionResizeMode(
            QHeaderView.ResizeToContents)
        self.file_tree_wgt.header().setStretchLastSection(False)
        self.file_tree_wgt.header().close()

        self.file_tree_wgt.setMinimumSize(300, 570)
        self.file_tree_wgt.setMaximumWidth(450)
        self.file_tree_wgt.installEventFilter(self)

        self._load_data_2_tree()

        self.gbox_tree_view = QGroupBox()
        gbox_tree_view_vlay = QVBoxLayout()
        gbox_tree_view_vlay.addWidget(self.file_tree_wgt)
        self.gbox_tree_view.setLayout(gbox_tree_view_vlay)
        self.gbox_tree_view.setMaximumWidth(450)
        self.splitter.addWidget(self.gbox_tree_view)

    def _load_data_2_tree(self):
        self.file_name_layer = QTreeWidgetItem(self.file_tree_wgt)
        self.file_name_layer.__setattr__("node_name", "省份")
        self.file_name_layer.setText(0, "省份")
        self._init_tree_item(self.data, self.file_name_layer)

    def _init_tree_item(self, data, tree_wg):
        for item_name, item in data.items():
            tree_item = QTreeWidgetItem(tree_wg)
            parent_path = tree_wg.__getattribute__("node_name")
            tree_item.__setattr__("node_name",
                                  os.path.join(parent_path, item_name))
            tree_item.setText(0, item_name)

            if isinstance(item, dict):
                if "专业列表" in list(item.keys()):
                    item = item.get("专业列表")
                self._init_tree_item(item, tree_item)

    def _init_content(self):
        self.content_wgt = QWidget()
        self.content_wgt.setMinimumSize(500, 570)
        vlay_content = QVBoxLayout(self.content_wgt)

        self.content_tab_wg = QTabWidget()
        vlay_content.addWidget(self.content_tab_wg)

        self.gbox_content_view = QGroupBox()
        gbox_content_view_vlay = QVBoxLayout()
        gbox_content_view_vlay.setContentsMargins(0, 0, 0, 0)
        gbox_content_view_vlay.addWidget(self.content_wgt)
        self.gbox_content_view.setMinimumSize(500, 570)
        self.gbox_content_view.setLayout(gbox_content_view_vlay)
        self.splitter.addWidget(self.gbox_content_view)

    def slot_show_selected_item(self):
        item = self.file_tree_wgt.currentItem()
        try:
            if not item:
                return
            loc = item.__getattribute__("node_name")
            node_list = loc.split("\\")
            if len(node_list) <= 6:  # tab_view
                show_data = self.get_data_from_node_list(node_list[1:])
                self.load_data_2_table(node_list[-1], show_data)
            else:
                url = self.get_data_from_node_list(node_list[1:])
                self.load_data_2_web(url)
        except Exception as e:
            logger_current.error("点击项目树:%s, 异常:%s" % (item, e))

    def get_data_from_node_list(self, node_list):
        origin_data = self.data
        if len(node_list) >= 5:
            node_list.insert(4, "专业列表")
        for item in node_list:
            if origin_data.get(item):
                origin_data = origin_data.get(item)
        return origin_data

    def slot_jump_2_web_page(self, model_idx):
        url = None
        try:
            if self.tab_page.model().data(model_idx) == "跳转":
                col = model_idx.column()
                url = self.tab_page.model().data(
                    model_idx.siblingAtColumn(col - 1))
                if not url.startswith("http"):
                    addr = url.split(" ")[0]
                    clip.OpenClipboard()
                    clip.EmptyClipboard()
                    clip.SetClipboardData(win32con.CF_UNICODETEXT, addr)
                    clip.CloseClipboard()
                    url = "https://map.baidu.com"
                self.load_data_2_web(url)
        except Exception as e:
            logger_current.error("点击数据表跳转:%s, 异常:%s" % (url, e))

    def load_data_2_table(self, header_data, detail_data):
        try:
            if self.content_tab_wg.count() and self.content_tab_wg.widget(
                    0).__getattribute__("attr") == "tab":
                if self.tab_page.model():
                    self.tab_page.model().deleteLater()
            else:
                self.tab_page = QTableView()
                self.tab_page.clicked.connect(self.slot_jump_2_web_page)
                self.tab_page.__setattr__("attr", "tab")
                self.tab_page.setAlternatingRowColors(True)
                self.content_tab_wg.addTab(self.tab_page, "数据表页")

            col_num = 3 if [
                x for x in list(detail_data.values()) if isinstance(x, str)
            ] else 2
            row_num = len(detail_data)
            self.tab_page_model = QStandardItemModel(row_num, col_num)
            if col_num == 2:
                self.tab_page_model.setHorizontalHeaderLabels(
                    [header_data, "项目"])
            else:
                self.tab_page_model.setHorizontalHeaderLabels(
                    [header_data, "项目", "查看详情"])
            for col_idx in range(col_num):
                if col_idx == 0:  # 第一列类别
                    for row_idx in range(row_num):
                        self.tab_page_model.setItem(
                            row_idx, col_idx,
                            QStandardItem(list(detail_data.keys())[row_idx]))
                elif col_num == 2:  # 无第三列,第二列显示子项 标题内容
                    col2_content = [
                        x for x in list(detail_data.values())
                        if isinstance(x, dict) and "标签" not in list(
                            detail_data.keys()) and len(x) <= 10
                    ]
                    if col2_content:
                        for row_idx in range(row_num):
                            self.tab_page_model.setItem(
                                row_idx, col_idx,
                                QStandardItem("、".join(
                                    map(self.strip_colon,
                                        col2_content[row_idx].keys()))))
                    else:
                        school_count_list = []
                        for x in detail_data.values():
                            if not x:
                                school_count_list.append("")
                            else:
                                school_count_list.append(len(x))
                        for row_idx in range(row_num):
                            self.tab_page_model.setItem(
                                row_idx, col_idx,
                                QStandardItem(str(school_count_list[row_idx])))
                elif col_num == 3 and col_idx == 1:  # 有第三列,第二列显示详情
                    for row_idx in range(row_num):
                        school_content = list(detail_data.values())[row_idx]
                        if isinstance(school_content, dict):
                            school_content = "、".join(school_content.keys())
                        elif isinstance(school_content, list):
                            school_content = "、".join(school_content)
                        self.tab_page_model.setItem(
                            row_idx, col_idx, QStandardItem(school_content))
                elif col_num == 3 and col_idx == 2:  # 有第三列,第三列跳转页面
                    for row_idx in range(row_num):
                        school_content = list(detail_data.keys())[row_idx]
                        if school_content not in ["专业列表", "标签", "优势专业"]:
                            self.tab_page_model.setItem(
                                row_idx, col_idx, QStandardItem("跳转"))

            self.tab_page.setModel(self.tab_page_model)
            self.tab_page.setEditTriggers(QTableView.NoEditTriggers)
            self.tab_page.horizontalHeader().setSectionResizeMode(
                QHeaderView.ResizeToContents)
            self.content_tab_wg.setCurrentIndex(0)
        except Exception as e:
            logger_current.error("更新数据表信息:%s, 异常:%s" % (header_data, e))

    def load_data_2_web(self, url):
        try:
            if self.content_tab_wg.count() > 1 and self.content_tab_wg.widget(
                    1).__getattribute__("attr") == "web":
                self.web_page.load(QUrl(url))
                self.content_tab_wg.setCurrentIndex(1)
            else:
                self.web_page = QWebEngineView()
                self.web_page.__setattr__("attr", "web")
                self.web_page.load(QUrl(url))
                self.web_page.urlChanged.connect(self.slot_refresh_web_page)
                self.content_tab_wg.addTab(self.web_page, "网页搜索")
                self.content_tab_wg.setCurrentIndex(1)
        except Exception as e:
            logger_current.error("更新网页信息:%s, 异常:%s" % (url, e))

    def slot_refresh_web_page(self, url):
        logger_current.info("访问:%s" % url.url())

    @staticmethod
    def strip_colon(input_str):
        if input_str[-1] == ":":
            return input_str.rstrip(":")
        return input_str