<?php
declare( strict_types=1 );

namespace WPDesk\Logger;

use Monolog\Handler\HandlerInterface;
use Monolog\Handler\NullHandler;
use Monolog\Logger;
use Monolog\Handler\ErrorLogHandler;
use WPDesk\Logger\WC\WooCommerceHandler;

final class SimpleLoggerFactory implements LoggerFactory {

	/** @var Settings */
	private $options;

	/** @var string */
	private $channel;

	/** @var Logger */
	private $logger;

	public function __construct( string $channel, Settings $options = null ) {
		$this->channel = $channel;
		$this->options = $options ?? new Settings();
	}

	public function getLogger( $name = null ): Logger {
		if ( $this->logger ) {
			return $this->logger;
		}

		$this->logger = new Logger( $this->channel );

		if ( $this->options->use_wc_log ) {
			if ( \function_exists( 'wc_get_logger' ) && \did_action( 'woocommerce_init' ) ) {
				$this->create_wc_handler();
			} else {
				\add_action( 'woocommerce_init', [ $this, 'create_wc_handler' ] );
			}
		}

		// Adding WooCommerce logger may have failed, if so add WP by default.
		if ( $this->options->use_wp_log || empty( $this->logger->getHandlers() ) ) {
			$this->logger->pushHandler( $this->get_wp_handler() );
		}

		return $this->logger;
	}

	/**
	 * @internal
	 */
	public function create_wc_handler() {
		while ( ! $this->options->use_wp_log && ! empty( $this->logger->getHandlers() ) ) {
			$this->logger->popHandler();
		}
		$this->logger->pushHandler(
			new WooCommerceHandler(
				\wc_get_logger(),
				$this->channel
			)
		);
	}

	private function get_wp_handler(): HandlerInterface {
		if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
			return new ErrorLogHandler( ErrorLogHandler::OPERATING_SYSTEM, $this->options->level );
		}

		return new NullHandler();
	}

}