From 21716a6439b419ed034b8f64fca094ceb54c20cc Mon Sep 17 00:00:00 2001
From: Bart Jaskulski <bjaskulski@protonmail.com>
Date: Sun, 10 Mar 2024 01:46:46 +0100
Subject: [PATCH] feat: manually discover, which extensions to enable

Signed-off-by: Bart Jaskulski <bjaskulski@protonmail.com>
---
 .../CustomOrdersTableCompatibility.php        | 32 ++++++++
 src/Extension/CommonBinding/I18n.php          |  6 +-
 .../CommonBinding/WPDeskLicenseBridge.php     | 42 ++++++++++
 .../CommonBinding/WPDeskTrackerBridge.php     | 21 +++++
 src/Extension/ConditionalExtension.php        | 78 +++++++++++++++++++
 src/Extension/LoggerExtension.php             | 20 -----
 6 files changed, 176 insertions(+), 23 deletions(-)
 create mode 100644 src/Extension/CommonBinding/CustomOrdersTableCompatibility.php
 create mode 100644 src/Extension/CommonBinding/WPDeskLicenseBridge.php
 create mode 100644 src/Extension/CommonBinding/WPDeskTrackerBridge.php
 create mode 100644 src/Extension/ConditionalExtension.php
 delete mode 100644 src/Extension/LoggerExtension.php

