<?php
class ModelCiReviewProCiReviews extends Model {

	public function getCiReviewAbuses($review_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_abuse WHERE review_id='". (int)$review_id ."' AND status=1");
		return $query->rows;
	}

	public function getCiReviewRating($review_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_rating WHERE review_id='". (int)$review_id ."' AND status=1");
		return $query->rows;

	}

	public function deleteCiReview($review_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview WHERE review_id='". (int)$review_id ."'");

		if($query->num_rows) {
		$this->db->query("DELETE FROM " . DB_PREFIX . "review WHERE review_id='". (int)$review_id ."'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview WHERE review_id='". (int)$review_id ."'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_rating WHERE review_id='". (int)$review_id ."'");

		$query2 = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_id='". (int)$query->row['cireview_id'] ."'");

		foreach($query2->rows as $cireview_image) {
			@unlink(DIR_IMAGE . $cireview_image['image']);
		}

		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_image WHERE cireview_id='". (int)$query->row['cireview_id'] ."'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_id='". (int)$query->row['cireview_id'] ."'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_vote WHERE review_id='". (int)$review_id ."'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_abuse WHERE review_id='". (int)$review_id ."'");

		/*31-10-2018 verify purchase info start*/
		/*If someone say after delete review, verified purchased customers can again give review, then we need to add little code here*/
		/*$this->db->query("UPDATE " . DB_PREFIX . "cireview_verify SET review=0, cireview_id=0, review_id=0 WHERE review_id='". (int)$review_id ."'");*/
		/*31-10-2018 verify purchase info end*/
		}
	}

	private function mkdir($dir) {
		if(!is_dir($dir)) {
			$oldmask = umask(0);
			mkdir($dir, 0777);
			umask($oldmask);
		}
	}

