<?php
/**
 * Extends WP_Nav_Menu_Widget to provide a custom nav menu for P2s.
 */
namespace Automattic\P2\Themes\P2020;

use \Automattic\P2\Plugins\Core\Navigation;

class P2_Nav_Menu_Widget extends \WP_Nav_Menu_Widget {
	const WIDGET_ID_BASE = 'p2020-nav-menu-widget';

	public function __construct() {
		\WP_Widget::__construct(
			self::WIDGET_ID_BASE, // Base ID
			__( 'P2 Menu', 'p2020' ), // Name
			[
				'description'                 => __( 'Add a navigation menu to your sidebar.', 'p2020' ),
				'customize_selective_refresh' => true,
			]
		);

		add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
	}

	public function enqueue_scripts() {
		if ( is_active_widget( false, false, self::WIDGET_ID_BASE ) ||
			is_active_widget( false, false, 'monster' ) ||
			is_customize_preview()
		) {
			wp_enqueue_script(
				'p2020-sidebar-menu-toggler',
				get_template_directory_uri() . '/widgets/sidebar-menus/js/tree-toggler.js',
				[ 'jquery' ],
				filemtime( get_template_directory() . '/widgets/sidebar-menus/js/tree-toggler.js' ),
				true
			);
		}
	}

	/**
	 * Overrides WP_Nav_Menu_Widget::form().
	 */
	public function form( $instance ) {
		if ( ! isset( $instance['title'] ) ) {
			$instance['title'] = __( 'Links', 'p2020' );
		}

		// Guard against cases where a WP_Error object was assigned as
		// during sidebar redesign migration.
		if ( isset( $instance['nav_menu'] ) && is_wp_error( $instance['nav_menu'] ) ) {
			$instance['nav_menu'] = '';
		}

		parent::form( $instance );
	}

	/**
	 * Overrides WP_Nav_Menu_Widget::widget().
	 */
	public function widget( $args, $instance ) {
		if ( empty( $instance['nav_menu'] ) ) {
			return;
		}

		$nav_menu = wp_get_nav_menu_object( $instance['nav_menu'] );
		if ( ! $nav_menu ) {
			return;
		}

		// phpcs:disable WordPress.Security.EscapeOutput
		// Reason: HTML from theme
		echo $args['before_widget'];

		echo $this->widget_header( $args, $instance );
		echo $this->widget_content( $args, $instance );

		echo $args['after_widget'];
		// phpcs:enable WordPress.Security.EscapeOutput

		do_action( 'p2_widgets_stats', self::WIDGET_ID_BASE );
	}

	private function widget_header( $args, $instance ) {
		$simple_menu = null;
		if ( is_user_member_of_blog() && current_user_can( 'customize' ) ) {
			global $wp;
			$current_url         = add_query_arg( $wp->query_vars, home_url( $wp->request ) );
			$customizer_menu_url = add_query_arg(
				'return',
				rawurlencode( $current_url ),
				Navigation\Urls::get_customizer_menu_url()
			);

			$simple_menu = new Navigation\Simple_Menu( 'p2020-nav-menu-widget-menu', __( 'More', 'p2020' ) );
			$simple_menu->add_item( __( 'Manage Links', 'p2020' ), $customizer_menu_url );
		}

		// phpcs:disable WordPress.Security.EscapeOutput
		// Reason: HTML from theme
		echo $args['before_title'];

		$default_title = __( 'Links', 'p2020' );
		$title         = apply_filters( 'widget_title', $instance['title'] ?? $default_title );
		echo esc_html( $title );

		if ( $simple_menu ) {
			get_template_part(
				'partials/ellipsis-menu',
				$simple_menu->get_type(),
				[ 'simple_menu' => $simple_menu ],
			);
		}

		echo $args['after_title'];
		// phpcs:enable WordPress.Security.EscapeOutput
	}

	private function widget_content( $args, $instance ) {
		self::print_menu( $instance['nav_menu'] );
	}

	public static function print_menu( $nav_menu ) {
		$options = array(
			'fallback_cb'     => '',
			'menu'            => $nav_menu,
			'container'       => 'nav',
			'container_class' => 'p2020-nav-menu',
			'menu_class'      => 'menu-root',
			'menu_id'         => '',
		);

		add_filter( 'nav_menu_submenu_css_class', [ __CLASS__, 'collapse_subtrees' ] );
		add_filter( 'walker_nav_menu_start_el', [ __CLASS__, 'add_togglers' ] );

		wp_nav_menu( $options );
	}

	/**
	 * Filter: nav_menu_submenu_css_class
	 */
	public static function collapse_subtrees( $classes ) {
		$classes[] = 'is-collapsed';
		return $classes;
	}

	/**
	 * Filter: walker_nav_menu_start_el
	 */
	public static function add_togglers( $item_output ) {
		return <<<MENU_ITEM
<div class="menu-item-line">
	<button class="menu-item-toggler is-collapsed"></button>
	<div class="menu-item-links">
		$item_output
	</div>
</div>
MENU_ITEM;
	}
}