<?php
/**
 * @param EM_Event $EM_Event
 */
function bp_em_group_event_save($result, $EM_Event){
	if( is_object($EM_Event) && !empty($EM_Event->event_id) ){
		if( !empty($_REQUEST['group_id']) && is_numeric($_REQUEST['group_id']) && bp_is_active('groups') ){
			//we have been requested an event creation tied to a group, so does this group exist, and does this person have admin rights to it?
			if( groups_is_user_admin(get_current_user_id(), $_REQUEST['group_id']) ){
				$EM_Event->group_id = $_REQUEST['group_id'];
			}
			if( !empty($EM_Event->group_id) ){	
				//if group is private, make it private
				$group = groups_get_group(array('group_id'=>$EM_Event->group_id));
				$is_member = groups_is_user_member(get_current_user_id(), $EM_Event->group_id) || groups_is_user_admin(get_current_user_id(), $EM_Event->group_id) || groups_is_user_mod(get_current_user_id(), $EM_Event->group_id);
				if( $group->status != 'public' && $is_member ){
					//Make sure event status is private and set post status to private
					global $wpdb;
					$EM_Event->event_private = 1;
					$wpdb->update($wpdb->posts, array('post_status'=>'private'), array('ID'=>$EM_Event->post_id));
					$wpdb->update(EM_EVENTS_TABLE, array('event_private'=>1), array('event_id'=>$EM_Event->event_id));
				}
			}
		}else{
			$EM_Event->group_id = null;
		}
	}
	return $result;
}
add_action('em_event_save','bp_em_group_event_save',1,2);

/**
 * @param boolean $result
 * @param EM_Event $EM_Event
 */
function bp_em_group_event_can_manage( $result, $EM_Event){
	if( !$result && !empty($EM_Event->group_id) && bp_is_active('groups') ){ //only override if already false, incase it's true
		if( groups_is_user_admin(get_current_user_id(),$EM_Event->group_id) && current_user_can('edit_events') ){
			//This user is an admin of the owner's group, so they can edit this event.
			return true;
		}
	}
	return $result;
}
add_filter('em_event_can_manage','bp_em_group_event_can_manage',1,2);


function bp_em_group_events_accepted_searches($searches){
	if( bp_is_active('groups') ){
		$searches[] = 'group';
	}
	return $searches;
}
add_filter('em_accepted_searches','bp_em_group_events_accepted_searches',1,1);

function bp_em_group_events_get_default_search($searches, $array){
	if( !empty($array['group']) && (is_numeric($array['group']) || $array['group'] == 'my' || $array['group'] == 'this') && bp_is_active('groups') ){
		if($array['group'] == 'this'){ //shows current group, if applicable
			if( is_numeric(bp_get_current_group_id()) ){
				$searches['group'] = bp_get_current_group_id();
			}
		}else{
			$searches['group'] = $array['group'];
		}
	}
	return $searches;
}
add_filter('em_events_get_default_search','bp_em_group_events_get_default_search',1,2);

/*
 * Privacy Functions
 */
function bp_em_group_events_build_sql_conditions( $conditions, $args ){
	if( !empty($args['group']) && is_numeric($args['group']) ){
		$conditions['group'] = "( `group_id`={$args['group']} )";
	}elseif( !empty($args['group']) && $args['group'] == 'my' ){
		$groups = groups_get_user_groups(get_current_user_id());
		if( count($groups) > 0 ){
			$conditions['group'] = "( `group_id` IN (".implode(',',$groups['groups']).") )";
		}
	}
	//deal with private groups and events
	if( is_user_logged_in() ){
		global $wpdb;
		//find out what private groups they belong to, and don't show private group events not in their memberships
		$group_ids = BP_Groups_Member::get_group_ids(get_current_user_id());
		if( $group_ids['total'] > 0){
			$conditions['group_privacy'] = "(`event_private`=0 OR (`event_private`=1 AND (`group_id` IS NULL OR `group_id` = 0)) OR (`event_private`=1 AND `group_id` IN (".implode(',',$group_ids['groups']).")))";
		}else{
			//find out what private groups they belong to, and don't show private group events not in their memberships
			$conditions['group_privacy'] = "(`event_private`=0 OR (`event_private`=1 AND (`group_id` IS NULL OR `group_id` = 0)))";
		} 
	}
	return $conditions;
}
add_filter('em_events_build_sql_conditions','bp_em_group_events_build_sql_conditions',1,2);

	
/**
 * Overrides the default post format of an event and can display an event as a page, which uses the page.php template.
 * @param string $template
 * @return string
 */
function bp_em_private_event_check($template){
	global $post, $wpdb, $wp_query, $bp;
	if( $post->post_type == EM_POST_TYPE_EVENT ){
		$EM_Event = em_get_event($post);
		//echo "<pre>"; print_r($EM_Event); echo "</pre>"; die();
		if( !empty($EM_Event->event_private) && !empty($EM_Event->group_id) ){
			if( is_user_logged_in() ){
				//make sure user is a member of this group, whether private or not, private groups just aren't shown to non-members of a group
				$id_lookup = $wpdb->get_var( $wpdb->prepare( "SELECT m.group_id FROM {$bp->groups->table_name_members} m WHERE m.group_id = %s AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $EM_Event->group_id, get_current_user_id() ) );
				if($id_lookup != $EM_Event->group_id){
					unset($post);
					$wp_query->set_404();
					$template = locate_template(array('404.php'),false);
				}
			}else{
				unset($post);
				$wp_query->set_404();
				$template = locate_template(array('404.php'),false);
			}
		}
	}
	return $template;
}
add_filter('single_template','bp_em_private_event_check',20);

/*
 * Admin Meta Boxes
 */
function bp_em_meta_boxes(){
	add_meta_box('em-event-group', __('Group Ownership','dbem'), 'bp_em_meta_box_group',EM_POST_TYPE_EVENT, 'side','low');
	add_meta_box('em-event-group', __('Group Ownership','dbem'), 'bp_em_meta_box_group','event-recurring', 'side','low');
}
add_action('add_meta_boxes', 'bp_em_meta_boxes');
	
function bp_em_meta_box_group(){
	em_locate_template('forms/event/group.php',true);
}