<?php

/**
 * Likes / Dislikes
 *
 * @link    https://plugins360.com
 * @since   3.6.1
 *
 * @package All_In_One_Video_Gallery
 */

// Exit if accessed directly
if ( ! defined( 'WPINC' ) ) {
	die;
}

/**
 * AIOVG_Public_Likes class.
 *
 * @since 3.6.1
 */
class AIOVG_Public_Likes {
	
	/**
	 * Get things started.
	 *
	 * @since 3.6.1
	 */
	public function __construct() {
		// Register shortcode(s)
		add_shortcode( 'aiovg_like_button', array( $this, 'run_shortcode_like_button' ) );
	}

	/**
	 * Run the shortcode [aiovg_like_button].
	 *
	 * @since  3.6.1
	 * @param  array  $attributes An associative array of attributes.
	 * @return string             Shortcode output.
	 */
	public function run_shortcode_like_button( $attributes ) {
		if ( ! is_array( $attributes ) ) {
			$attributes = array();
		}

		global $post;

		$post_id = 0;
		$content = '';
		
		if ( isset( $post ) ) {
			$post_id = $post->ID;
		}

		if ( isset( $attributes['id'] ) && ! empty( $attributes['id'] ) ) {
			$post_id = $attributes['id'];
		}

		if ( ! empty( $post_id ) ) {
			$post_id   = (int) $post_id;
			$post_type = get_post_type( $post_id );

			if ( 'aiovg_videos' == $post_type ) {
				wp_enqueue_script( AIOVG_PLUGIN_SLUG . '-likes' );
				
				$content = aiovg_get_like_button( $post_id );
			} 
		}

		return $content;		
	}	

	/**
	 * Get likes / dislikes info.
	 *
	 * @since 3.6.1
	 */
	public function ajax_callback_get_likes_dislikes_info() {
		check_ajax_referer( 'aiovg_ajax_nonce', 'security' );

		// Proceed safe
		$response = array( 
			'status'   => 'error', 
			'message'  => '', 
			'likes'    => 0, 			
			'dislikes' => 0, 
			'liked'    => false, 			
			'disliked' => false
		);
		
		$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;
		$user_id = isset( $_REQUEST['user_id'] ) ? (int) $_REQUEST['user_id'] : 0;
			
		if ( $post_id > 0 ) {
			$response['status']   = 'success';
			$response['likes']    = (int) get_post_meta( $post_id, 'likes', true );
			$response['dislikes'] = (int) get_post_meta( $post_id, 'dislikes', true );

			$liked    = array();	
			$disliked = array();			

			if ( $user_id > 0 ) {
				$liked    = (array) get_user_meta( $user_id, 'aiovg_videos_likes' );	
				$disliked = (array) get_user_meta( $user_id, 'aiovg_videos_dislikes' );		
			} else {
				$likes_settings = aiovg_get_option( 'aiovg_likes_settings' );

				if ( empty( $likes_settings['login_required_to_vote'] ) ) {
					if ( isset( $_COOKIE['aiovg_videos_likes'] ) ) {
						$liked = explode( '|', $_COOKIE['aiovg_videos_likes'] );
						$liked = array_map( 'intval', $liked );
					}
		
					if ( isset( $_COOKIE['aiovg_videos_dislikes'] ) ) {
						$disliked = explode( '|', $_COOKIE['aiovg_videos_dislikes'] );
						$disliked = array_map( 'intval', $disliked );
					}
				}
			}
		
			if ( in_array( $post_id, $liked ) ) {
				$response['liked'] = true;
			} elseif ( in_array( $post_id, $disliked ) ) {
				$response['disliked'] = true;
			}
		}
		
		// Output
		echo wp_json_encode( $response );
		wp_die();
	}

	/**
	 * Toggle likes.
	 *
	 * @since 3.6.1
	 */
	public function ajax_callback_toggle_likes() {
		check_ajax_referer( 'aiovg_ajax_nonce', 'security' );

		// Proceed safe
		$response = array( 
			'status'   => 'error', 
			'message'  => '', 
			'likes'    => 0, 			
			'dislikes' => 0, 
			'liked'    => false, 			
			'disliked' => false
 		);
		
		$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;
		$user_id = isset( $_REQUEST['user_id'] ) ? (int) $_REQUEST['user_id'] : 0;
		$action  = isset( $_REQUEST['context'] ) ? sanitize_text_field( $_REQUEST['context'] ) : '';		
			
		if ( $post_id > 0 ) {			
			$response['likes']    = (int) get_post_meta( $post_id, 'likes', true );
			$response['dislikes'] = (int) get_post_meta( $post_id, 'dislikes', true );

			// Add to Likes
			if ( 'add_to_likes' == $action ) {
				$likes = $this->add_to_likes( $response['likes'], $post_id, $user_id );

				if ( $likes != $response['likes'] ) {
					$response['status'] = 'success';
					$response['likes']  = $likes;		
					$response['liked']  = true;	
 				}
			} 
			
			// Remove from Likes
			if ( 'remove_from_likes' == $action ) {
				$likes = $this->remove_from_likes( $response['likes'], $post_id, $user_id );

				if ( $likes != $response['likes'] ) {
					$response['status'] = 'success';
					$response['likes']  = $likes;
				}
			}
			
			// Remove from Dislikes
			if ( 'success' == $response['status'] ) {
				$response['dislikes'] = $this->remove_from_dislikes( $response['dislikes'], $post_id, $user_id );
			}
		}
		
		// Output
		echo wp_json_encode( $response );
		wp_die();
	}

