#!/usr/bin/env python3
"""CDM Linux Welcome Wizard — first-login setup."""

import os
import sys
import subprocess
from pathlib import Path

from PyQt6.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout,
    QLabel, QPushButton, QStackedWidget, QSizePolicy
)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap, QPalette, QColor, QFont


FLAG_FILE = Path.home() / ".config" / "cdm-welcome-done"
LOGO_PATH = "/usr/share/wallpapers/CDM/logo.png"
BG_PATH = "/usr/share/wallpapers/CDM/contents/images/1920x1080.png"

# CDM brand colors
CDM_NAVY = "#25253B"
CDM_RED = "#EF4039"
CDM_MUTED_RED = "#BC393A"
CDM_DARK_BLUE = "#1a1a2e"
CDM_TEXT = "#25253B"
CDM_WHITE = "#FFFFFF"

STYLESHEET = """
QWidget#mainWindow {
    background-color: #e8f0f2;
}
QWidget#contentArea {
    background-color: rgba(255, 255, 255, 200);
    border-radius: 16px;
}
QLabel#title {
    color: #25253B;
    font-size: 24px;
    font-weight: bold;
}
QLabel#subtitle {
    color: #3E3E60;
    font-size: 14px;
    line-height: 1.5;
}
QLabel#shortcut-key {
    color: #EF4039;
    font-size: 14px;
    font-weight: bold;
    font-family: monospace;
}
QLabel#shortcut-desc {
    color: #25253B;
    font-size: 14px;
}
QPushButton#primary {
    background-color: #EF4039;
    color: #FFFFFF;
    border: none;
    border-radius: 8px;
    padding: 12px 28px;
    font-size: 14px;
    font-weight: bold;
}
QPushButton#primary:hover {
    background-color: #BC393A;
}
QPushButton#nav {
    background-color: #25253B;
    color: #FFFFFF;
    border: none;
    border-radius: 6px;
    padding: 8px 20px;
    font-size: 13px;
}
QPushButton#nav:hover {
    background-color: #3E3E60;
}
QPushButton#skip {
    background-color: transparent;
    color: #3E3E60;
    border: none;
    padding: 8px 16px;
    font-size: 12px;
}
QPushButton#skip:hover {
    color: #EF4039;
}
"""


def make_title(text):
    label = QLabel(text)
    label.setObjectName("title")
    label.setAlignment(Qt.AlignmentFlag.AlignCenter)
    return label


def make_text(text):
    label = QLabel(text)
    label.setObjectName("subtitle")
    label.setWordWrap(True)
    label.setAlignment(Qt.AlignmentFlag.AlignCenter)
    return label


def make_page(title_text, body_widgets=None, extra_widgets=None):
    """Create a standard page with title and body."""
    page = QWidget()
    layout = QVBoxLayout()
    layout.setContentsMargins(40, 30, 40, 20)
    layout.addStretch(1)

    if title_text:
        layout.addWidget(make_title(title_text))
        layout.addSpacing(16)

    if body_widgets:
        for w in body_widgets:
            if isinstance(w, str):
                layout.addWidget(make_text(w))
            else:
                layout.addWidget(w)
            layout.addSpacing(8)

    if extra_widgets:
        layout.addSpacing(12)
        for w in extra_widgets:
            layout.addWidget(w)

    layout.addStretch(2)
    page.setLayout(layout)
    return page


