class WDP_WCCP_Compatibility {
  const KEY = 'some_where_warm_wccp';
  const WDP_VERSION = '2.2.4';
  const TARGET_VERSION = '5.1.4';

  const KEYS = array(
    'composite_data',
    'composite_parent',
    'composite_children',
    'composite_item',
  );

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

  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 );
  }

  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 ) {
    return array_merge( $keys, self::KEYS );
  }

  public function wdp_skip_cart_item( $skip, $item, $product ) {
    if ( wc_cp_maybe_is_composited_order_item( $item ) ) {
      $skip = true;
    }

    return $skip;
  }

  public function wdp_cart_item_data_before_apply( $cart_item_data, $original_cart_item_data ) {
    foreach ( self::KEYS as $key ) {
      if ( isset( $original_cart_item_data[ $key ] ) ) {
        $cart_item_data[ $key ] = $original_cart_item_data[ $key ];
      }
    }

    if ( isset( $cart_item_data['composite_children'] ) ) {
      $cart_item_data['composite_children'] = array();
    }

    return $cart_item_data;
  }

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

$cmp = new WDP_WCCP_Compatibility();
if ( $cmp->is_required() ) {
  $cmp->install( null );
}