path = $path; $this->url = $url; $this->version = $version; } public static function boot( string $path, string $url, string $version ): self { if ( self::$instance !== null ) { return self::$instance; } self::$instance = new self( $path, $url, $version ); self::$instance->registerHooks(); return self::$instance; } public function path(): string { return $this->path; } public function url(): string { return $this->url; } public function version(): string { return $this->version; } public function renderMissingWooCommerceNotice(): void { if ( ! \current_user_can( 'activate_plugins' ) ) { return; } echo '

'; echo \esc_html__( 'Agent001 requires WooCommerce to be installed and active. The plugin is idle until WooCommerce is available.', 'agent001-support-assistant-for-woocommerce' ); echo '

'; } private function registerHooks(): void { if ( ! $this->isWooCommerceActive() ) { \add_action( 'admin_notices', [ $this, 'renderMissingWooCommerceNotice' ] ); return; } $settings = new Settings(); $reader = new ProductReader( $GLOBALS['wpdb'] ); $http = new HttpClient(); $progress = new SyncProgress(); $synchronizer = new Synchronizer( $settings, $reader, $http, $progress ); $syncRunner = new SyncRunner( $synchronizer, $settings, $progress ); $syncRunner->register(); ( new CachePurger() )->register(); ( new DailySync( $settings, $syncRunner, $progress ) )->register(); $this->registerSyncHooks( $settings, $reader, $http ); $this->registerStorefront( $settings ); $this->registerAdmin( $settings, $http, $reader, $progress, $syncRunner ); } private function registerSyncHooks( Settings $settings, ProductReader $reader, HttpClient $http ): void { ( new ProductHooks( $settings ) )->register(); ( new ProductSyncWorker( $settings, $reader, $http ) )->register(); ( new OrderLookupController( $settings ) )->register(); } private function registerStorefront( Settings $settings ): void { if ( \is_admin() ) { return; } ( new WidgetInjector( $settings ) )->register(); } private function registerAdmin( Settings $settings, HttpClient $http, ProductReader $reader, SyncProgress $progress, SyncRunner $syncRunner ): void { if ( ! \is_admin() ) { return; } $agents = new AgentSelectionController( $settings, $http ); $onboarding = new Onboarding( $settings, $progress ); $onboarding->register(); ( new SettingsPage( $settings, $syncRunner, $progress, $agents, $this->path, $this->url, $this->version, $onboarding ) )->register(); $monitor = new IndexingMonitor( $settings, new HttpClient( 10, 1 ), $progress ); ( new SyncAjaxController( $syncRunner, $progress, $reader, $settings, $monitor ) )->register(); ( new ConnectController( $settings, $http ) )->register(); ( new ReviewPrompt( $progress ) )->register(); $agents->register(); } private function isWooCommerceActive(): bool { return \class_exists( 'WooCommerce' ); } }