<?php

add_filter( 'em_booking_validate', 'custom_em_booking_validate', 10, 2 );

function custom_em_booking_validate( $result, $EM_Booking ) {

	$EM_Event = $EM_Booking->get_event();

	if ( empty( $EM_Event->event_attributes['dependent_event'] ) ) {
		return $result;
	}

	// Example:
	// 1,2,3
	$dependent_events = preg_split(
		'/\s*,\s*/',
		$EM_Event->event_attributes['dependent_event']
	);

	$has_booked_parent_event = false;
	$error_event = null;

	foreach ( $dependent_events as $event_id ) {

		$event_id = absint( trim( $event_id ) );

		if ( ! $event_id ) {
			continue;
		}

		$parent_event = em_get_event( $event_id );

		if ( empty( $parent_event->event_id ) ) {
			continue;
		}

		if ( ! $error_event ) {
			$error_event = $parent_event;
		}

		// OR logic.
		if ( static::has_booked( $parent_event ) ) {
			$has_booked_parent_event = true;
			break;
		}
	}

	// None of the dependent events were booked.
	if ( ! $has_booked_parent_event ) {

		if ( $error_event ) {
			$error = static::get_error_message( $error_event );
			$EM_Booking->add_error( $error );
		}

		$result = false;
	}

	return $result;
}