from PySide6.QtWidgets import (
    QWidget, QLabel, QVBoxLayout, QProgressBar,
    QTextEdit, QFrame, QSizePolicy
)
from PySide6.QtGui import QFont
from PySide6.QtCore import Qt, QTimer, QDateTime
from PySide6.QtCore import Slot
from pypos.core.base_view import BaseView

class SinkronView(BaseView, QWidget):
    def __init__(self):
        super().__init__()
        self.emit_selesai_sinkron = None  # Akan di-set dari controller
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("Sinkronisasi Data POS")
        self.setMinimumSize(560, 380)

        main_layout = QVBoxLayout()
        main_layout.setSpacing(15)

        # Judul utama
        title = QLabel("🚀 Sinkronisasi Data Pusat ke POS Lokal")
        title.setFont(QFont("Segoe UI", 16, QFont.Bold))
        title.setAlignment(Qt.AlignCenter)

        # Separator
        separator = QFrame()
        separator.setFrameShape(QFrame.HLine)
        separator.setFrameShadow(QFrame.Sunken)

        # Status umum
        self.label_status = QLabel("Menyiapkan sinkronisasi...")
        self.label_status.setFont(QFont("Segoe UI", 11))
        self.label_status.setAlignment(Qt.AlignCenter)
        self.label_hint = QLabel("Status: menunggu...")
        self.label_hint.setFont(QFont("Segoe UI", 9))
        self.label_hint.setAlignment(Qt.AlignCenter)

        # Progress bar
        self.progress_bar = QProgressBar()
        self.progress_bar.setMinimum(0)
        self.progress_bar.setMaximum(100)
        self.progress_bar.setValue(0)
        # edited by glg
        # Hindari fixed-height agar progress bar tetap adaptif terhadap skala UI.
        self.progress_bar.setMinimumHeight(25)
        self.progress_bar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.progress_bar.setFormat("%p%")

        # Log detail
        self.label_detail = QTextEdit()
        self.label_detail.setReadOnly(True)
        self.label_detail.setFont(QFont("Consolas", 9))
        self.label_detail.setStyleSheet("background-color: #f0f0f0;")
        self.label_detail.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        # Rangkai layout
        main_layout.addWidget(title)
        main_layout.addWidget(separator)
        main_layout.addWidget(self.label_status)
        main_layout.addWidget(self.label_hint)
        main_layout.addWidget(self.progress_bar)
        main_layout.addWidget(self.label_detail)

        self.setLayout(main_layout)

        self._pulse_timer = QTimer(self)
        self._pulse_timer.timeout.connect(self._pulse_status)
        self._pulse_counter = 0
        self._pulse_timer.start(800)

    def _pulse_status(self):
        if self.progress_bar.value() >= 100:
            self._pulse_timer.stop()
            return
        self._pulse_counter = (self._pulse_counter + 1) % 4
        dots = "." * self._pulse_counter
        self.label_hint.setText(f"Status: sinkronisasi berjalan{dots}")

    def set_controller(self, controller):
        self.controller = controller

    def update_progress(self, persen, status="", detail_log=""):
        self.progress_bar.setValue(persen)
        self.label_status.setText(status)
        if detail_log:
            now_str = QDateTime.currentDateTime().toString("HH:mm:ss")
            self.label_detail.append(f"[{now_str}] {detail_log}")
        # edited by glg
        # Hindari processEvents() per update untuk mencegah nested event-loop dan jitter UI.


    @Slot(int, str, str)
    def tampilkan_progress(self, percent, status, detail):
        self.progress_bar.setValue(percent)
        self.label_status.setText(status)
        if detail:
            now_str = QDateTime.currentDateTime().toString("HH:mm:ss")
            self.label_detail.append(f"[{now_str}] {detail}")
