""" Account Creation Modal - Spezialisiertes Modal für Account-Erstellung """ import logging from typing import Optional, List from PyQt5.QtCore import QTimer, pyqtSignal from PyQt5.QtWidgets import QVBoxLayout, QLabel, QProgressBar from PyQt5.QtGui import QFont from views.widgets.progress_modal import ProgressModal from styles.modal_styles import ModalStyles logger = logging.getLogger("account_creation_modal") class AccountCreationModal(ProgressModal): """ Spezialisiertes Modal für Account-Erstellung mit Step-by-Step Anzeige. """ # Signale step_completed = pyqtSignal(str) # Step-Name def __init__(self, parent=None, platform: str = "Social Media", language_manager=None, style_manager=None): self.platform = platform self.current_step = 0 self.total_steps = 0 self.steps = [] super().__init__(parent, "account_creation", language_manager, style_manager) # Erweitere UI für Steps self.setup_steps_ui() def setup_steps_ui(self): """Erweitert die UI um Step-Anzeige""" container_layout = self.modal_container.layout() # Progress Bar (zwischen Animation und Status) self.progress_bar = QProgressBar() self.progress_bar.setVisible(False) self.progress_bar.setFixedHeight(self.style_manager.SIZES['progress_bar_height']) self.progress_bar.setStyleSheet(self.style_manager.get_progress_bar_style()) # Füge Progress Bar nach Animation Widget ein (Index 2) container_layout.insertWidget(2, self.progress_bar) # Steps Label (zwischen Progress Bar und Status) self.steps_label = QLabel() self.steps_label.setVisible(False) self.steps_label.setAlignment(self.title_label.alignment()) self.steps_label.setFont(self.style_manager.create_font('steps')) self.steps_label.setStyleSheet(self.style_manager.get_steps_label_style()) # Füge Steps Label nach Progress Bar ein (Index 3) container_layout.insertWidget(3, self.steps_label) def set_steps(self, steps: List[str]): """ Setzt die Liste der Schritte für die Account-Erstellung. Args: steps: Liste der Step-Namen """ self.steps = steps self.total_steps = len(steps) self.current_step = 0 if self.total_steps > 0: self.progress_bar.setMaximum(self.total_steps) self.progress_bar.setValue(0) self.progress_bar.setVisible(True) self.steps_label.setVisible(True) self._update_steps_display() def start_step(self, step_name: str, detail: str = None): """ Startet einen neuen Schritt. Args: step_name: Name des Schritts detail: Optional - Detail-Information """ if step_name in self.steps: self.current_step = self.steps.index(step_name) + 1 else: self.current_step += 1 # Progress Bar aktualisieren if self.progress_bar.isVisible(): self.progress_bar.setValue(self.current_step) # Status aktualisieren self.update_status(f"🔄 {step_name}", detail) # Steps Display aktualisieren self._update_steps_display() logger.info(f"Account Creation Step gestartet: {step_name} ({self.current_step}/{self.total_steps})") def complete_step(self, step_name: str, next_step: str = None): """ Markiert einen Schritt als abgeschlossen. Args: step_name: Name des abgeschlossenen Schritts next_step: Optional - Name des nächsten Schritts """ # Step-completed Signal senden self.step_completed.emit(step_name) # Kurz "Completed" anzeigen self.update_status(f"✅ {step_name} abgeschlossen") # Nach kurzer Verzögerung nächsten Schritt starten if next_step: QTimer.singleShot(self.style_manager.ANIMATIONS['step_delay'], lambda: self.start_step(next_step)) logger.info(f"Account Creation Step abgeschlossen: {step_name}") def fail_step(self, step_name: str, error_message: str, retry_callback=None): """ Markiert einen Schritt als fehlgeschlagen. Args: step_name: Name des fehlgeschlagenen Schritts error_message: Fehlermeldung retry_callback: Optional - Callback für Retry """ self.update_status(f"❌ {step_name} fehlgeschlagen", error_message) # Animation stoppen self.animation_widget.stop_animation() logger.error(f"Account Creation Step fehlgeschlagen: {step_name} - {error_message}") def show_platform_specific_process(self): """Zeigt plattform-spezifische Account-Erstellung an""" # Plattform-spezifische Steps platform_steps = self._get_platform_steps() self.set_steps(platform_steps) # Titel anpassen title = f"🔄 {self.platform} Account wird erstellt" self.title_label.setText(title) # Modal anzeigen self.show_process("account_creation") def _get_platform_steps(self) -> List[str]: """Gibt plattform-spezifische Schritte zurück""" return self.style_manager.get_platform_steps(self.platform) def _update_steps_display(self): """Aktualisiert die Steps-Anzeige""" if self.total_steps > 0: steps_text = f"Schritt {self.current_step} von {self.total_steps}" self.steps_label.setText(steps_text) def show_success(self, account_data: dict = None): """ Zeigt Erfolgs-Status an. Args: account_data: Optional - Account-Daten für Anzeige """ # Animation stoppen self.animation_widget.stop_animation() # Success Status platform_name = account_data.get('platform', self.platform) if account_data else self.platform username = account_data.get('username', '') if account_data else '' title = f"✅ {platform_name} Account erstellt!" status = f"Account '{username}' wurde erfolgreich erstellt" if username else "Account wurde erfolgreich erstellt" self.title_label.setText(title) self.update_status(status, "Das Fenster schließt automatisch...") # Progress Bar auf Maximum setzen if self.progress_bar.isVisible(): self.progress_bar.setValue(self.total_steps) # Auto-Close nach konfigurierbarer Zeit QTimer.singleShot(self.style_manager.ANIMATIONS['auto_close_delay'], self.hide_process) logger.info(f"Account Creation erfolgreich für: {platform_name}") def estimate_time_remaining(self) -> str: """ Schätzt die verbleibende Zeit basierend auf aktueller Step. Returns: str: Geschätzte Zeit als String """ if self.total_steps == 0: return "Unbekannt" # Grobe Zeitschätzung: ~30 Sekunden pro Step remaining_steps = max(0, self.total_steps - self.current_step) estimated_seconds = remaining_steps * 30 if estimated_seconds < 60: return f"~{estimated_seconds}s" else: minutes = estimated_seconds // 60 return f"~{minutes} Min"