	/**
	 * Toggle dislikes.
	 *
	 * @since 3.6.1
	 */
	public function ajax_callback_toggle_dislikes() {
		check_ajax_referer( 'aiovg_ajax_nonce', 'security' );

		// Proceed safe
		$response = array( 
			'status'   => 'error', 
			'message'  => '', 
			'likes'    => 0, 			
			'dislikes' => 0, 
			'liked'    => false, 			
			'disliked' => false
		);
		
		$post_id = isset( $_REQUEST['post_id'] ) ? (int) $_REQUEST['post_id'] : 0;
		$user_id = isset( $_REQUEST['user_id'] ) ? (int) $_REQUEST['user_id'] : 0;
		$action  = isset( $_REQUEST['context'] ) ? sanitize_text_field( $_REQUEST['context'] ) : '';	

		if ( $post_id > 0 ) {			
			$response['likes']    = (int) get_post_meta( $post_id, 'likes', true );
			$response['dislikes'] = (int) get_post_meta( $post_id, 'dislikes', true );

			// Add to Dislikes
			if ( 'add_to_dislikes' == $action ) {
				$dislikes = $this->add_to_dislikes( $response['dislikes'], $post_id, $user_id );

				if ( $dislikes != $response['dislikes'] ) {
					$response['status']   = 'success';
					$response['dislikes'] = $dislikes;	
					$response['disliked'] = true;			
				}
			} 
			
			// Remove from Dislikes
			if ( 'remove_from_dislikes' == $action ) {
				$dislikes = $this->remove_from_dislikes( $response['dislikes'], $post_id, $user_id );

				if ( $dislikes != $response['dislikes'] ) {
					$response['status']   = 'success';
					$response['dislikes'] = $dislikes;
				}
			}
			
			// Remove from Likes
			if ( 'success' == $response['status'] ) {
				$response['likes'] = $this->remove_from_likes( $response['likes'], $post_id, $user_id );
			}
		}
		
		// Output
		echo wp_json_encode( $response );
		wp_die();
	}

	/**
	 * Add to likes.
	 *
	 * @since  3.6.1
	 * @access private
	 * @param  int     $likes   Current likes count.
	 * @param  int     $post_id Video post ID.
	 * @param  int     $user_id Current user ID.
	 * @return int     $likes   Updated likes count.
	 */
	private function add_to_likes( $likes, $post_id, $user_id ) {
		if ( $user_id > 0 ) {			
			$liked = (array) get_user_meta( $user_id, 'aiovg_videos_likes' );		

			if ( ! in_array( $post_id, $liked ) ) {
				add_user_meta( $user_id, 'aiovg_videos_likes', $post_id );

				$likes = $likes + 1;
				update_post_meta( $post_id, 'likes', $likes );
			}
		} else {
			$likes_settings = aiovg_get_option( 'aiovg_likes_settings' );

			if ( empty( $likes_settings['login_required_to_vote'] ) ) {
				$liked = array();

				if ( isset( $_COOKIE['aiovg_videos_likes'] ) ) {
					$liked = explode( '|', $_COOKIE['aiovg_videos_likes'] );
					$liked = array_map( 'intval', $liked );
				}

				if ( ! in_array( $post_id, $liked ) ) {
					$likes = $likes + 1;
					update_post_meta( $post_id, 'likes', $likes );
		
					// SetCookie
					$liked[] = $post_id;
					setcookie( 'aiovg_videos_likes', implode( '|', $liked ), time() + ( 86400 * 30 ), COOKIEPATH, COOKIE_DOMAIN );
				}	
			}
		}

		return $likes;
	}