class CDMWelcome(QWidget):
    def __init__(self):
        super().__init__()
        self.setObjectName("mainWindow")
        self.setWindowTitle("CDM Linux")
        self.setFixedSize(700, 500)
        self.setStyleSheet(STYLESHEET)

        main_layout = QVBoxLayout()
        main_layout.setContentsMargins(30, 30, 30, 20)

        # Content area with semi-transparent background
        self.content = QWidget()
        self.content.setObjectName("contentArea")
        content_layout = QVBoxLayout()
        content_layout.setContentsMargins(0, 0, 0, 0)

        self.stack = QStackedWidget()
        self.pages = []

        # Page 0: Welcome
        welcome = make_page(
            "Добро пожаловать\nв CDM Linux!",
            ["Ваш рабочий компьютер готов к работе.\n"
             "Давайте настроим несколько вещей за пару минут."]
        )
        # Add logo to welcome page
        if os.path.exists(LOGO_PATH):
            logo_label = QLabel()
            pixmap = QPixmap(LOGO_PATH)
            if not pixmap.isNull():
                scaled = pixmap.scaledToWidth(180, Qt.TransformationMode.SmoothTransformation)
                logo_label.setPixmap(scaled)
                logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
                welcome.layout().insertWidget(0, logo_label)
                welcome.layout().insertSpacing(1, 10)
        self.pages.append(welcome)

        # Page 1: Yandex Disk
        self.ydisk_btn = QPushButton("Подключить Яндекс.Диск")
        self.ydisk_btn.setObjectName("primary")
        self.ydisk_btn.clicked.connect(self.run_ydisk)

        self.ydisk_status = make_text("")

        btn_container = QWidget()
        btn_layout = QHBoxLayout()
        btn_layout.addStretch()
        btn_layout.addWidget(self.ydisk_btn)
        btn_layout.addStretch()
        btn_container.setLayout(btn_layout)

        ydisk_page = make_page(
            "Яндекс.Диск",
            ["Подключите рабочий Яндекс.Диск,\n"
             "чтобы ваши файлы были всегда под рукой."],
            [btn_container, self.ydisk_status,
             make_text("Можно пропустить и настроить позже\nчерез меню: Настроить Яндекс.Диск")]
        )
        self.pages.append(ydisk_page)

        # Page 2: Overview
        overview = QWidget()
        ov_layout = QVBoxLayout()
        ov_layout.setContentsMargins(40, 20, 40, 10)
        ov_layout.addStretch(1)
        ov_layout.addWidget(make_title("Быстрый обзор"))
        ov_layout.addSpacing(12)

        shortcuts = [
            ("Нижняя панель", "Меню приложений (как Пуск)"),
            ("Alt + Shift", "Переключение языка"),
            ("Win + E", "Файловый менеджер"),
            ("Win + Shift + S", "Скриншот области"),
            ("Alt + Space", "Быстрый поиск"),
            ("Ctrl + Shift + Esc", "Системный монитор"),
            ("Win + L", "Заблокировать экран"),
        ]
        for key, desc in shortcuts:
            row = QHBoxLayout()
            key_label = QLabel(key)
            key_label.setObjectName("shortcut-key")
            key_label.setFixedWidth(200)
            key_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
            desc_label = QLabel(desc)
            desc_label.setObjectName("shortcut-desc")
            row.addStretch()
            row.addWidget(key_label)
            row.addSpacing(16)
            row.addWidget(desc_label)
            row.addStretch()
            ov_layout.addLayout(row)
            ov_layout.addSpacing(2)
        ov_layout.addStretch(2)
        overview.setLayout(ov_layout)
        self.pages.append(overview)

        # Page 3: Updates
        self.pages.append(make_page(
            "Обновления",
            ["Система обновляется автоматически.\n\n"
             "Когда увидите значок обновлений в трее —\n"
             "нажмите «Обновить».\n\n"
             "После обновления ядра потребуется\n"
             "перезагрузка — система предупредит."]
        ))

        # Page 4: Help
        self.pages.append(make_page(
            "Помощь",
            ["Если что-то не работает —\n"
             "напишите Кириллу в Telegram.\n\n"
             "Он подключится удалённо и поможет."]
        ))

        # Page 5: Done
        self.pages.append(make_page(
            "Готово!",
            ["Всё настроено. Приятной работы!"]
        ))

        for page in self.pages:
            self.stack.addWidget(page)

        content_layout.addWidget(self.stack)
        self.content.setLayout(content_layout)
        main_layout.addWidget(self.content)

        # Navigation buttons
        nav_layout = QHBoxLayout()
        self.skip_btn = QPushButton("Пропустить")
        self.skip_btn.setObjectName("skip")
        self.skip_btn.clicked.connect(self.finish)

        self.back_btn = QPushButton("Назад")
        self.back_btn.setObjectName("nav")
        self.back_btn.clicked.connect(self.go_back)

        self.next_btn = QPushButton("Далее")
        self.next_btn.setObjectName("primary")
        self.next_btn.clicked.connect(self.go_next)

        nav_layout.addWidget(self.skip_btn)
        nav_layout.addStretch()
        nav_layout.addWidget(self.back_btn)
        nav_layout.addSpacing(8)
        nav_layout.addWidget(self.next_btn)

        main_layout.addSpacing(10)
        main_layout.addLayout(nav_layout)
        self.setLayout(main_layout)
        self.update_buttons()

    def update_buttons(self):
        idx = self.stack.currentIndex()
        self.back_btn.setVisible(idx > 0)
        is_last = idx == len(self.pages) - 1
        self.next_btn.setText("Закрыть" if is_last else "Далее")
        self.skip_btn.setVisible(not is_last)

    def go_next(self):
        idx = self.stack.currentIndex()
        if idx == len(self.pages) - 1:
            self.finish()
        else:
            self.stack.setCurrentIndex(idx + 1)
            self.update_buttons()

    def go_back(self):
        idx = self.stack.currentIndex()
        if idx > 0:
            self.stack.setCurrentIndex(idx - 1)
            self.update_buttons()

    def finish(self):
        FLAG_FILE.parent.mkdir(parents=True, exist_ok=True)
        FLAG_FILE.touch()
        self.close()

    def run_ydisk(self):
        self.ydisk_btn.setEnabled(False)
        self.ydisk_btn.setText("Настройка...")
        self.ydisk_status.setText("Откроется браузер для входа в Яндекс...")
        QApplication.processEvents()
        try:
            result = subprocess.run(["cdm-ydisk-setup"], capture_output=False, timeout=300)
            if result.returncode == 0:
                self.ydisk_status.setText("Яндекс.Диск подключён!")
                self.ydisk_btn.setText("Готово ✓")
            else:
                self.ydisk_status.setText("Не удалось подключить. Попробуйте позже.")
                self.ydisk_btn.setEnabled(True)
                self.ydisk_btn.setText("Попробовать снова")
        except Exception as e:
            self.ydisk_status.setText(f"Ошибка: {e}")
            self.ydisk_btn.setEnabled(True)
            self.ydisk_btn.setText("Попробовать снова")


def main():
    if "--force" not in sys.argv and FLAG_FILE.exists():
        sys.exit(0)

    app = QApplication(sys.argv)
    app.setApplicationName("CDM Welcome")
    window = CDMWelcome()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
