from PySide6.QtCore import QObject, Signal

from pypos.core.base_controller import BaseController
from pypos.modules.sinkronisasi.controllers.sync_flow_controller import SyncFlowController


class SinkronController(BaseController, QObject):
    sinkron_selesai = Signal(bool)

    def __init__(self, view, user_info, app_controller, silent_mode=False):
        BaseController.__init__(self)
        QObject.__init__(self)
        self.view = view
        self.user_info = user_info
        self.app_controller = app_controller
        self.silent_mode = bool(silent_mode)

        mode = "login" if self.silent_mode else "manual"
        self.sync_flow = SyncFlowController(
            mode=mode,
            view=self.view,
            user_info=self.user_info,
            app_controller=self.app_controller,
        )
        self.sync_flow.sync_finished.connect(self._on_sync_finished)

    def sinkronkan_setelah_login(self, user_info):
        self.user_info = user_info
        self.sync_flow.user_info = user_info
        self.sync_flow.start()

    def background_sinkron(self, user_info):
        self.sinkronkan_setelah_login(user_info)

    def mulai_sinkron(self):
        self.sync_flow.start()

    def emit_sinyal_selesai(self, total_updated):
        self.sinkron_selesai.emit(True)

    def handle_sinkron_gagal(self, pesan):
        self.sinkron_selesai.emit(False)

    def on_sinkron_selesai(self, total_rows=None):
        if self.view:
            self.view.close()
            self.view.deleteLater()
            self.view = None
        if self.app_controller:
            self.app_controller.show_dashboard(self.user_info)

    def sinkronisasi_selesai(self, total):
        self.sinkron_selesai.emit(True)

    def sinkronisasi_gagal(self, pesan):
        self.sinkron_selesai.emit(False)

    def cleanup_thread(self):
        self.sync_flow.stop()

    def handle_progress_update(self, persen, pesan, detail_log=""):
        return

    def stop(self, force=False, wait_timeout_ms=None):
        self.sync_flow.stop(force=force, wait_timeout_ms=wait_timeout_ms)

    def _on_sync_finished(self, success):
        self.sinkron_selesai.emit(bool(success))