diff --git a/src/Extension/CommonBinding/CustomOrdersTableCompatibility.php b/src/Extension/CommonBinding/CustomOrdersTableCompatibility.php
new file mode 100644
index 0000000..aa33b90
--- /dev/null
+++ b/src/Extension/CommonBinding/CustomOrdersTableCompatibility.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace WPDesk\Init\Extension\CommonBinding;
+
+use WPDesk\Init\Binding\Hookable;
+use WPDesk\Init\Plugin\Plugin;
+
+class CustomOrdersTableCompatibility implements Hookable {
+
+	/** @var Plugin */
+	private $plugin;
+
+	public function __construct( Plugin $plugin ) {
+		$this->plugin = $plugin;
+	}
+
+	public function hooks(): void {
+		add_action('before_woocommerce_init', $this);
+	}
+
+	public function __invoke(): void {
+		$features_util_class = '\\' . 'Automattic' . '\\' . 'WooCommerce' . '\\' . 'Utilities' . '\\' . 'FeaturesUtil';
+		if ( class_exists( $features_util_class ) ) {
+			$features_util_class::declare_compatibility(
+				'custom_order_tables',
+				$this->plugin->get_basename(),
+				true
+			);
+		}
+
+	}
+}
diff --git a/src/Extension/CommonBinding/I18n.php b/src/Extension/CommonBinding/I18n.php
index 61e8edd..a522173 100644
--- a/src/Extension/CommonBinding/I18n.php
+++ b/src/Extension/CommonBinding/I18n.php
@@ -16,13 +16,13 @@ class I18n implements Hookable {
 
 	public function hooks(): void {
 		if ( did_action( 'plugins_loaded' ) ) {
-			$this->load_textdomain();
+			$this->__invoke();
 		} else {
-			add_action( 'plugins_loaded', [ $this, 'load_textdomain' ] );
+			add_action( 'plugins_loaded', $this );
 		}
 	}
 
-	public function load_textdomain(): void {
+	public function __invoke(): void {
 		\load_plugin_textdomain(
 			$this->plugin->get_slug(),
 			false,
diff --git a/src/Extension/CommonBinding/WPDeskLicenseBridge.php b/src/Extension/CommonBinding/WPDeskLicenseBridge.php
new file mode 100644
index 0000000..55db2c7
--- /dev/null
+++ b/src/Extension/CommonBinding/WPDeskLicenseBridge.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace WPDesk\Init\Extension\CommonBinding;
+
+use WPDesk\Init\Binding\Hookable;
+use WPDesk\Init\Plugin\Plugin;
+use WPDesk\License\PluginRegistrator;
+
+class WPDeskLicenseBridge implements Hookable {
+
+	/** @var \WPDesk_Plugin_Info */
+	private $plugin_info;
+
+	private $registrator;
+
+	public function __construct( \WPDesk_Plugin_Info $plugin_info ) {
+		$this->plugin_info = $plugin_info;
+	}
+
+	public function hooks(): void {
+		$this->registrator = $this->register_plugin();
+		// add_action('plugins_loaded', $this);
+	}
+
+	public function __invoke(): void {
+		$is_plugin_subscription_active = $this->registrator instanceof PluginRegistrator && $this->registrator->is_active();
+		if ( $this->plugin instanceof ActivationAware && $is_plugin_subscription_active ) {
+			$this->plugin->set_active();
+		}
+
+	}
+
+	private function register_plugin() {
+		if ( apply_filters( 'wpdesk_can_register_plugin', true, $this->plugin_info ) ) {
+			$registrator = new PluginRegistrator( $this->plugin_info );
+			$registrator->initialize_license_manager();
+
+			return $registrator;
+		}
+	}
+
+}
diff --git a/src/Extension/CommonBinding/WPDeskTrackerBridge.php b/src/Extension/CommonBinding/WPDeskTrackerBridge.php
new file mode 100644
index 0000000..20660f9
--- /dev/null
+++ b/src/Extension/CommonBinding/WPDeskTrackerBridge.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace WPDesk\Init\Extension\CommonBinding;
+
+use WPDesk\Init\Binding\Hookable;
+use WPDesk\Init\Plugin\Plugin;
+
+class WPDeskTrackerBridge implements Hookable {
+
+	/** @var Plugin */
+	private $plugin;
+
+	public function __construct( Plugin $plugin ) {
+		$this->plugin = $plugin;
+	}
+
+	public function hooks(): void {
+		$tracker_factory = new \WPDesk_Tracker_Factory_Prefixed();
+		$tracker_factory->create_tracker( $this->plugin->get_basename() );
+	}
+}
diff --git a/src/Extension/ConditionalExtension.php b/src/Extension/ConditionalExtension.php
new file mode 100644
index 0000000..dcc5dc5
--- /dev/null
+++ b/src/Extension/ConditionalExtension.php
@@ -0,0 +1,78 @@
+<?php
+
+declare(strict_types=1);
+
+namespace WPDesk\Init\Extension;
+
+use DI\Definition\Helper\AutowireDefinitionHelper;
+use Monolog\Formatter\LineFormatter;
+use Monolog\Logger;
+use Monolog\Processor\PsrLogMessageProcessor;
+use Monolog\Processor\UidProcessor;
+use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
+use WPDesk\Init\Binding\Loader\ArrayBindingLoader;
+use WPDesk\Init\Binding\Loader\BindingDefinitions;
+use WPDesk\Init\Configuration\ReadableConfig;
+use WPDesk\Init\DependencyInjection\ContainerBuilder;
+use WPDesk\Init\Extension\CommonBinding\WPDeskLicenseBridge;
+use WPDesk\Init\Extension\CommonBinding\WPDeskTrackerBridge;
+use WPDesk\Init\Plugin\Plugin;
+use WPDesk\Logger\WC\WooCommerceHandler;
+
+class ConditionalExtension implements Extension {
+
+	public function bindings( ContainerInterface $c ): BindingDefinitions {
+		$bindings = [];
+
+		if ( class_exists( \WPDesk\License\PluginRegistrator::class ) ) {
+			$bindings[] = WPDeskLicenseBridge::class;
+		}
+
+		if ( class_exists( \WPDesk_Tracker::class ) ) {
+			$bindings[] = WPDeskTrackerBridge::class;
+		}
+
+		return new ArrayBindingLoader( $bindings );
+	}
+
+	public function build( ContainerBuilder $builder, Plugin $plugin, ReadableConfig $config ): void {
+		$definitions = [];
+
+		if ( class_exists( \WPDesk\License\PluginRegistrator::class ) ) {
+			$definitions[ WPDeskLicenseBridge::class ] = new AutowireDefinitionHelper();
+		}
+
+		if ( class_exists( \WPDesk_Tracker::class ) ) {
+			$definitions[ WPDeskTrackerBridge::class ] = new AutowireDefinitionHelper();
+		}
+
+		if ( class_exists( \WPDesk\Logger\WC\WooCommerceHandler::class ) ) {
+			$definitions[ LoggerInterface::class ] = static function () use ( $plugin ) {
+				$logger = new Logger(
+					$plugin->get_slug(),
+					[],
+					[ new PsrLogMessageProcessor( null, true ), new UidProcessor() ]
+				);
+
+				$attach_handler = function () use ( $logger, $plugin ) {
+					$handler = new WooCommerceHandler( wc_get_logger(), $plugin->get_slug() );
+					$handler->setFormatter(
+						new LineFormatter( '%channel%.%level_name% [%extra.uid%]: %message% %context% %extra%' )
+					);
+					$logger->pushHandler( $handler );
+				};
+
+				if ( \function_exists( 'wc_get_logger' ) ) {
+					$attach_handler();
+				} else {
+					\add_action( 'woocommerce_init', $attach_handler );
+				}
+
+				return $logger;
+			};
+		}
+
+		$builder->add_definitions( $definitions );
+	}
+}
diff --git a/src/Extension/LoggerExtension.php b/src/Extension/LoggerExtension.php
deleted file mode 100644
index 15f0f2d..0000000
--- a/src/Extension/LoggerExtension.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace WPDesk\Init\Extension;
-
-use WPDesk\Init\Configuration\ReadableConfig;
-use WPDesk\Init\DependencyInjection\ContainerBuilder;
-use WPDesk\Init\Plugin\Plugin;
-
-class LoggerExtension {
-
-	public function build( ContainerBuilder $builder, Plugin $plugin, ReadableConfig $config ): void {
-		$builder->add_definitions(
-			[
-				LoggerInterface::class => new NullLogger(),
-			]
-		);
-	}
-}
-- 
GitLab