	/**
	 * Add to dislikes.
	 *
	 * @since  3.6.1
	 * @access private
	 * @param  int     $dislikes Current dislikes count.
	 * @param  int     $post_id  Video post ID.
	 * @param  int     $user_id  Current user ID.
	 * @return int     $dislikes Total dislikes count.
	 */
	private function add_to_dislikes( $dislikes, $post_id, $user_id ) {
		if ( $user_id > 0 ) {			
			$disliked = (array) get_user_meta( $user_id, 'aiovg_videos_dislikes' );		

			if ( ! in_array( $post_id, $disliked ) ) {
				add_user_meta( $user_id, 'aiovg_videos_dislikes', $post_id );
				
				$dislikes = $dislikes + 1;
				update_post_meta( $post_id, 'dislikes', $dislikes );
			}
		} else {
			$likes_settings = aiovg_get_option( 'aiovg_likes_settings' );

			if ( empty( $likes_settings['login_required_to_vote'] ) ) {
				$disliked = array();

				if ( isset( $_COOKIE['aiovg_videos_dislikes'] ) ) {
					$disliked = explode( '|', $_COOKIE['aiovg_videos_dislikes'] );
					$disliked = array_map( 'intval', $disliked );
				}

				if ( ! in_array( $post_id, $disliked ) ) {
					$dislikes = $dislikes + 1;
					update_post_meta( $post_id, 'dislikes', $dislikes );
		
					// SetCookie
					$disliked[] = $post_id;
					setcookie( 'aiovg_videos_dislikes', implode( '|', $disliked ), time() + ( 86400 * 30 ), COOKIEPATH, COOKIE_DOMAIN );
				}	
			}
		}

		return $dislikes;
	}

	/**
	 * Remove from likes.
	 *
	 * @since  3.6.1
	 * @access private
	 * @param  int     $likes   Current likes count.
	 * @param  int     $post_id Video post ID.
	 * @param  int     $user_id Current user ID.
	 * @return int     $likes   Total likes count.
	 */
	private function remove_from_likes( $likes, $post_id, $user_id ) {
		if ( $user_id > 0 ) {			
			$liked = (array) get_user_meta( $user_id, 'aiovg_videos_likes' );		

			if ( in_array( $post_id, $liked ) ) {
				delete_user_meta( $user_id, 'aiovg_videos_likes', $post_id );
				
				$likes = max( 0, $likes - 1 );
				update_post_meta( $post_id, 'likes', $likes );
			}
		} else {
			$likes_settings = aiovg_get_option( 'aiovg_likes_settings' );

			if ( empty( $likes_settings['login_required_to_vote'] ) ) {
				$liked = array();

				if ( isset( $_COOKIE['aiovg_videos_likes'] ) ) {
					$liked = explode( '|', $_COOKIE['aiovg_videos_likes'] );
					$liked = array_map( 'intval', $liked );
				}

				if ( in_array( $post_id, $liked ) ) {
					$likes = max( 0, $likes - 1 );
					update_post_meta( $post_id, 'likes', $likes );
		
					// SetCookie
					if ( ( $key = array_search( $post_id, $liked ) ) !== false ) {
						unset( $liked[ $key ] );
					}

					setcookie( 'aiovg_videos_likes', implode( '|', $liked ), time() + ( 86400 * 30 ), COOKIEPATH, COOKIE_DOMAIN );
				}	
			}
		}

		return $likes;
	}

	/**
	 * Remove from dislikes.
	 *
	 * @since  3.6.1
	 * @access private
	 * @param  int     $dislikes Current dislikes count.
	 * @param  int     $post_id  Video post ID.
	 * @param  int     $user_id  Current user ID.
	 * @return int     $dislikes Total dislikes count.
	 */
	private function remove_from_dislikes( $dislikes, $post_id, $user_id ) {
		if ( $user_id > 0 ) {			
			$disliked = (array) get_user_meta( $user_id, 'aiovg_videos_dislikes' );		

			if ( in_array( $post_id, $disliked ) ) {
				delete_user_meta( $user_id, 'aiovg_videos_dislikes', $post_id );
				
				$dislikes = max( 0, $dislikes - 1 );
				update_post_meta( $post_id, 'dislikes', $dislikes );
			}
		} else {
			$likes_settings = aiovg_get_option( 'aiovg_likes_settings' );

			if ( empty( $likes_settings['login_required_to_vote'] ) ) {
				$disliked = array();

				if ( isset( $_COOKIE['aiovg_videos_dislikes'] ) ) {
					$disliked = explode( '|', $_COOKIE['aiovg_videos_dislikes'] );
					$disliked = array_map( 'intval', $disliked );
				}

				if ( in_array( $post_id, $disliked ) ) {
					$dislikes = max( 0, $dislikes - 1 );
					update_post_meta( $post_id, 'dislikes', $dislikes );
		
					// SetCookie
					if ( ( $key = array_search( $post_id, $disliked ) ) !== false ) {
						unset( $disliked[ $key ] );
					}

					setcookie( 'aiovg_videos_dislikes', implode( '|', $disliked ), time() + ( 86400 * 30 ), COOKIEPATH, COOKIE_DOMAIN );
				}	
			}
		}

		return $dislikes;
	}
	
}