<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

/**
 * Plugin Name: WooCommerce Product Bundles
 * Plugin URI: https://woocommerce.com/products/product-bundles/
 * Author: SomewhereWarm
 *
 * Do not changing bundle prices
 *
 * Class WDP_WCPB_Compatibility
 */
class WDP_WCPB_Compatibility {
	const KEY = 'some_where_warm_wpb';
	const WDP_VERSION = '2.2.4';
	const TARGET_VERSION = '6.2.2';

	public function is_required() {
		return class_exists( 'WC_Bundles' );
	}

	public function admin_install() {
	}

	public function remove_admin_hooks() {
	}

	/**
	 * @param WDP_Price_Display $price_display
	 */
	public function install( $price_display ) {
		add_filter( 'wdp_save_cart_item_keys', array( $this, 'wdp_save_cart_item_keys' ), 10 );
//		add_filter( 'wdp_skip_cart_item', array( $this, 'wdp_skip_cart_item' ), 10, 3 );
		add_filter( 'wdp_cart_item_data_before_apply', array( $this, 'wdp_cart_item_data_before_apply' ), 10, 2 );
		add_filter( 'wdp_original_cart_item_data', array( $this, 'wdp_original_cart_item_data' ), 10, 1 );

		add_filter( 'wdp_prepare_cart_item', function ( $item, $wc_cart_item ) {
			/**
			 * @var WDP_Cart_Item $item
			 * @var array         $wc_cart_item
			 */
			if ( isset( $wc_cart_item['bundled_by'] ) ) {
				$item = new WDP_Cart_Item( $item->get_hash(), 0, $item->get_pos(), $item->get_qty() );
				$item->make_immutable();
			}

			return $item;
		}, 10, 2 );

		add_filter( 'wdp_internal_cart_items_before_apply', function ( $items, $cart ) {
			/**
			 * @var WDP_Cart_Item[] $items
			 * @var WDP_Cart        $cart
			 */
			foreach ( $items as $key => $item ) {
				$wc_cart_item = $cart->get_item_data_by_hash( $item->get_hash() );

				if ( isset( $wc_cart_item['bundled_by'] ) ) {
					unset( $items[ $key ] );
				}
			}

			return $items;
		}, 10, 2 );
	}

	public function remove_hooks() {
		remove_filter( 'wdp_save_cart_item_keys', array( $this, 'wdp_save_cart_item_keys' ), 10 );
		remove_filter( 'wdp_skip_cart_item', array( $this, 'wdp_skip_cart_item' ), 10 );
		remove_filter( 'wdp_cart_item_data_before_apply', array( $this, 'wdp_cart_item_data_before_apply' ), 10 );
		remove_filter( 'wdp_original_cart_item_data', array( $this, 'wdp_original_cart_item_data' ), 10 );
	}

	public function wdp_save_cart_item_keys( $keys ) {
		$keys[] = 'bundled_by';
		$keys[] = 'stamp';
		$keys[] = 'bundled_items';

		return $keys;
	}

	public function wdp_skip_cart_item( $skip, $item, $product ) {
		if ( isset( $item['bundled_by'] ) ) { // ignore product inside bundle
			$skip = true;
		}

		return $skip;
	}

	public function wdp_cart_item_data_before_apply( $cart_item_data, $original_cart_item_data ) {
		$original_cart_item_data['bundled_items'] = array();
		$cart_item_data = array_merge( $cart_item_data, $original_cart_item_data );

		return $cart_item_data;
	}

	public function wdp_original_cart_item_data( $original_cart_item_data ) {
		return array();
	}
}


$WDP_WCPB_comp = new WDP_WCPB_Compatibility();
if($WDP_WCPB_comp->is_required()) {
	$WDP_WCPB_comp->install(null);
}