	public function copyCiReview($review_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "review WHERE review_id='". (int)$review_id ."'");
		if($query->num_rows) {

			$dir = 'catalog/cireviewpro_images/';

			if($this->config->get('cireviewpro_reviewimagespath')) {

				// remove trailing slah from path.
				if(substr($this->config->get('cireviewpro_reviewimagespath'), -1) == '/') {
				    $this->config->set('cireviewpro_reviewimagespath', substr($this->config->get('cireviewpro_reviewimagespath'), 0, -1));
				}

				$dir = $this->config->get('cireviewpro_reviewimagespath').'/';

			}

			$odir = $dir;
			$dirs = explode("/", $dir);

			$mkdir = '';
			foreach ($dirs as $key => $value) {
				$mkdir .= $value.'/';
				$this->mkdir(DIR_IMAGE . $mkdir);
			}


			$this->db->query("INSERT INTO " . DB_PREFIX . "review SET product_id='". $query->row['product_id'] ."', customer_id='". $query->row['customer_id'] ."', author='".  $this->db->escape($query->row['author']) ."', `text`='". $this->db->escape($query->row['text']) ."', rating='". $this->db->escape($query->row['rating']) ."', status='0', date_added='". $this->db->escape($query->row['date_added']) ."', date_modified='". $this->db->escape($query->row['date_modified']) ."'");

			$new_review_id = $this->db->getLastId();



			$ciquery = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview WHERE review_id='". (int)$review_id ."'");

			if($ciquery->num_rows) {

				/*insert new cireview*/
				/*12-09-2019 Vote Feature Update Starts*/
				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview SET review_id='". $new_review_id ."', product_id='". $ciquery->row['product_id'] ."', store_id='". $ciquery->row['store_id'] ."', language_id='". $ciquery->row['language_id'] ."', email='".  $this->db->escape($ciquery->row['email']) ."', `title`='". $this->db->escape($ciquery->row['title']) ."', comment='". $this->db->escape($ciquery->row['comment']) ."', coupon_code='". $this->db->escape($ciquery->row['coupon_code']) ."', coupon_id='". $this->db->escape($ciquery->row['coupon_id']) ."', reward_points='". $this->db->escape($ciquery->row['reward_points']) ."', customer_reward_id='". $this->db->escape($ciquery->row['customer_reward_id']) ."', votes_up='". $ciquery->row['votes_up'] ."', votes_down='". $ciquery->row['votes_down'] ."'");
				/*12-09-2019 Vote Feature Update Ends*/

				$new_cireview_id = $this->db->getLastId();


				$cireview_image_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_id='". (int)$ciquery->row['cireview_id'] ."'");


				$new_cireview_image_ids = array();
				$new_cireview_image_description_ids = array();
				if($cireview_image_query->num_rows) {
					foreach($cireview_image_query->rows as $cireview_image_row) {

						/*insert new cireview_image*/
						/*rename image and create new image. in case orginal review delete, script will delete image froms server too.thus copied review will not show image. prevent this by creating copy of image at server.*/

						$i = 0;

						$pathfinfo = pathinfo($cireview_image_row['image']);

						do {
							$filename = $pathfinfo['filename'] . $i .'.'. $pathfinfo['extension'];

							$i++;
						} while(file_exists(DIR_IMAGE . $dir . $filename));

						copy(DIR_IMAGE . $cireview_image_row['image'], DIR_IMAGE . $dir . $filename);

						$cireview_image = $dir . $filename;

						$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_image SET cireview_id='". $new_cireview_id ."', image='".  $this->db->escape($cireview_image) ."', mask='".  $this->db->escape($cireview_image_row['mask']) ."', ext='".  $this->db->escape($cireview_image_row['ext']) ."', `sort_order`='". $this->db->escape($cireview_image_row['sort_order']) ."', session_id='". $this->db->escape($cireview_image_row['session_id']) ."', status='". $this->db->escape($cireview_image_row['status']) ."'");

						$new_cireview_image_ids[] = $new_cireview_image_id = $this->db->getLastId();

						$cireview_image_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_id='". (int)$ciquery->row['cireview_id'] ."' AND cireview_image_id='". (int)$cireview_image_row['cireview_image_id'] ."'");

						if($cireview_image_description_query->num_rows) {
							foreach ($cireview_image_description_query->rows as $cireview_image_description_row) {

								/*insert new cireview_image_description*/
								$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_image_description SET cireview_image_id='". $new_cireview_image_id ."', cireview_id='". $new_cireview_id ."', language_id='".  $this->db->escape($cireview_image_description_row['language_id']) ."', `title`='". $this->db->escape($cireview_image_description_row['title']) ."', alt='". $this->db->escape($cireview_image_description_row['alt']) ."'");

								$new_cireview_image_description_ids[$new_cireview_image_id][] = $this->db->getLastId();

							}
						}
					}
				}

				$new_cireview_rating_ids = array();
				$cireview_rating_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_rating WHERE cireview_id='". (int)$ciquery->row['cireview_id'] ."' AND review_id='". (int)$review_id ."' AND product_id='". (int)$query->row['product_id'] ."'");

				if($cireview_rating_query->num_rows) {
					foreach ($cireview_rating_query->rows as $cireview_rating_row) {

						/*insert new cireview_rating*/
						$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_rating SET cireview_id='". $new_cireview_id ."', review_id='".  $this->db->escape($new_review_id) ."', `product_id`='". $this->db->escape($cireview_rating_row['product_id']) ."', `ciratingtype_id`='". $this->db->escape($cireview_rating_row['ciratingtype_id']) ."', `ciratingtype_name`='". $this->db->escape($cireview_rating_row['ciratingtype_name']) ."', `rating`='". $this->db->escape($cireview_rating_row['rating']) ."', `status`='". $this->db->escape($cireview_rating_row['status']) ."'");

						$new_cireview_rating_ids[] = $this->db->getLastId();

					}
				}

				/*12-09-2019 Vote Feature Update Starts*/
				/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
				/*$new_cireview_vote_ids = array();
				$cireview_vote_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_vote WHERE cireview_id='". (int)$ciquery->row['cireview_id'] ."' AND review_id='". (int)$review_id ."' AND product_id='". (int)$query->row['product_id'] ."'");

				if($cireview_vote_query->num_rows) {
					foreach ($cireview_vote_query->rows as $cireview_vote_row) {

						/*insert new cireview_vote*/
				/*		$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_vote SET cireview_id='". $new_cireview_id ."', review_id='".  $this->db->escape($new_review_id) ."', `product_id`='". $this->db->escape($cireview_vote_row['product_id']) ."', `customer_id`='". $this->db->escape($cireview_vote_row['customer_id']) ."', `author`='". $this->db->escape($cireview_vote_row['author']) ."', `vote`='". $this->db->escape($cireview_vote_row['vote']) ."', `status`='". $this->db->escape($cireview_vote_row['status']) ."', `session_id`='". $this->db->escape($cireview_vote_row['session_id']) ."', `date_added`='". $this->db->escape($cireview_vote_row['date_added']) ."', `date_modified`='". $this->db->escape($cireview_vote_row['date_modified']) ."'");

						$new_cireview_vote_ids[] = $this->db->getLastId();

					}

				}*/

				/*12-09-2019 Vote Feature Update Ends*/

			}
		}
	}

	public function getCiReviewImages($cireview_id=0) {
		$sql = "SELECT * FROM " . DB_PREFIX . "cireview_image WHERE status=1";

		if($cireview_id!=0) {
			$sql .= " AND cireview_id='". (int)$cireview_id ."' ";
		} else {
			$sql .= " AND session_id='". $this->db->escape($this->session->getId()) ."' AND cireview_id='0'";
		}
		$query = $this->db->query($sql);
		return $query->rows;
	}

	public function getCiReviewImagesByIds($cireview_image_ids) {
		$sql = "SELECT * FROM " . DB_PREFIX . "cireview_image WHERE status=1 AND cireview_image_id IN(".  $cireview_image_ids .")";
		$query = $this->db->query($sql);
		return $query->rows;
	}

	public function getCiReviewImagesDescriptions($cireview_image_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_image_id='".  (int)$cireview_image_id ."'");

		$data = array();

		foreach($query->rows as $row) {
			$data[$row['language_id']] = $row;
		}

		return $data;
	}

	public function addUpload($image, $cireview_id) {
		$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_image SET image='". $this->db->escape($image) ."', session_id='". $this->db->escape($this->session->getId()) ."', status='1', cireview_id='".(int)$cireview_id ."'");

		$cireview_image_id = $this->db->getLastId();

		$this->load->model('localisation/language');
		$languages = $this->model_localisation_language->getLanguages();

		foreach($languages as $language) {
			$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_image_description SET cireview_image_id='". (int)$cireview_image_id ."', cireview_id='".(int)$cireview_id ."', language_id='". (int)$language['language_id'] ."', title='". $this->db->escape(basename($image)) ."', alt='". $this->db->escape(basename($image)) ."', session_id='". $this->db->escape($this->session->getId()) ."'");
		}

		return $cireview_image_id;
	}

	public function getUploadedImage($cireview_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_id='".(int)$cireview_id ."' AND status=1");
		/*AND session_id='". $this->db->escape($this->session->getId()) ."'*/
		return $query->rows;
	}

	public function removeAbuse($cireview_abuse_id, $review_id) {

		$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_abuse WHERE cireview_abuse_id='".(int)$cireview_abuse_id ."' AND review_id='".(int)$review_id ."'");
	}

	public function removeUpload($cireview_image_id) {
		$cireview_image_info = $this->getCiReviewImage($cireview_image_id);
		if($cireview_image_info){
			@unlink(DIR_IMAGE . $cireview_image_info['image']);
			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_image WHERE cireview_image_id='". $this->db->escape($cireview_image_id) ."'");
			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_image_id='". $this->db->escape($cireview_image_id) ."'");
		}
	}

	public function getCiReviewImage($cireview_image_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_image_id='". (int)$cireview_image_id ."' AND status=1");
		return $query->row;
	}

	public function stripTags($text) {
		$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
		return strip_tags($text);
	}

	public function addCiReview($data) {

		$data['author'] = $this->stripTags($data['author']);
		$data['text'] = $this->stripTags($data['text']);
		$data['date_added'] = $this->stripTags($data['date_added']);
		$data['email'] = $this->stripTags($data['email']);
		$data['title'] = $this->stripTags($data['title']);
		$data['comment'] = $this->stripTags($data['comment']);
		$data['cireview_image'] = $this->stripTags($data['cireview_image']);

		$this->db->query("INSERT INTO " . DB_PREFIX . "review SET author = '" . $this->db->escape($data['author']) . "', product_id = '" . (int)$data['product_id'] . "', status = '" . (int)$data['status'] . "', text = '" . $this->db->escape($data['text']) . "', date_added = '" . $this->db->escape($data['date_added']) . "'");

		$review_id = $this->db->getLastId();

		/*12-09-2019 Vote Feature Update Starts*/
		// fverif task start
		// add , fverify column data
		$this->db->query("INSERT INTO " . DB_PREFIX . "cireview SET email = '" . $this->db->escape($data['email']) . "', title = '" . $this->db->escape($data['title']) . "', store_id = '" .  (int)$data['store_id'] . "', language_id = '" .  (int)$data['language_id'] . "', comment = '" . $this->db->escape($data['comment']) . "', product_id = '" . (int)$data['product_id'] . "', review_id = '" . (int)$review_id . "', imp = '" . (isset($data['imp']) ? (int)$data['imp'] : '') . "', fverify = '" . (isset($data['fverify']) ? (int)$data['fverify'] : '0') . "', votes_up = '" . (int)$data['votes_up'] . "', votes_down = '" . (int)$data['votes_down'] . "'");
		// fverif task end
		/*12-09-2019 Vote Feature Update Ends*/

		$cireview_id = $this->db->getLastId();

		$this->db->query("UPDATE " . DB_PREFIX . "cireview_image SET cireview_id = '" . (int)$cireview_id . "' WHERE session_id = '" . $this->db->escape($this->session->getId()) . "' AND cireview_id='0'");
		$this->db->query("UPDATE " . DB_PREFIX . "cireview_image_description SET cireview_id = '" . (int)$cireview_id . "' WHERE session_id = '" . $this->db->escape($this->session->getId()) . "' AND cireview_id='0'");

		if(!empty($data['cireview_image'])) {
			$this->db->query("UPDATE " . DB_PREFIX . "cireview_image SET cireview_id = '" . (int)$cireview_id . "' WHERE cireview_image_id IN(". $data['cireview_image'] .") AND cireview_id='0'");
			$this->db->query("UPDATE " . DB_PREFIX . "cireview_image_description SET cireview_id = '" . (int)$cireview_id . "' WHERE cireview_image_id IN(". $data['cireview_image'] .") AND cireview_id='0'");
		}

		if(!empty($data['attach_image'])) {

			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_id = '" . (int)$cireview_id . "'");

			foreach ((array)$data['attach_image'] as $cireview_image_id => $value) {


				$cireview_image_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_image_id='". (int)$cireview_image_id ."'");

				if($cireview_image_query->num_rows) {
				foreach ($value['description'] as $language_id => $description) {

					$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_image_description SET title = '" . $this->db->escape($description['title']) . "', alt = '" . $this->db->escape($description['alt']) . "', cireview_image_id='". (int)$cireview_image_id ."', language_id='". (int)$language_id ."', session_id='". $this->db->escape($cireview_image_query->row['session_id']) ."', cireview_id='". (int)$cireview_image_query->row['cireview_id'] ."'");
				}
				}

			}
		}


		if(isset($data['rating'])) {
			$rating = 0;
			$ratings = 0;

			$this->load->model('cireviewpro/ciratingtype');

			foreach($data['rating'] as $ciratingtype_id => $cirating) {
				$ratingtype_info = $this->model_cireviewpro_ciratingtype->getCiRatingTypeDescriptions($ciratingtype_id);
				if($ratingtype_info) {
				$ratings += $cirating;

				$ciratingtype_names = array();
				$ciratingtype_name = '';
				foreach ($ratingtype_info as $key => $value) {
					$ciratingtype_names[$value['language_id']] = $value['name'];
					if($value['language_id'] == $this->config->get('config_language_id')) {
						$ciratingtype_name = $value['name'];

					}
				}

				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_rating SET  product_id = '" . (int)$data['product_id'] . "', status = '1', rating = '" . (int)$cirating . "', review_id = '" . (int)$review_id . "', cireview_id = '" . (int)$cireview_id . "', ciratingtype_id = '" . (int)$ciratingtype_id . "', ciratingtype_name = '" . ($this->db->escape(json_encode($ciratingtype_names))) . "'");

				}

			}

			if($ratings) {
				$rating = $ratings / count($data['rating']);
			}

			$this->db->query("UPDATE " . DB_PREFIX . "review SET rating = '" . (int)$rating . "' WHERE review_id = '" . (int)$review_id . "'");

		}
		/*12-09-2019 Vote Feature Update Starts*/
		/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
		/*if(isset($data['votes_up'])) {
			$data['votes_up'] = intval($data['votes_up']);

			// get previous votes up and update only if news
			// if lesser votes_up admin want but we have more then delete extra
			// if greater votes_up admin want then add extras

			$cireview_vote_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='1' AND status='1'");

			// max_allowed_packet
			// show variables like 'max_allowed_packet'

						//

			// SET GLOBAL max_allowed_packet=524288000;


			// Tuning bulk_insert_buffer_size may make the operation go faster, but will work regardless of the value.

			// key_buffer_size has to do with read caching.

			$cireview_vote = $cireview_vote_info->rows;
			$cireviewvotes = $cireview_vote_info->rows;

			foreach ($cireviewvotes as &$value) {
				$value['product_id'] = $data['product_id'];
				if(empty($value['session_id'])) {
					$value['session_id'] = $this->session->getId();
				}
			}

			$requirement = false;
			// we have more votes than admin want
			if(count($cireview_vote) > $data['votes_up']) {
				$cireviewvotes = array_slice($cireviewvotes, 0, (int)$data['votes_up']);

				this code was buggy. when user want lesser votes but in database votes are more then desier votes
				if($cireview_vote) {
					foreach($cireview_vote as $cireviewvote) {
						$cireviewvote['product_id'] = $data['product_id'];
						$cireviewvotes[] = $cireviewvote;
					}
				} else {
					$cireviewvotes = array();
				}
			}

			// we have less votes than admin want
			if(count($cireview_vote) < $data['votes_up']) {
				$dummy = $data['votes_up'] - count($cireview_vote);
				$requirement = true;
				for($i=0;$i<$dummy;$i++) {
					$cireviewvotes[] = array(
						'cireview_vote_id' => 0,
						'cireview_id' => $cireview_id,
						'review_id' => $review_id,
						'product_id' => $data['product_id'],
						'customer_id' => 0,
						'author' => '',
						'vote' => 1,
						'status' => 1,
						'session_id' => $this->session->getId(),
						'date_added' => date('Y-m-d H:i:s'),
						'date_modified' => date('Y-m-d H:i:s'),
					);
				}
			}


			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='1' AND status='1'");
			foreach($cireviewvotes as $cireviewvote) {
				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_vote SET cireview_vote_id = '" . (int)$cireviewvote['cireview_vote_id'] . "', cireview_id = '" . (int)$cireviewvote['cireview_id'] . "', review_id = '" . (int)$cireviewvote['review_id'] . "', product_id = '" . (int)$cireviewvote['product_id'] . "', customer_id = '" . (int)$cireviewvote['customer_id'] . "', status = '". (int)$cireviewvote['status'] ."', author = '" . $this->db->escape($cireviewvote['author']) . "', session_id = '" . $this->db->escape($cireviewvote['session_id']) . "', date_added='". $this->db->escape($cireviewvote['date_added']) ."', vote='". (int)$cireviewvote['vote'] ."'");
			}


		}*/

		/*if(isset($data['votes_down'])) {
			// get previous votes up and update only if news
			// if lesser votes_down admin want but we have more then delete extra
			// if greater votes_down admin want then add extras

			$cireview_vote_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='0' AND status='1'");


			$cireview_vote = $cireview_vote_info->rows;
			$cireviewvotes = $cireview_vote_info->rows;

			foreach ($cireviewvotes as &$value) {
				$value['product_id'] = $data['product_id'];
				if(empty($value['session_id'])) {
					$value['session_id'] = $this->session->getId();
				}
			}

			$requirement = false;
			// we have more votes than admin want
			if(count($cireview_vote) > $data['votes_down']) {
				$cireviewvotes = array_slice($cireviewvotes, 0, (int)$data['votes_down']);
				/*
				this code was buggy. when user want lesser votes but in database votes are more then desier votes
				if($cireview_vote) {
					foreach($cireview_vote as $cireviewvote) {
						$cireviewvote['product_id'] = $data['product_id'];
						$cireviewvotes[] = $cireviewvote;
					}
				} else {
					$cireviewvotes = array();
				}*/
		/*	}

			// we have less votes than admin want
			if(count($cireview_vote) < $data['votes_down']) {
				$dummy = $data['votes_down'] - count($cireview_vote);
				$requirement = true;
				for($i=0;$i<$dummy;$i++) {
					$cireviewvotes[] = array(
						'cireview_vote_id' => 0,
						'cireview_id' => $cireview_id,
						'review_id' => $review_id,
						'product_id' => $data['product_id'],
						'customer_id' => 0,
						'author' => '',
						'vote' => 0,
						'status' => 1,
						'session_id' => $this->session->getId(),
						'date_added' => date('Y-m-d H:i:s'),
						'date_modified' => date('Y-m-d H:i:s'),
					);
				}
			}


			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='0' AND status='1'");


			foreach($cireviewvotes as $cireviewvote) {
				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_vote SET cireview_vote_id = '" . (int)$cireviewvote['cireview_vote_id'] . "', cireview_id = '" . (int)$cireviewvote['cireview_id'] . "', review_id = '" . (int)$cireviewvote['review_id'] . "', product_id = '" . (int)$cireviewvote['product_id'] . "', customer_id = '" . (int)$cireviewvote['customer_id'] . "', status = '". (int)$cireviewvote['status'] ."', author = '" . $this->db->escape($cireviewvote['author']) . "', session_id = '" . $this->db->escape($cireviewvote['session_id']) . "', date_added='". $this->db->escape($cireviewvote['date_added']) ."', vote='". (int)$cireviewvote['vote'] ."'");

			}
		}*/
		/*12-09-2019 Vote Feature Update Ends*/
		// if exist $data.review_approve then go inside function
		$this->reviewApproveEmail($review_id, $data);

		return $review_id;
	}

	// review approve email starts

	// admin functions are here just because of store_id in reveiws and language_id starts

	private function getProduct($product_id, $data) {
		$query = $this->db->query("SELECT DISTINCT *, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$data['customer_group_id'] . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$data['language_id'] . "'");

		return $query->row;
	}
	private function getCategory($category_id, $language_id) {
		$query = $this->db->query("SELECT DISTINCT *, (SELECT GROUP_CONCAT(cd1.name ORDER BY level SEPARATOR '&nbsp;&nbsp;&gt;&nbsp;&nbsp;') FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (cp.path_id = cd1.category_id AND cp.category_id != cp.path_id) WHERE cp.category_id = c.category_id AND cd1.language_id = '" . (int)$language_id . "' GROUP BY cp.category_id) AS path FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (c.category_id = cd2.category_id) WHERE c.category_id = '" . (int)$category_id . "' AND cd2.language_id = '" . (int)$language_id . "'");

		return $query->row;
	}
	//
	public function getImage($image_new) {
		$image_new = str_replace(' ', '%20', $image_new);  // fix bug when attach image on email (gmail.com). it is automatic changing space " " to +

		if ($this->request->server['HTTPS']) {
			return HTTPS_CATALOG . 'image/' . $image_new;
		} else {
			return HTTP_CATALOG . 'image/' . $image_new;
		}
	}
	// admin functions are here just because of store_id in reveiws and language_id ends
	// front cireviewpro model functions starts
	private function mailHeader($title) {
		$html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd">';
		$html .= '<html>';
		$html .= '<head>';
		$html .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
		$html .= '<title>'.$title .'</title>';
		$html .= '</head>';
		$html .= '<body style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #000000;">';
		$html .= '<div style="width: 680px;">';
		return $html;

	}

	private function mailFooter() {
		$html = '</div>';
		$html .= '</body>';
		$html .= '</html>';
		return $html;
	}

	private function promoProduct($products, &$review_front_language) {
		$text_tax = $review_front_language->get('text_tax');
		$html = '';
		if($products) {
		$html .= '<ul style="list-style: none;">';
			foreach($products as $product) {
		$html .= '	<li style="float: left; margin-right: 15px; margin-bottom: 20px; width: 100px; border: 1px solid #ddd; padding: 5px; overflow: auto;">';
		$html .= '	  <img style="max-width: 100%;" src="'.$product['thumb'].'" alt="'.$product['name'].'" />';
		$html .= '	    <h3 style="font-size: 18px; color: #444; font-weight: 600; margin-bottom: 10px; margin-top: 10px;">'.$product['name'].'</h3>';
			    if ($product['price']) {
		$html .= '	    <p style="margin-bottom: 10px; color: #444;">';
			      if (!$product['special']) {
		$html .=	      $product['price'];
			      } else {
		$html .= '	      <span style="font-weight: 600;">'.$product['special'].'</span> <span style="color: #999; text-decoration: line-through; margin-left: 10px;">'.$product['price'].'</span>';
			      }
			      if ($product['tax']) {
		$html .= '	      <span style="color: #999; font-size: 12px; display: block;">'.$text_tax.' '.$product['tax'].'</span>';
			      }
		$html .= '	    </p>';
			    }
		$html .= '	</li>';
			}
		$html .= '	</ul> <br style="clear: both;">  ';
			}

		return $html;
	}

	private function promoCategory($categories, &$review_front_language) {
		$html = '';
		if($categories) {

		$html .= '<ul style="list-style: none;">';
		foreach($categories as $category) {
		$html .= '<li style="float: left; margin-right: 15px; margin-bottom: 20px; width: 100px; border: 1px solid #ddd; padding: 5px; overflow: auto;">';
		$html .= '  <img style="max-width: 100%;" src="'. $category['thumb'].'" alt="'. $category['name'].'" />';
		$html .= '    <h3 style="font-size: 18px; color: #444; font-weight: 600; margin-bottom: 10px; margin-top: 10px;">'. $category['name'].'</h3>';
		$html .= '</li>';
		}
		$html .= '</ul> <br style="clear: both;"> ';
		}
		return $html;
	}

	private function promoManufacturer($manufacturers, &$review_front_language) {
		$html = '';
		if($manufacturers) {

		$html .= '<ul style="list-style: none;">';
		foreach($manufacturers as $manufacturer) {
		$html .= '<li style="float: left; margin-right: 15px; margin-bottom: 20px; width: 100px; border: 1px solid #ddd; padding: 5px; overflow: auto;">';
		$html .= '  <img style="max-width: 100%;" src="'. $manufacturer['thumb'].'" alt="'. $manufacturer['name'].'" />';
		$html .= '    <h3 style="font-size: 18px; color: #444; font-weight: 600; margin-bottom: 10px; margin-top: 10px;">'. $manufacturer['name'].'</h3>';
		$html .= '</li>';
		}
		$html .= '</ul> <br style="clear: both;"> ';
		}
		return $html;
	}

	public function getCategoryPath($category_id) {
		$query = $this->db->query("SELECT * FROM `". DB_PREFIX ."category_path` WHERE category_id='". (int)$category_id ."' AND path_id <> '". (int)$category_id ."' ORDER BY level ASC ");
		return $query;
	}
	// front cireviewpro model functions ends

	private function reviewApproveEmail($review_id, $data) {

		if (isset($data['review_approve']) && $data['review_approve'] == 1) {

			$review_query = $this->db->query("SELECT * FROM ". DB_PREFIX ."review r LEFT JOIN ". DB_PREFIX ."cireview cr ON(cr.review_id=r.review_id) WHERE cr.review_id='". (int)$review_id ."' AND r.status=1");

			if (!$review_query->num_rows) {
				return '';
			}

			$data['product_id'] = $review_query->row['product_id'];
			$data['language_id'] = $review_query->row['language_id'];
			$data['store_id'] = $review_query->row['store_id'];
			$data['author'] = $review_query->row['author'];
			$data['email'] = $review_query->row['email'];
			$data['title'] = $review_query->row['title'];
			$data['text'] = $review_query->row['text'];
			$data['ciemail'] = $review_query->row['email'];

			$product_id = $data['product_id'];
			$cireview_id = 0;

			$data['reward_points'] = '';
			$data['coupon_code'] = '';

			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview WHERE review_id = '" . (int)$review_id . "'");
			if ($query->num_rows) {
				$cireview_id = $query->row['cireview_id'];
				$data['reward_points'] = $query->row['reward_points'];
				$data['coupon_code'] = $query->row['coupon_code'];
			}

			if (!(int)$data['language_id']) {
				$data['language_id'] = (int)$this->config->get('config_language_id');
			}

			$front_config_language = $this->config->get('config_language');

			$review_front_config = new Config();

			$this->load->model('setting/setting');
			$results = $this->model_setting_setting->getSetting('config', (int)$data['store_id']);

			foreach ($results as $key => $setting) {
				$review_front_config->set($key, $setting);
			}
			$results = $this->model_setting_setting->getSetting('cireviewpro', (int)$data['store_id']);
			foreach ($results as $key => $setting) {
				$review_front_config->set($key, $setting);
			}

			// get language code from language id
			// Language
			$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "language` WHERE language_id = '" . (int)$data['language_id'] . "'");
			if ($query->num_rows) {

				$front_config_language = $query->row['code'];
				$review_front_config->set('config_language', $front_config_language);

			}

			$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "language` WHERE code = '" . $this->db->escape($review_front_config->get('config_language')) . "'");
			if ($query->num_rows) {
				$review_front_config->set('config_language_id', $query->row['language_id']);
			}

			// Language
			$review_front_language = new Language($review_front_config->get('config_admin_language'));
			$review_front_language->load($review_front_config->get('config_admin_language'));
			$review_front_language->load('cireviewpro/cireviews_language');

			if (!$review_front_config->get('config_ssl')) {
				$review_front_config->set('config_ssl', HTTPS_CATALOG);
			}
			if (!$review_front_config->get('config_url')) {
				$review_front_config->set('config_url', HTTP_CATALOG);
			}
			if (!$review_front_config->get('site_ssl')) {
				$review_front_config->set('site_ssl', HTTPS_CATALOG);
			}
			if (!$review_front_config->get('site_url')) {
				$review_front_config->set('site_url', HTTP_CATALOG);
			}

			$front_url = new Url($review_front_config->get('site_url'), $review_front_config->get('site_ssl'));

			// set config_customer_group_id based on customer_id
			if ($review_query->row['customer_id']) {
				// get customer customer group id
				$customer_query = $this->db->query("SELECT customer_group_id FROM " . DB_PREFIX . "customer WHERE customer_id = '" . (int)$review_query->row['customer_id'] . "'");
				if ($customer_query->num_rows) {
					$review_front_config->set('config_customer_group_id', $customer_query->row['customer_group_id']);
				}
			}


			$this->load->model('catalog/product');
			$this->load->model('catalog/category');
			$this->load->model('catalog/manufacturer');
			$this->load->model('tool/image');

			$review = array();
			$review['author'] = $data['author'];
			$review['email'] = $data['email'];
			$review['title'] = $data['title'];
			$review['text'] = $data['text'];
			$review['rating'] = '';
			$review['all_rating'] = '';
			$review['attachment'] = '';
			$attachments = array();

			if($review_front_config->get('cireviewpro_rating')) {

				$query = $this->db->query("SELECT cirr.rating, cirr.ciratingtype_name, crtd.name FROM " . DB_PREFIX . "cireview_rating cirr LEFT JOIN " . DB_PREFIX . "ciratingtype crt ON(crt.ciratingtype_id=cirr.ciratingtype_id) LEFT JOIN " . DB_PREFIX . "ciratingtype_description crtd ON(crtd.ciratingtype_id=crt.ciratingtype_id) WHERE crt.status=1 AND crtd.language_id = '" . (int)$review_front_config->get('config_language_id') . "' AND  cirr.review_id = '" . (int)$review_id . "' AND cirr.product_id = '" . (int)$product_id . "'");
				if ($query->num_rows) {
					foreach ($query->rows as $value) {
						$ciratingtype_name = $value['name'];

						// try to get name from the json array, may be rating type get deleted
						if (empty($ciratingtype_name) && !empty($value['ciratingtype_name'])) {

							$ciratingtype_names =json_decode($value['ciratingtype_name'], 1);

							if (isset($ciratingtype_names[(int)$review_front_config->get('config_language_id')])) {

								$ciratingtype_name = $ciratingtype_names[(int)$review_front_config->get('config_language_id')];

							}


						}


						$cirating = $value['rating'];

						$review['all_rating'] .= '<b>'. $ciratingtype_name .'</b>: '. $cirating .' . <br/>' ;

					}
				}


				$query = $this->db->query("SELECT rating FROM " . DB_PREFIX . "review WHERE review_id = '" . (int)$review_id . "' AND product_id = '" . (int)$product_id . "'");
				if ($query->num_rows) {
					$review['rating'] = $query->row['rating'];
				}
			}

			$attachment_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_id = '" . (int)$cireview_id . "' AND status=1 ORDER BY sort_order ASC");
			if($attachment_query->num_rows) {
				$review['attachment'] .= '<ul style="list-style: none;">';
				foreach($attachment_query->rows as $row) {

					$image_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_id = '" . (int)$cireview_id . "' AND language_id='". (int) $review_front_config->get('config_language_id') ."' AND cireview_image_id='". (int)$row['cireview_image_id']  ."'");

					$title = '';
					$alt = '';

					if($image_description_query->row) {
						$title = $image_description_query->row['title'];
						$alt = $image_description_query->row['alt'];
					}

					if(!empty($row['image']) && file_exists(DIR_IMAGE . $row['image'])) {
						$attach_image = $this->getImage($row['image']);
						$review['attachment'] .= '<li tyle="float: left; margin-right: 15px; margin-bottom: 20px; width: 100px; border: 1px solid #ddd; padding: 5px; overflow: auto;"><img style="max-width: 100%;" title="'. $title .'" alt="'. $alt .'" src="'. $attach_image .'" ><li>';
						$attachments[] = $attach_image;
					}
				}
				$review['attachment'] .= '</ul>';
			}

			$product_info = $this->getProduct($product_id, array('language_id' => $review_front_config->get('config_language_id'), 'customer_group_id' => $review_front_config->get('config_customer_group_id')));

			// Send Email System

			if($product_info) {

				$products = array();
				$categories = array();
				$manufacturers = array();

				if($review_front_config->get('cireviewpro_mailproduct')) {
					foreach((array)$review_front_config->get('cireviewpro_mailproduct') as $productid ) {
						$productinfo = $this->getProduct($productid, array('language_id' => $review_front_config->get('config_language_id'), 'customer_group_id' => $review_front_config->get('config_customer_group_id')));

						if($productinfo) {

							if (!empty($productinfo['image']) && file_exists(DIR_IMAGE . $productinfo['image'])) {
								$image = $this->model_tool_image->resize($productinfo['image'], 200, 200);
							} else {
								$image = $this->model_tool_image->resize('placeholder.png', 200, 200);
							}

							$price = $this->currency->format($this->tax->calculate($productinfo['price'], $productinfo['tax_class_id'], $review_front_config->get('config_tax')), $this->session->data['currency']);


							if ((float)$productinfo['special']) {
								$special = $this->currency->format($this->tax->calculate($productinfo['special'], $productinfo['tax_class_id'], $review_front_config->get('config_tax')), $this->session->data['currency']);
							} else {
								$special = false;
							}

							if ($review_front_config->get('config_tax')) {
								$tax = $this->currency->format((float)$productinfo['special'] ? $productinfo['special'] : $productinfo['price'], $this->session->data['currency']);
							} else {
								$tax = false;
							}

							if ($review_front_config->get('config_review_status')) {
								$rating = $productinfo['rating'];
							} else {
								$rating = false;
							}
							$products[] = array(
								'product_id' => $productinfo['product_id'],
								'thumb'       => $image,
								'name' => $productinfo['name'],
								'description' => utf8_substr(strip_tags(html_entity_decode($productinfo['description'], ENT_QUOTES, 'UTF-8')), 0, $review_front_config->get($review_front_config->get('config_theme') . '_product_description_length')) . '..',
								'price'       => $price,
								'special'     => $special,
								'tax'         => $tax,
								'rating'      => $rating,
								'href'        => $front_url->link('product/product', 'product_id=' . $productinfo['product_id'])
							);
						}
					}
				}

				if($review_front_config->get('cireviewpro_mailcategory')) {

					foreach((array)$review_front_config->get('cireviewpro_mailcategory') as $category_id ) {
						$categoryinfo = $this->getCategory($category_id, $review_front_config->get('config_language_id'));

						if($categoryinfo) {

							$path = array();

							// get parent category_ids if we have. So we can get correct path.
							$path_query = $this->getCategoryPath($categoryinfo['category_id']);

							if($path_query->num_rows) {
								foreach($path_query->rows as $row) {
									$path[] = $row['path_id'];
								}
							}

							$path[] = $categoryinfo['category_id'];


							if (!empty($categoryinfo['image']) && file_exists(DIR_IMAGE . $categoryinfo['image'])) {
								$image = $this->model_tool_image->resize($categoryinfo['image'], 200, 200);
							} else {
								$image = $this->model_tool_image->resize('placeholder.png', 200, 200);
							}

							$categories[] = array(
								'category_id' => $categoryinfo['category_id'],
								'thumb'       => $image,
								'name' => $categoryinfo['name'],
								'href'        => $front_url->link('product/category', 'path=' . implode('_', $path)),
								'description' => utf8_substr(strip_tags(html_entity_decode($categoryinfo['description'], ENT_QUOTES, 'UTF-8')), 0, $review_front_config->get($review_front_config->get('config_theme') . '_product_description_length')) . '..',
							);

						}
					}
				}

				if($review_front_config->get('cireviewpro_mailmanufacturer')) {

					foreach((array)$review_front_config->get('cireviewpro_mailmanufacturer') as $manufacturer_id ) {
						$manufacturerinfo = $this->model_catalog_manufacturer->getManufacturer($manufacturer_id);


						if($manufacturerinfo) {

							if (!empty($manufacturerinfo['image']) && file_exists(DIR_IMAGE . $manufacturerinfo['image'])) {
								$image = $this->model_tool_image->resize($manufacturerinfo['image'], 200, 200);
							} else {
								$image = $this->model_tool_image->resize('placeholder.png', 200, 200);
							}

							$manufacturers[] = array(
								'manufacturer_id' => $manufacturerinfo['manufacturer_id'],
								'thumb'       => $image,
								'name' => $manufacturerinfo['name'],
								'href'        => $front_url->link('product/manufacturer/info', 'manufacturer_id=' . $manufacturerinfo['manufacturer_id']),
							);

						}
					}
				}

				$customer_email = $data['ciemail'];
				// echo "cireviewpro_customersend: ";
				// echo $review_front_config->get('cireviewpro_customersend');
				// echo "<br/>\n\n";
				// echo "customer_email: {$customer_email}";
				// die;
				if($review_front_config->get('cireviewpro_customersend') && $customer_email) {

					$customer_mailinfo = $review_front_config->get('cireviewpro_customer');

					if(isset($customer_mailinfo[(int)$review_front_config->get('config_language_id')])) {
						$customer_mail = $customer_mailinfo[(int)$review_front_config->get('config_language_id')];
					} else {
						reset($customer_mailinfo);
						$first_key = key($customer_mailinfo);
						$customer_mail = $customer_mailinfo[$first_key];
					}



					if ($this->request->server['HTTPS']) {
						$server = $review_front_config->get('config_ssl');
					} else {
						$server = $review_front_config->get('config_url');
					}


					$logo = '';

					$maillogoimagethumb_width = $review_front_config->get('cireviewpro_maillogoimagethumb_width');
					if(empty($maillogoimagethumb_width)) {
						$maillogoimagethumb_width = 100;
					}
					$maillogoimagethumb_height = $review_front_config->get('cireviewpro_maillogoimagethumb_height');
					if(empty($maillogoimagethumb_height)) {
						$maillogoimagethumb_height = 100;
					}

					if ($review_front_config->get('config_logo') && is_file(DIR_IMAGE . $review_front_config->get('config_logo'))) {
						$logo = $this->model_tool_image->resize($review_front_config->get('config_logo'), $maillogoimagethumb_width,$maillogoimagethumb_height);
					}

					$product_image = '';

					$mailproductimagethumb_width = $review_front_config->get('cireviewpro_mailproductimagethumb_width');
					if(empty($mailproductimagethumb_width)) {
						$mailproductimagethumb_width = 200;
					}
					$mailproductimagethumb_height = $review_front_config->get('cireviewpro_mailproductimagethumb_height');
					if(empty($mailproductimagethumb_height)) {
						$mailproductimagethumb_height = 200;
					}



					if(!empty($product_info['image']) && file_exists(DIR_IMAGE . $product_info['image']) && !in_array($product_info['image'], array('no_image.png','placeholder.png'))) {
						$product_image = $this->model_tool_image->resize($product_info['image'], $mailproductimagethumb_width,$mailproductimagethumb_height);
					}



					$find = array(
						'{PRODUCT_NAME}',
						'{PRODUCT_IMAGE}',
						'{PRODUCT_LINK}',
						'{PRODUCT_DESCRIPTION}',
						'{LOGO}',
						'{STORE_NAME}',
						'{STORE_LINK}',
						'{REVIEW_AUTHOR}',
						'{REVIEW_EMAIL}',
						'{REVIEW_TITLE}',
						'{REVIEW_TEXT}',
						'{REVIEW_RATING}',
						'{REVIEW_ALL_RATING}',
						'{REVIEW_ATTACHMENT}',
						'{REVIEW_LINK}',
						'{PROMO_PRODUCT}',
						'{PROMO_CATEGORY}',
						'{PROMO_MANUFACTURER}',
						'{COUPON_CODE}',
						'{REWARD_POINTS}',
					);

					$replace = array(
						'PRODUCT_NAME' => $product_info['name'],
						'PRODUCT_IMAGE' => $product_image ? '<img src="'. $product_image .'" alt="'. $product_info['name'] .'">' : '',
						'PRODUCT_LINK' => $front_url->link('product/product','product_id=' . $product_info['product_id']),
						'PRODUCT_DESCRIPTION' => html_entity_decode( $product_info['description'], ENT_QUOTES, 'UTF-8'),
						'LOGO'							=> $logo ? '<img src="'. $logo .'" alt="'. $review_front_config->get('config_name') .'" title="'. $review_front_config->get('config_name') .'" />' : '',
						'STORE_NAME'					=> $review_front_config->get('config_name'),
						'STORE_LINK'					=> $front_url->link('common/home', '', true),
						'REVIEW_AUTHOR'					=> $review['author'],
						'REVIEW_EMAIL'					=> $review['email'],
						'REVIEW_TITLE'					=> $review['title'],
						'REVIEW_TEXT'					=> $review['text'],
						'REVIEW_RATING'					=> $review['rating'],
						'REVIEW_ALL_RATING'				=> $review['all_rating'],
						'REVIEW_ATTACHMENT'				=> $review['attachment'],
						'REVIEW_LINK'					=> $front_url->link('cireviewpro/cireview','product_id=' . $product_info['product_id'].'&review_id='. $review_id),
						'PROMO_PRODUCT'					=> $this->promoProduct($products, $review_front_language),
						'PROMO_CATEGORY'					=> $this->promoCategory($categories, $review_front_language),
						'PROMO_MANUFACTURER'					=> $this->promoManufacturer($manufacturers, $review_front_language),
						'COUPON_CODE'					=> $data['coupon_code'],
						'REWARD_POINTS'					=> $data['reward_points'],

					);

					$subject = str_replace(array("\r\n", "\r", "\n"), '', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '', trim(str_replace($find, $replace, $customer_mail['customertitle']))));

					$body = str_replace(array("\r\n", "\r", "\n"), '', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '', trim(str_replace($find, $replace, $customer_mail['customermessage']))));

					$message = $this->mailHeader($subject);
					$message .= $body;
					$message .= $this->mailFooter();

					if(VERSION >= '3.0.0.0') {
						$mail = new Mail($review_front_config->get('config_mail_engine'));
						$mail->parameter = $review_front_config->get('config_mail_parameter');
						$mail->smtp_hostname = $review_front_config->get('config_mail_smtp_hostname');
						$mail->smtp_username = $review_front_config->get('config_mail_smtp_username');
						$mail->smtp_password = html_entity_decode($review_front_config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8');
						$mail->smtp_port = $review_front_config->get('config_mail_smtp_port');
						$mail->smtp_timeout = $review_front_config->get('config_mail_smtp_timeout');
					} else if(VERSION <= '2.0.1.1') {
				     	$mail = new Mail($review_front_config->get('config_mail'));
				    } else {
						$mail = new Mail();
						$mail->protocol = $review_front_config->get('config_mail_protocol');
						$mail->parameter = $review_front_config->get('config_mail_parameter');
						$mail->smtp_hostname = $review_front_config->get('config_mail_smtp_hostname');
						$mail->smtp_username = $review_front_config->get('config_mail_smtp_username');
						$mail->smtp_password = html_entity_decode($review_front_config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8');
						$mail->smtp_port = $review_front_config->get('config_mail_smtp_port');
						$mail->smtp_timeout = $review_front_config->get('config_mail_smtp_timeout');
					}

					foreach($attachments as $attachment) {
						$mail->addAttachment($attachment);
					}

					$mail->setTo($customer_email);
					$mail->setFrom($review_front_config->get('config_email'));
					$mail->setSender(html_entity_decode($review_front_config->get('config_name'), ENT_QUOTES, 'UTF-8'));
					$mail->setSubject(html_entity_decode($subject, ENT_QUOTES, 'UTF-8'));
					$mail->setHtml(html_entity_decode($message, ENT_QUOTES, 'UTF-8'));
					$mail->send();
					// print_r($mail);die;

				}
			}

		}
	}
	// review approve email ends

	public function editCiReview($review_id, $data) {

		$data['author'] = $this->stripTags($data['author']);
		$data['text'] = $this->stripTags($data['text']);
		$data['date_added'] = $this->stripTags($data['date_added']);
		$data['email'] = $this->stripTags($data['email']);
		$data['title'] = $this->stripTags($data['title']);
		$data['comment'] = $this->stripTags($data['comment']);
		$data['cireview_image'] = $this->stripTags($data['cireview_image']);

		$this->db->query("UPDATE " . DB_PREFIX . "review SET author = '" . $this->db->escape($data['author']) . "', product_id = '" . (int)$data['product_id'] . "', text = '" . $this->db->escape(strip_tags($data['text'])) . "', status = '" . (int)$data['status'] . "',  date_added = '" . $this->db->escape($data['date_added']) . "', date_modified = NOW() WHERE review_id = '" . (int)$review_id . "'");

		$cireview_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview WHERE review_id = '" . (int)$review_id . "'");

		/*12-09-2019 Vote Feature Update Starts*/
		// fverif task start
		// add , fverify column data
		if($cireview_info->num_rows) {
			$cireview_id = $cireview_info->row['cireview_id'];
			$this->db->query("UPDATE " . DB_PREFIX . "cireview SET email = '" . $this->db->escape($data['email']) . "', title = '" . $this->db->escape($data['title']) . "', store_id = '" .  (int)$data['store_id'] . "', language_id = '" .  (int)$data['language_id'] . "', comment = '" . $this->db->escape($data['comment']) . "', product_id = '" . (int)$data['product_id'] . "', imp = '" . (isset($data['imp']) ? (int)$data['imp'] : '') . "', fverify = '" . (isset($data['fverify']) ? (int)$data['fverify'] : '0') . "', votes_up = '" . (int)$data['votes_up'] . "', votes_down = '" . (int)$data['votes_down'] . "' WHERE review_id = '" . (int)$review_id . "'");
		} else {
			$this->db->query("INSERT INTO " . DB_PREFIX . "cireview SET email = '" . $this->db->escape($data['email']) . "', title = '" . $this->db->escape($data['title']) . "', store_id = '" .  (int)$data['store_id'] . "', language_id = '" .  (int)$data['language_id'] . "', comment = '" . $this->db->escape($data['comment']) . "', product_id = '" . (int)$data['product_id'] . "', review_id = '" . (int)$review_id . "', imp = '" . (isset($data['imp']) ? (int)$data['imp'] : '') . "', fverify = '" . (isset($data['fverify']) ? (int)$data['fverify'] : '0') . "', votes_up = '" . (int)$data['votes_up'] . "', votes_down = '" . (int)$data['votes_down'] . "'");

			$cireview_id = $this->db->getLastId();
		}
		// fverif task end
		/*12-09-2019 Vote Feature Update Ends*/

		$this->db->query("UPDATE " . DB_PREFIX . "cireview_image SET cireview_id = '" . (int)$cireview_id . "' WHERE session_id = '" . $this->db->escape($this->session->getId()) . "' AND cireview_id='0'");

		$this->db->query("UPDATE " . DB_PREFIX . "cireview_image_description SET cireview_id = '" . (int)$cireview_id . "' WHERE session_id = '" . $this->db->escape($this->session->getId()) . "' AND cireview_id='0'");

		if(!empty($data['cireview_image'])) {
			$this->db->query("UPDATE " . DB_PREFIX . "cireview_image SET cireview_id = '" . (int)$cireview_id . "' WHERE cireview_image_id IN(". $data['cireview_image'] .") AND cireview_id='0'");
			$this->db->query("UPDATE " . DB_PREFIX . "cireview_image_description SET cireview_id = '" . (int)$cireview_id . "' WHERE cireview_image_id IN(". $data['cireview_image'] .") AND cireview_id='0'");
		}

		if(!empty($data['attach_image'])) {

			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_image_description WHERE cireview_id = '" . (int)$cireview_id . "'");

			foreach ($data['attach_image'] as $cireview_image_id => $value) {


				$cireview_image_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_image WHERE cireview_image_id='". (int)$cireview_image_id ."'");

				if($cireview_image_query->num_rows) {
				foreach ($value['description'] as $language_id => $description) {

					$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_image_description SET title = '" . $this->db->escape($description['title']) . "', alt = '" . $this->db->escape($description['alt']) . "', cireview_image_id='". (int)$cireview_image_id ."', language_id='". (int)$language_id ."', session_id='". $this->db->escape($cireview_image_query->row['session_id']) ."', cireview_id='". (int)$cireview_image_query->row['cireview_id'] ."'");
				}
				}

			}
		}


		if(isset($data['rating'])) {
			$rating = 0;
			$ratings = 0;

			$this->load->model('cireviewpro/ciratingtype');

			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_rating WHERE review_id = '" . (int)$review_id . "'");

			foreach($data['rating'] as $ciratingtype_id => $cirating) {
				$ratingtype_info = $this->model_cireviewpro_ciratingtype->getCiRatingTypeDescriptions($ciratingtype_id);
				if($ratingtype_info) {
				$ratings += $cirating;

				$ciratingtype_names = array();
				$ciratingtype_name = '';
				foreach ($ratingtype_info as $key => $value) {
					$ciratingtype_names[$value['language_id']] = $value['name'];

					if($value['language_id'] == $this->config->get('config_language_id')) {
						$ciratingtype_name = $value['name'];

					}
				}

				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_rating SET cireview_rating_id='". (isset($data['cireview_rating_id'][$ciratingtype_id]) ? $data['cireview_rating_id'][$ciratingtype_id] : 0) ."', product_id = '" . (int)$data['product_id'] . "', status = '1', rating = '" . (int)$cirating . "', review_id = '" . (int)$review_id . "', cireview_id = '" . (int)$cireview_id . "', ciratingtype_id = '" . (int)$ciratingtype_id . "', ciratingtype_name = '" . ($this->db->escape(json_encode($ciratingtype_names))) . "'");

				}

			}

			if($ratings) {
				$rating = $ratings / count($data['rating']);
			}

			$this->db->query("UPDATE " . DB_PREFIX . "review SET rating = '" . (int)$rating . "' WHERE review_id = '" . (int)$review_id . "'");
		}

		/*12-09-2019 Vote Feature Update Starts*/
		/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
		/*if(isset($data['votes_up'])) {
			$data['votes_up'] = intval($data['votes_up']);

			// get previous votes up and update only if news
			// if lesser votes_up admin want but we have more then delete extra
			// if greater votes_up admin want then add extras

			$cireview_vote_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='1' AND status='1'");

			// max_allowed_packet
			// show variables like 'max_allowed_packet'

						//

			// SET GLOBAL max_allowed_packet=524288000;


			// Tuning bulk_insert_buffer_size may make the operation go faster, but will work regardless of the value.

			// key_buffer_size has to do with read caching.

			$cireview_vote = $cireview_vote_info->rows;
			$cireviewvotes = $cireview_vote_info->rows;

			foreach ($cireviewvotes as &$value) {
				$value['product_id'] = $data['product_id'];
				if(empty($value['session_id'])) {
					$value['session_id'] = $this->session->getId();
				}
			}

			$requirement = false;
			// we have more votes than admin want
			if(count($cireview_vote) > $data['votes_up']) {
				$cireviewvotes = array_slice($cireviewvotes, 0, (int)$data['votes_up']);

				this code was buggy. when user want lesser votes but in database votes are more then desier votes
				if($cireview_vote) {
					foreach($cireview_vote as $cireviewvote) {
						$cireviewvote['product_id'] = $data['product_id'];
						$cireviewvotes[] = $cireviewvote;
					}
				} else {
					$cireviewvotes = array();
				}
			}

			// we have less votes than admin want
			if(count($cireview_vote) < $data['votes_up']) {
				$dummy = $data['votes_up'] - count($cireview_vote);
				$requirement = true;
				for($i=0;$i<$dummy;$i++) {
					$cireviewvotes[] = array(
						'cireview_vote_id' => 0,
						'cireview_id' => $cireview_id,
						'review_id' => $review_id,
						'product_id' => $data['product_id'],
						'customer_id' => 0,
						'author' => '',
						'vote' => 1,
						'status' => 1,
						'session_id' => $this->session->getId(),
						'date_added' => date('Y-m-d H:i:s'),
						'date_modified' => date('Y-m-d H:i:s'),
					);
				}
			}


			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='1' AND status='1'");
			foreach($cireviewvotes as $cireviewvote) {
				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_vote SET cireview_vote_id = '" . (int)$cireviewvote['cireview_vote_id'] . "', cireview_id = '" . (int)$cireviewvote['cireview_id'] . "', review_id = '" . (int)$cireviewvote['review_id'] . "', product_id = '" . (int)$cireviewvote['product_id'] . "', customer_id = '" . (int)$cireviewvote['customer_id'] . "', status = '". (int)$cireviewvote['status'] ."', author = '" . $this->db->escape($cireviewvote['author']) . "', session_id = '" . $this->db->escape($cireviewvote['session_id']) . "', date_added='". $this->db->escape($cireviewvote['date_added']) ."', vote='". (int)$cireviewvote['vote'] ."'");
			}


		}*/

		/*if(isset($data['votes_down'])) {
			// get previous votes up and update only if news
			// if lesser votes_down admin want but we have more then delete extra
			// if greater votes_down admin want then add extras

			$cireview_vote_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='0' AND status='1'");


			$cireview_vote = $cireview_vote_info->rows;
			$cireviewvotes = $cireview_vote_info->rows;

			foreach ($cireviewvotes as &$value) {
				$value['product_id'] = $data['product_id'];
				if(empty($value['session_id'])) {
					$value['session_id'] = $this->session->getId();
				}
			}

			$requirement = false;
			// we have more votes than admin want
			if(count($cireview_vote) > $data['votes_down']) {
				$cireviewvotes = array_slice($cireviewvotes, 0, (int)$data['votes_down']);
				/*
				this code was buggy. when user want lesser votes but in database votes are more then desier votes
				if($cireview_vote) {
					foreach($cireview_vote as $cireviewvote) {
						$cireviewvote['product_id'] = $data['product_id'];
						$cireviewvotes[] = $cireviewvote;
					}
				} else {
					$cireviewvotes = array();
				}*/
		/*	}

			// we have less votes than admin want
			if(count($cireview_vote) < $data['votes_down']) {
				$dummy = $data['votes_down'] - count($cireview_vote);
				$requirement = true;
				for($i=0;$i<$dummy;$i++) {
					$cireviewvotes[] = array(
						'cireview_vote_id' => 0,
						'cireview_id' => $cireview_id,
						'review_id' => $review_id,
						'product_id' => $data['product_id'],
						'customer_id' => 0,
						'author' => '',
						'vote' => 0,
						'status' => 1,
						'session_id' => $this->session->getId(),
						'date_added' => date('Y-m-d H:i:s'),
						'date_modified' => date('Y-m-d H:i:s'),
					);
				}
			}


			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_vote WHERE review_id = '" . (int)$review_id . "' AND cireview_id = '" . (int)$cireview_id . "' AND vote='0' AND status='1'");


			foreach($cireviewvotes as $cireviewvote) {
				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_vote SET cireview_vote_id = '" . (int)$cireviewvote['cireview_vote_id'] . "', cireview_id = '" . (int)$cireviewvote['cireview_id'] . "', review_id = '" . (int)$cireviewvote['review_id'] . "', product_id = '" . (int)$cireviewvote['product_id'] . "', customer_id = '" . (int)$cireviewvote['customer_id'] . "', status = '". (int)$cireviewvote['status'] ."', author = '" . $this->db->escape($cireviewvote['author']) . "', session_id = '" . $this->db->escape($cireviewvote['session_id']) . "', date_added='". $this->db->escape($cireviewvote['date_added']) ."', vote='". (int)$cireviewvote['vote'] ."'");

			}
		}*/
		/*12-09-2019 Vote Feature Update Ends*/
		// if exist $data.review_approve then go inside function
		$this->reviewApproveEmail($review_id, $data);
	}

	public function getCiReview($review_id) {
		/*12-09-2019 Vote Feature Update Starts*/
		/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
		/*LEFT JOIN " . DB_PREFIX . "cireview_vote crv ON (cr.cireview_id = crv.cireview_id) */
		/*12-09-2019 Vote Feature Update Ends*/
		// fverif task start
		// add , cr.fverify, (SELECT review FROM " . DB_PREFIX . "cireview_verify crv WHERE crv.status=1 AND crv.cireview_id=cr.review_id AND crv.review_id=r.review_id ) as auto_verify
		// fverif task end
		$query = $this->db->query("SELECT r.*, cr.imp, cr.fverify, (SELECT review FROM " . DB_PREFIX . "cireview_verify crv WHERE crv.status=1 AND crv.cireview_id=cr.review_id AND crv.review_id=r.review_id ) as auto_verify, cr.store_id, cr.language_id, cr.email, cr.title, cr.comment, cr.coupon_code, cr.cireview_id, pd.name as product_name, p.image as product_image, cr.votes_up, cr.votes_down FROM " . DB_PREFIX . "review r LEFT JOIN " . DB_PREFIX . "cireview cr ON (r.review_id = cr.review_id) LEFT JOIN " . DB_PREFIX . "product p ON (r.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE r.review_id>0 AND pd.language_id='". (int)$this->config->get('config_language_id') ."' AND r.review_id='". (int)$review_id ."'");

		if(!empty($query->row['review_id'])) {
			return $query->row;
		} else {
			return array();
		}
	}

	public function getCiReviews($data = array()) {
		/*12-09-2019 Vote Feature Update Starts*/
		/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
		/* LEFT JOIN " . DB_PREFIX . "cireview_vote crv ON (cr.cireview_id = crv.cireview_id)*/
		/*12-09-2019 Vote Feature Update Ends*/
		// fverif task start
		// add , cr.fverify, (SELECT review FROM " . DB_PREFIX . "cireview_verify crv WHERE crv.status=1 AND crv.cireview_id=cr.review_id AND crv.review_id=r.review_id ) as auto_verify
		// fverif task end
		$sql = "SELECT r.*, cr.email, cr.imp, cr.fverify, (SELECT review FROM " . DB_PREFIX . "cireview_verify crv WHERE crv.status=1 AND crv.cireview_id=cr.review_id AND crv.review_id=r.review_id ) as auto_verify, cr.store_id, cr.language_id, cr.title, cr.comment, cr.coupon_code, cr.cireview_id, pd.name as product_name, p.image as product_image, cr.votes_up, cr.votes_down FROM " . DB_PREFIX . "review r LEFT JOIN " . DB_PREFIX . "cireview cr ON (r.review_id = cr.review_id) LEFT JOIN " . DB_PREFIX . "product p ON (r.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE r.review_id>0 AND pd.language_id='". (int)$this->config->get('config_language_id') ."'";
		if (isset($data['filter_language_id']) && !is_null($data['filter_language_id'])) {
			$sql .= " AND cr.language_id='" . (int)$data['filter_language_id'] . "'";
		}

		if (isset($data['filter_imp']) && !is_null($data['filter_imp'])) {
			$sql .= " AND cr.imp = '" . (int)$data['filter_imp'] . "'";
		}
		// fverif task start
		if (isset($data['filter_fverify']) && !is_null($data['filter_fverify'])) {
			$sql .= " AND cr.fverify = '" . (int)$data['filter_fverify'] . "'";
		}
		// fverif task end
		if (isset($data['filter_store_id']) && !is_null($data['filter_store_id'])) {
			$sql .= " AND cr.store_id='" . (int)$data['filter_store_id'] . "'";
		}


		if (!empty($data['filter_title'])) {
			$sql .= " AND cr.title LIKE '" . $this->db->escape($data['filter_title']) . "%'";
		}

		if (!empty($data['filter_email'])) {
			$sql .= " AND cr.email LIKE '" . $this->db->escape($data['filter_email']) . "%'";
		}

		if (!empty($data['filter_author'])) {
			$sql .= " AND r.author LIKE '" . $this->db->escape($data['filter_author']) . "%'";
		}

		if (!empty($data['filter_rating'])) {
			$sql .= " AND r.rating = '" . $this->db->escape($data['filter_rating']) . "'";
		}

		if (!empty($data['filter_cireview_product_id'])) {
			$sql .= " AND r.product_id = '" . $this->db->escape($data['filter_cireview_product_id']) . "'";
		}

		if (!empty($data['filter_product'])) {
			$sql .= " AND pd.name LIKE '" . $this->db->escape($data['filter_product']) . "%'";
		}

		if (isset($data['filter_vote']) && !is_null($data['filter_vote'])) {
			/*12-09-2019 Vote Feature Update Starts*/
			/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
			/*$sql .= " AND crv.vote = '" . $this->db->escape($data['filter_vote']) . "'";*/

			if ($data['filter_vote'] == 1) {
				$sql .= " AND cr.votes_up>0";
			}
			if ($data['filter_vote'] == 0) {
				$sql .= " AND cr.votes_down>0";
			}
			/*12-09-2019 Vote Feature Update Ends*/
		}

		if (isset($data['filter_status']) && !is_null($data['filter_status'])) {
			$sql .= " AND r.status = '" . (int)$data['filter_status'] . "'";
		}

		if (isset($data['filter_attachimages']) && !is_null($data['filter_attachimages'])) {
			if((int)$data['filter_attachimages']==1) {
				$sql .= " AND CASE WHEN (SELECT COUNT(*) FROM " . DB_PREFIX . "cireview_image ri WHERE ri.cireview_id = cr.cireview_id AND ri.status=1) > 0 THEN true ELSE false END";
			} else {
				$sql .= " AND CASE WHEN (SELECT COUNT(*) FROM " . DB_PREFIX . "cireview_image ri WHERE ri.cireview_id = cr.cireview_id AND ri.status=1) <= 0 THEN true ELSE false END";
			}
		}

		if (!empty($data['filter_date_added'])) {
			$sql .= " AND DATE(r.date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
		}

		$sql .= " GROUP BY r.review_id";

		$sort_data = array(
			'r.author',
			'r.status',
			'r.rating',
			'r.date_added',
			'cr.email',
			'cr.title',
			'cr.imp',
			// fverif task start
			'cr.fverify',
			'auto_verify',
			// fverif task end
			'cr.store_id',
			'cr.language_id',
			'votes_down',
			'votes_up',
			'product_name',
		);

		if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
			$sql .= " ORDER BY " . $data['sort'];
		} else {
			$sql .= " ORDER BY r.date_added";
		}

		if (isset($data['order']) && ($data['order'] == 'DESC')) {
			$sql .= " DESC";
		} else {
			$sql .= " ASC";
		}

		if (isset($data['start']) || isset($data['limit'])) {
			if ($data['start'] < 0) {
				$data['start'] = 0;
			}

			if ($data['limit'] < 1) {
				$data['limit'] = 20;
			}

			$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
		}

		$query = $this->db->query($sql);

		return $query->rows;
	}

	public function getTotalCiReviews($data = array()) {

		/*12-09-2019 Vote Feature Update Starts*/
		/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
		/* LEFT JOIN " . DB_PREFIX . "cireview_vote crv ON (cr.cireview_id = crv.cireview_id)*/
		/*12-09-2019 Vote Feature Update Ends*/

		$sql = "SELECT COUNT(DISTINCT r.review_id) AS total FROM " . DB_PREFIX . "review r LEFT JOIN " . DB_PREFIX . "cireview cr ON (r.review_id = cr.review_id) LEFT JOIN " . DB_PREFIX . "product p ON (r.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE r.review_id>0 AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'";

		if (isset($data['filter_language_id']) && !is_null($data['filter_language_id'])) {
			$sql .= " AND cr.language_id='" . (int)$data['filter_language_id'] . "'";
		}
		if (isset($data['filter_imp']) && !is_null($data['filter_imp'])) {
			$sql .= " AND cr.imp = '" . (int)$data['filter_imp'] . "'";
		}
		// fverif task start
		if (isset($data['filter_fverify']) && !is_null($data['filter_fverify'])) {
			$sql .= " AND cr.fverify = '" . (int)$data['filter_fverify'] . "'";
		}
		// fverif task end
		if (isset($data['filter_store_id']) && !is_null($data['filter_store_id'])) {
			$sql .= " AND cr.store_id='" . (int)$data['filter_store_id'] . "'";
		}

		if (!empty($data['filter_title'])) {
			$sql .= " AND cr.title LIKE '" . $this->db->escape($data['filter_title']) . "%'";
		}

		if (!empty($data['filter_email'])) {
			$sql .= " AND cr.email LIKE '" . $this->db->escape($data['filter_email']) . "%'";
		}

		if (!empty($data['filter_author'])) {
			$sql .= " AND r.author LIKE '" . $this->db->escape($data['filter_author']) . "%'";
		}

		if (!empty($data['filter_rating'])) {
			$sql .= " AND r.rating = '" . $this->db->escape($data['filter_rating']) . "'";
		}

		if (!empty($data['filter_cireview_product_id'])) {
			$sql .= " AND r.product_id = '" . $this->db->escape($data['filter_cireview_product_id']) . "'";
		}

		if (!empty($data['filter_product'])) {
			$sql .= " AND pd.name LIKE '" . $this->db->escape($data['filter_product']) . "%'";
		}

		if (isset($data['filter_vote']) && !is_null($data['filter_vote'])) {
			/*12-09-2019 Vote Feature Update Starts*/
			/* As we update vote feature, votes_up, votes_down is included in cireview table. will remove following code in future 12-01-2020*/
			/*$sql .= " AND crv.vote = '" . $this->db->escape($data['filter_vote']) . "'";*/

			if ($data['filter_vote'] == 1) {
				$sql .= " AND cr.votes_up>0";
			}
			if ($data['filter_vote'] == 0) {
				$sql .= " AND cr.votes_down>0";
			}
			/*12-09-2019 Vote Feature Update Ends*/
		}

		if (isset($data['filter_status']) && !is_null($data['filter_status'])) {
			$sql .= " AND r.status = '" . (int)$data['filter_status'] . "'";
		}

		if (isset($data['filter_attachimages']) && !is_null($data['filter_attachimages'])) {
			if((int)$data['filter_attachimages']==1) {
				$sql .= " AND CASE WHEN (SELECT COUNT(*) FROM " . DB_PREFIX . "cireview_image ri WHERE ri.cireview_id = cr.cireview_id AND ri.status=1) > 0 THEN true ELSE false END";
			} else {
				$sql .= " AND CASE WHEN (SELECT COUNT(*) FROM " . DB_PREFIX . "cireview_image ri WHERE ri.cireview_id = cr.cireview_id AND ri.status=1) <= 0 THEN true ELSE false END";
			}
		}

		if (!empty($data['filter_date_added'])) {
			$sql .= " AND DATE(r.date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
		}

		$query = $this->db->query($sql);

		return $query->row['total'];
	}

	/*new 29nov2019 start*/
	public function updateReviewInfo($review_id, $data) {
		$this->db->query("UPDATE " . DB_PREFIX . "review SET `". $data['column'] ."` = '" . $this->db->escape($data['value']) . "' WHERE review_id = '" . (int)$review_id . "'");
	}
	public function updateCiReviewInfo($review_id, $data) {
		$this->db->query("UPDATE " . DB_PREFIX . "cireview SET `". $data['column'] ."` = '" . $this->db->escape($data['value']) . "' WHERE review_id = '" . (int)$review_id . "'");
	}
	public function updateCiReviewRating($review_id, $data) {
		$review_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "review WHERE review_id = '" . (int)$review_id . "'");

		$cireview_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cireview WHERE review_id = '" . (int)$review_id . "'");

		if(isset($data['rating']) && $review_query->row && $cireview_query->row) {
			$rating = 0;
			$ratings = 0;

			$data['product_id'] = $review_query->row['product_id'];

			$cireview_id = $cireview_query->row['cireview_id'];

			$this->load->model('cireviewpro/ciratingtype');

			$this->db->query("DELETE FROM " . DB_PREFIX . "cireview_rating WHERE review_id = '" . (int)$review_id . "'");

			foreach($data['rating'] as $ciratingtype_id => $cirating) {
				$ratingtype_info = $this->model_cireviewpro_ciratingtype->getCiRatingTypeDescriptions($ciratingtype_id);
				if($ratingtype_info) {
				$ratings += $cirating;

				$ciratingtype_names = array();
				$ciratingtype_name = '';
				foreach ($ratingtype_info as $key => $value) {
					$ciratingtype_names[$value['language_id']] = $value['name'];
					if($value['language_id'] == $this->config->get('config_language_id')) {
						$ciratingtype_name = $value['name'];

					}
				}

				$this->db->query("INSERT INTO " . DB_PREFIX . "cireview_rating SET cireview_rating_id='". (isset($data['cireview_rating_id'][$ciratingtype_id]) ? $data['cireview_rating_id'][$ciratingtype_id] : 0) ."', product_id = '" . (int)$data['product_id'] . "', status = '1', rating = '" . (int)$cirating . "', review_id = '" . (int)$review_id . "', cireview_id = '" . (int)$cireview_id . "', ciratingtype_id = '" . (int)$ciratingtype_id . "', ciratingtype_name = '" . ($this->db->escape(json_encode($ciratingtype_names))) . "'");

				}

			}

			if($ratings) {
				$rating = $ratings / count($data['rating']);
			}

			$this->db->query("UPDATE " . DB_PREFIX . "review SET rating = '" . (int)$rating . "' WHERE review_id = '" . (int)$review_id . "'");
		}
	}
	/*new 29nov2019 end*/
}