<?php

/**
 * Class to manage the review made by the user.
 * The data are saved inside the wp_option table
 * 
 * @author     Time.ly Network Inc.
 *
 * @package    AI1ECCFG
 */
class Ai1ec_Review extends Ai1ec_Base {

	const EMAIL_FEEDBACK_DESTINATION = 'info@time.ly';
	const OPTION_KEY                 = '_ai1ec_review';
	const FEEDBACK_FIELD             = 'feedback';
	const RELEASE_DATE_FIELD         = 'release_date';
	const PUBLISHED_THRESHOLD        = 15;
	const FUTURE_EVENTS_THRESHOLD    = 3;
	const WEEK_OFFSET_SEC_FIELD      = 604800; //1 week in seconds (7 * 86400)

	/**
	 * review colletion.
	 *
	 * @var array
	 */
	protected $_review_items = array();

	/**
	 * Option class.
	 *
	 * @var Ai1ec_Option
	 */
	protected $_option;

	public function __construct( Ai1ec_Registry_Object $registry ) {
		parent::__construct( $registry );
		$this->_option       = $registry->get( 'model.option' );
		$this->_review_items = $this->_get_array( self::OPTION_KEY );
	}

	private function _get_array( $option_key ) {
		$items  = $this->_option->get( $option_key );
		if ( ! is_array( $items ) ) {
			$items = array();
		}
		return $items;
	}

	private function _get_field( $field_name, $default_value ) {
		if ( isset( $this->_review_items[$field_name] ) ) {
			$value = $this->_review_items[$field_name];
			if ( ai1ec_is_blank( $value ) ) {
				return $default_value;
			} else {
				return $value;
			}
		} else {
			return $default_value;
		}
	}

	protected function _save( array $values  ) {
		foreach ($values as $key => $value) {
			$this->_review_items[$key] = $value;	
		}
		$this->_option->set( self::OPTION_KEY, $this->_review_items );
		return true;
	}	

	protected function _is_show_box_review() {
		//only show for admins		
		if ( false === is_admin() ) {
			return false;
		}
		$user_id = get_current_user_id();
		if ( empty( $user_id ) ) {
			return false;
		}
		//if the user already gave his feedback does not ask him again
		if ( $this->_has_feedback( $user_id ) ) {	
			return false;
		}		
		$release_date_str = $this->_get_field( self::RELEASE_DATE_FIELD, '' );
		if ( ai1ec_is_blank( $release_date_str ) ) {
			//the first time this page is loaded is save the moment as the release date
			//to just ask the user a review after 2 weeks 
			$this->_save( array( 
					self::RELEASE_DATE_FIELD => $this->_registry->get( 'date.time' )->format()
				) );
			return false;
		} else {
			$current_time = $this->_registry->get( 'date.time' );
			$release_date = $this->_registry->get( 'date.time', $release_date_str );
			$diff_sec     = $release_date->diff_sec( $current_time );
			//verify is passed 2 weeks after we release this feature
			if ( $diff_sec < self::WEEK_OFFSET_SEC_FIELD ) {
				return false;
			}
		}
		//count the published events
		$event_count = count_user_posts( $user_id, AI1EC_POST_TYPE, true ); 
		if ( $event_count < self::PUBLISHED_THRESHOLD ) {
			return false;
		}
		//count the future events
		$count_future_events = apply_filters( 'ai1ec_count_future_events', $user_id );
		if ( $count_future_events < self::FUTURE_EVENTS_THRESHOLD ) {
			return false;
		}		
		return true;
	}

	public function get_content( $theme_loader ) {
		if ( $this->_is_show_box_review() ) {    
            $current_user = wp_get_current_user(); 
            $review_args = array();
            if ( $current_user instanceof WP_User ) {
                $review_args['contact_name']  = $current_user->display_name;
                $review_args['contact_email'] = $current_user->user_email;
            } else {
            	$review_args['contact_name']  = '';
            	$review_args['contact_email'] = '';
            }
            $review_args['site_url']  = get_option( 'siteurl' );
			$theme_loader             = $this->_registry->get( 'theme.loader' );
			return $theme_loader->get_file( 'box_ask_customer_review.php', $review_args, true )->get_content();   
		} else {
			return null;
		}
	}

	public function save_feedback_review() {
		$user_id = get_current_user_id();
		if ( empty( $user_id ) ) {
			throw new Exception( 'User not identified' );
		}
		if ( ai1ec_is_blank( $_POST['feedback'] ) ||
			!in_array( $_POST['feedback'], array( 'y', 'n' ) ) ) {
			throw new Exception( 'The field is not filled or invalid' );
		}
		$values = $this->_get_field( self::FEEDBACK_FIELD, null );
		if ( null === $values ) {
			$values = array();			
		}
		$values[ $user_id ] = $_POST['feedback'];
		$this->_save( array( 
				self::FEEDBACK_FIELD => $values
		) );
	}

	protected function _has_feedback( $user_id ) {
		$values = $this->_get_field( self::FEEDBACK_FIELD, null );
		if ( null === $values ) {
			return false;			
		}
		$user  = (string) $user_id;
		$value = isset( $values[$user] ) ? $values[$user] : '';
		return 0 === strcasecmp( 'y', $value ) || 0 === strcasecmp( 'n', $value );			
	}

	public function send_feedback_message() {
		if ( ai1ec_is_blank( $_POST['name'] ) ||
			ai1ec_is_blank( $_POST['email'] ) ||
			ai1ec_is_blank( $_POST['site'] ) || 
			ai1ec_is_blank( $_POST['message'] )
		) {
			throw new Exception( 'All fields are required' );			
		}
		$subject = __( 'Feedback provided by user', AI1EC_PLUGIN_NAME );
		$content = sprintf( '<b>%s:</b><br/>%s<br/><br/><b>%s:</b><br/>%s<br/><br/><b>%s:</b><br/>%s<br/><br/><b>%s:</b><br/>%s',
				__( 'Name', AI1EC_PLUGIN_NAME ),
				$_POST['name'],
				__( 'E-mail', AI1EC_PLUGIN_NAME ),
				$_POST['email'],
				__( 'Site URL', AI1EC_PLUGIN_NAME ),
				$_POST['site'],	
				__( 'Message', AI1EC_PLUGIN_NAME ),
				nl2br( $_POST['message'] )
			);
		$dispatcher = $this->_registry->get(
			'notification.email',
			$content,
			explode( ',', self::EMAIL_FEEDBACK_DESTINATION ),
			$subject
		);
		$headers = array( 
				'Content-type: text/html',
				sprintf( 'From: %s <%s>', $_POST['name'], $_POST['email'])
			); 
		if ( $dispatcher->send( $headers ) ) {
			$_POST['feedback'] = 'n';
			$this->save_feedback_review();
		}
	}
}
