#依赖：PyQt6,PyQt6-WebEngine
import sys
import os
from PyQt6.QtWidgets import *
from PyQt6.QtCore import *
from PyQt6.QtWebEngineWidgets import *
from PyQt6.QtWebEngineCore import *
from PyQt6.QtGui import QAction
HISTORY_FILE = os.path.expanduser("~/browser_history.txt")
SHORTCUT_FILE = os.path.expanduser("~/browser_shortcuts.txt")

class BrowserTab(QWebEngineView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.settings().setAttribute(QWebEngineSettings.WebAttribute.PluginsEnabled, True)
        self.settings().setAttribute(QWebEngineSettings.WebAttribute.JavascriptEnabled, True)
        self.load(QUrl("https://www.bing.com"))

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Python 极速浏览器")
        self.setGeometry(50, 50, 1400, 900)

        self.history = self.load_list(HISTORY_FILE)
        self.shortcuts = self.load_list(SHORTCUT_FILE)

        self.tab_widget = QTabWidget()
        self.tab_widget.setTabsClosable(True)
        self.tab_widget.tabCloseRequested.connect(self.close_tab)
        self.add_new_tab(QUrl("https://www.bing.com"))

        self.url_bar = QLineEdit()
        self.url_bar.returnPressed.connect(self.navigate)

        self.build_toolbar()
        self.build_ui()

    def build_toolbar(self):
        nav_bar = QToolBar()
        self.addToolBar(nav_bar)

        back_btn = QAction("←", self)
        back_btn.triggered.connect(lambda: self.current_tab().back())
        nav_bar.addAction(back_btn)

        forward_btn = QAction("→", self)
        forward_btn.triggered.connect(lambda: self.current_tab().forward())
        nav_bar.addAction(forward_btn)

        refresh_btn = QAction("↻", self)
        refresh_btn.triggered.connect(lambda: self.current_tab().reload())
        nav_bar.addAction(refresh_btn)

        home_btn = QAction("🏠", self)
        home_btn.triggered.connect(lambda: self.current_tab().setUrl(QUrl("https://www.bing.com")))
        nav_bar.addAction(home_btn)

        new_tab_btn = QAction("➕", self)
        new_tab_btn.triggered.connect(lambda: self.add_new_tab(QUrl("https://www.bing.com")))
        nav_bar.addAction(new_tab_btn)

        nav_bar.addWidget(self.url_bar)

        history_btn = QAction("历史", self)
        history_btn.triggered.connect(self.show_history)
        nav_bar.addAction(history_btn)

        short_btn = QAction("快捷", self)
        short_btn.triggered.connect(self.show_shortcuts)
        nav_bar.addAction(short_btn)

    def navigate(self):
        text = self.url_bar.text().strip()
        if not text:
            return

        if text.startswith("http"):
            url = QUrl(text)
        elif text.endswith((".html", ".htm")):
            url = QUrl.fromLocalFile(os.path.abspath(text))
        else:
            url = QUrl(f"https://www.bing.com/search?q={text}")

        self.current_tab().setUrl(url)
        self.save_history(url.toString())

    def add_new_tab(self, url):
        tab = BrowserTab()
        tab.setUrl(url)
        i = self.tab_widget.addTab(tab, "新标签页")
        self.tab_widget.setCurrentIndex(i)
        tab.urlChanged.connect(lambda u: self.url_bar.setText(u.toString()))
        tab.titleChanged.connect(lambda t: self.tab_widget.setTabText(self.tab_widget.currentIndex(), t[:20]+"..."))

    def current_tab(self):
        return self.tab_widget.currentWidget()

    def close_tab(self, index):
        if self.tab_widget.count() > 1:
            self.tab_widget.removeTab(index)
            

    def build_ui(self):
        central = QWidget()
        self.setCentralWidget(central)
        layout = QVBoxLayout(central)
        layout.addWidget(self.tab_widget)

    def load_list(self, path):
        if not os.path.exists(path):
            return []
        with open(path, "r", encoding="utf-8") as f:
            return [l.strip() for l in f if l.strip()]

    def save_list(self, path, lst):
        with open(path, "w", encoding="utf-8") as f:
            f.write("\n".join(lst))

    def save_history(self, s):
        if s not in self.history and not s.startswith("https://www.bing.com/search"):
            self.history.append(s)
            self.save_list(HISTORY_FILE, self.history)

    def show_history(self):
        self.show_list_window("历史记录", self.history)

    def show_shortcuts(self):
        def add_current():
            cur = self.current_tab().url().toString()
            if cur not in self.shortcuts:
                self.shortcuts.append(cur)
                self.save_list(SHORTCUT_FILE, self.shortcuts)
                self.show_shortcuts()

        win = self.show_list_window("快捷方式", self.shortcuts)
        btn = QPushButton("添加当前页")
        btn.clicked.connect(add_current)
        win.layout().addWidget(btn)

    def show_list_window(self, title, lst):
        win = QWidget()
        win.setWindowTitle(title)
        win.setMinimumSize(600,700)
        layout = QVBoxLayout(win)
        listw = QListWidget()
        listw.addItems(lst)
        layout.addWidget(listw)
        listw.itemClicked.connect(lambda x: self.current_tab().setUrl(QUrl(x.text())))
        win.show()
        return win

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())