<?php 

class Api_model extends CI_Model {
	
	public function _consruct(){
		parent::_construct();
 	}

 	public function login($data){
 		try{
			$res = array('status'=>0,'message'=>'Something went wrong','code'=>'ER07');
 		    $this->db->select('customer.name,customer.dob,customer.phone,customer.email,customer.profile_image 
 		   	   AS image,customer.profile_image AS profile_image_qr,customer.gender,users.id AS userId,customer.profile_city AS city,customer.dob,customer.email_verified');
 			$this->db->where('users.status',1);
	 		$this->db->where('users.password',md5($data['password']));
	 		$this->db->where('customer.email',$data['email_id']);
	 		$this->db->from('users');
	 		$this->db->join('customer','customer.customer_id = users.id');
	 		$result = $this->db->get()->row();
	 		if($result){
	 			if(isset($result->email_verified) && $result->email_verified == '1'){
		 			$result->dob = (!empty($result->dob))?date("m/d/Y",$result->dob/1000):'';
		 			$result->auth_token = md5(microtime().rand());
		 			$this->generateAuth($result->userId,$result->auth_token);
		 			$res = array('status'=>1,'data'=>$result);
	 			} else {
	 				$res = array('status'=>0,'message'=>'Verify Your E-Mail','code'=>'ER07');
	 			}

	 		} else {
	 			$res = array('status'=>0,'message'=>'Wrong password. Try again or click Forgot password to reset it','code'=>'ER05');
	 		}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;	
 	}

 	function generateAuth($userId,$auth_token) {
 		$this->db->insert('customer_auth',array('user_id'=>$userId, 'auth_token'=>$auth_token));
 	}

 	function register($data) {
 		try{
 			$data['phone_code'] = '966';
 			$email = $data['email_id'];
 			$phone = preg_replace('/\D/', '', $data['phone']);
 			$phone_code = preg_replace('/\D/', '', $data['phone_code']);

 			$sql = "SELECT * FROM customer 
				    INNER JOIN `users` ON users.id=customer.customer_id 
				    WHERE users.status!='2' AND (customer.email = '$email' OR customer.phone LIKE '%$phone')";
 			$res_count = $this->db->query($sql)->row();

 			if(count($res_count) > 0) {
 				if($res_count->email == $data['email_id'] && 
 				   ($res_count->phone == $data['phone'] || strpos($res_count->phone,$data['phone'])!==false)){
 					return array('status'=>0,'message'=>'Already have an account with email id and phone no. Please login','code'=>'ER12');
 				} else if($res_count->email == $data['email_id']){
 					return array('status'=>0,'message'=>'Email id already exists','code'=>'ER09');
 				} else if(strpos($res_count->phone,$data['phone'])!==false||$res_count->phone==$data['phone']){
 					return array('status'=>0,'message'=>'Phone no already exists','code'=>'ER10');
 				}else{
 					return array('status'=>0,'message'=>'Something went wrong','code'=>'ER07');
 				}
 			} else {
 				$unique_id = uniqid().time();
 				$temp_password = $data['password'];
	 			$data['password'] = md5($data['password']);

	 			$user_data = array('password'=>$data['password'],'display_name'=>'Customer','user_type'=>3);
	 			$this->db->insert('users',$user_data);
	 			$id = $this->db->insert_id();

	 			if($id) {
	 				$customer_data = array('customer_id'=>$id,'phone'=>$data['phone'],
	 									   'phone_code'=>$data['phone_code'],
	 									   'email_verified'=>'0','email'=>$data['email_id'],
	 									   'name'=>$data['name'],'confirm_link'=>$unique_id);

	 				$this->db->insert('customer', $customer_data);

	 				$subject    = "TimeOut, Verify your account";
	 				$email_id   = $data['email_id'];
	 				$reset_link = base_url().'Api/verifyMail/'.$unique_id;
	 				$msgContent = "Hi, Welcome to TimeOut. Please Verify your E-mail for the username: 
	 							  ".$email_id.". User the following link verify your account 
	 							  ".$reset_link.".";
					$message    = "<html><body>".$msgContent."</body></html>";

					$template = getNotifTemplate();
		            if(isset($template['verify_mail']) && !empty($template['verify_mail'])){
		                $message = str_replace(array('{:user_name}','{:reset_link}'),
		                					   array($email_id,$reset_link),
		                					   $template['verify_mail']);
		            }
	 				$this->send_mail($subject,$email_id,$message);


	 				return array('status'=>1,'data'=>'');

	 				// $this->db->select('customer.name,customer.dob,customer.phone,customer.email,customer.profile_image AS image,customer.gender,users.id AS userId, customer.city');
		 			// $this->db->where('users.id',$id);
			 		// $this->db->from('users');
			 		// $this->db->join('customer','customer.customer_id = users.id');
			 		// $result = $this->db->get()->row();
			 		// if($result){
			 		// 	$result->dob = (!empty($result->dob))?date("m/d/Y",$result->dob/1000):'';
			 		// 	$result->auth_token = md5(microtime().rand());
			 		// 	$this->generateAuth($result->userId,$result->auth_token);
			 		// 	$res = array('status'=>1,'data'=>$result,'message'=>'An activation Email has been set to your mail id');
			 		// } else {
			 		// 	$res = array('status'=>0,'message'=>'No record found','code'=>'ER13');
			 		// }
	 			} else {
	 				return array('status'=>0,'message'=>'Registration failed please try again','code'=>'ER11');
	 			}	 			
		 	}
 		} catch(Exception $e) {
 			 return array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 	}

 	function send_mail($subject,$email,$message,$attach=null) {
 		$ci =& get_instance(); 
		$ci->load->library('email');
        $ci->email->initialize(array(
	        'protocol' => 'smtp',
	        'smtp_host' => 'smtp.sendgrid.net',
	        'smtp_user' => 'adarsh@techware.in',
	        'smtp_pass' => 'Golden_123',
	        'smtp_port' => 587,
	        'crlf' => "\r\n",
	        'newline' => "\r\n"
        ));
        
        $ci->email->from('hello@timeout.sa', 'TimeOut');
        $ci->email->to($email);
        $ci->email->subject($subject);
        $ci->email->message($message);
        $ci->email->set_mailtype('html');
        if($attach != null) {
            $ci->email->attach($attach);
        }
        return $ci->email->send();
 	}

 	function forgot($data) {
 		try{
 			$settings   = getSettings();
    		$redUrl     = $settings['web_base_url'];

 			$res_count = $this->db->where('email',$data['email_id'])->get('customer')->num_rows();
 			if($res_count > 0) {
 				$unique_id = uniqid().time();
	 			$this->db->where('email',$data['email_id'])->update('customer',array('reset_key'=>$unique_id));

	 			$subject 	= "TimeOut: Forgot Password";
	 			$url 		= $redUrl.'forgot?reset_key='.$unique_id;
	 			$msgContent = "Hi, Welcome to TimeOut. Please use this link 
	 			               for reset your password: ".$url;
	 			$message	= "<html><body><p>".$msgContent."</p></body></html>";

			    $template 	= getNotifTemplate();
	            if(isset($template['forgot_mail']) && !empty($template['forgot_mail'])){
	                $message = str_replace(array('{:url}'),array($url),$template['forgot_mail']);
	            }
	 			$result = $this->send_mail($subject,$data['email_id'],$message);

	 			if($result){
	 				$res = array('status'=>1,'data'=>null);
	 			} else {	 				
	 				$res = array('status'=>0,'message'=>'Please try again','code'=>'ER15');
	 			}
 			} else {
 				$res = array('status'=>0,'message'=>'No account has been found in this email id','code'=>'ER14');
		 	}
 		} catch(Exception $e) {
		    $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function popular() {
 		try {
 			$rs = $this->db->get_where('region',array('status'=>'1'))->result_array();
 			if(count($rs) > 0) {
 				$cityData = array();
 				foreach ($rs AS $city) {
 					$cData = langTranslator($city['id'],'REG');
 					$cData['city_id'] = $city['id'];
 					$cData['city_image'] = $city['region_icon'];
 					$cityData[] = $cData;
 				}
 				$res = array('status'=>1,'data'=>$cityData);
 			} else {
 				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 			}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 

 		return $res;
 	}

 	function category() {
 		try {
			$sql = "SELECT * FROM event_category WHERE status='1' ORDER BY priority";
 			$rs = $this->db->query($sql)->result_array();

 			if(count($rs) > 0) {
 				$catData = array();
 				foreach ($rs AS $cat) {
 					$cData = langTranslator($cat['cat_id'],'CAT');
 					$cData['cat_id'] = $cat['cat_id'];
 					$cData['category_banner'] = $cat['category_banner'];
 					$catData[] = $cData;
 				}
 				$res = array('status'=>1,'data'=>$catData);
 			} else {
 				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 			}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 

 		return $res;
 	}

 	function getCountry() {
 		try {
 			$rs = $this->db->query("SELECT CTRY.language_code,CTRY.country_id,CTRY.country_name,
 										   CTRY.country_code,CTRY.language,CTRY.currency,CTRY.currency_symbol,
 										   CTRY.conversion_rate,CTRY.phone_code
		                            FROM country AS CTRY
		                            WHERE CTRY.status = 1 
		                            ORDER BY CTRY.country_name")->result();
 			if(count($rs) > 0) {
 				$res = array('status'=>1,'data'=>$rs);
 			} else {
 				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 			}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 

 		return $res;
 	}

 	function locality($city_id = '') {
 		try {
 			$cond['status'] = '1';
 			if(!empty($city_id)){
 				$cond['region_id'] = $city_id;
 			}
 			$rs = $this->db->select('id,region_id')->get_where('locality',$cond)->result_array();
 			if(count($rs) > 0) {
 				$locData = array();
 				foreach ($rs AS $loc) {
 					$lData = langTranslator($loc['id'],'LOC');
 					$lData['locality_id'] = $loc['id'];
 					$lData['region_id'] = $loc['region_id'];
 					$locData[] = $lData;
 				}
 				$res = array('status'=>1,'data'=>$locData);
 			} else {
 				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 			}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function favourite($data) {
 		try {
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) {
 				if($data['status'] == 1) {
	 				$post_data = array('user_id'=>$user_id, 'event_id'=>$data['event_id'], 'status'=>1);
	 				$count_rs = $this->db->where($post_data)->get('favourite')->num_rows();
	 				if($count_rs > 0) {
	 					$res = array('status'=>0,'message'=>'Already submitted your Feedback','code'=>'ER21');
	 				} else {
	 					$rs = $this->db->insert('favourite', $post_data);
		 				if($rs) {
		 					$res = array('status'=>1,'data'=>null);
		 				} else {
		 					$res = array('status'=>0,'message'=>'Feedback submission failed','code'=>'ER20');
		 				}
	 				}	 				
	 			} else {
	 				$where = array('user_id'=>$user_id, 'event_id'=>$data['event_id'], 'status'=>1);
	 				$rs = $this->db->where($where)->update('favourite', array('status'=>0));
	 				if($rs) {
	 					$res = array('status'=>1,'data'=>null);
	 				} else {
	 					$res = array('status'=>0,'message'=>'Feedback submission failed','code'=>'ER20');
	 				}
	 			}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}
 			

 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function auth_token_get($token) {
 		$rs = $this->db->select('user_id')->where('auth_token', $token)->get('customer_auth')->row();
 		if(count($rs) > 0) {
 			return $rs->user_id;
 		} else {
 			return 0;
 		}
 	}

 	function favouritelist($data) {
 		try {
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) {
 				$where = array(
 					'favourite.status'=>1,
 					'favourite.user_id'=>$user_id,
 					'events.status'=>1
 				);
 				$result = $this->db->select('events.event_id, events.event_name_en,events.seat_pricing,events.custom_seat_layout,venue.layout,venue.layout_details, event_gallery.media_url,favourite.status AS fav_status')->where($where)->from('favourite')->join('events', 'events.event_id = favourite.event_id')->join('venue', 'venue.id = events.venue_id')->join('event_gallery', 'events.event_id = event_gallery.event_id AND event_gallery.media_type = 0', 'LEFT')->group_by('events.event_id')->get()->result();
				if(count($result)>0){
					$response = array();
					foreach ($result as $rs) {
						if($rs->layout!=''){
							if($rs->custom_seat_layout!=''){
								$pricelist = json_decode($rs->custom_seat_layout, TRUE);
								$price = min(array_column($pricelist, 'price'));
							} else {
								$pricelist = json_decode($rs->layout_details, TRUE);
								$price = min(array_column($pricelist, 'price'));
							}
						} else {
							$pricelist = json_decode($rs->seat_pricing, TRUE);
							$price = $pricelist['price'];
						}
						$resData = array(
							'event_name_en'=>$rs->event_name_en,
							'media_url'=>$rs->media_url,
							'fav_status'=>$rs->fav_status,
							'price'=>$price,
							'event_id'=>$rs->event_id
						);
						array_push($response, $resData);
					}
					$res = array('status'=>1,'data'=>$response);
				} else {
					$res = array('status'=>0,'message'=>'No favourites yet!','code'=>'ER22');
				}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}
 			

 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function bookedlist($data,$per_page='',$page ='',$count ='') {
 		try {
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) {
				if($page == 0 && $per_page == 0){
					$page = $page;
				}else{
					$page = (isset($data['page']))? $data['page']:1;
				}
				$page_limit = ($page - 1) * $per_page;
				$cond =($per_page == 0 && $page == 0)?'':"LIMIT $page_limit, $per_page";

				$sql = "SELECT ODR.order_id,ODR.order_type,ODR.booking_id 
						FROM orders AS ODR
 						LEFT JOIN booking AS BOK ON 
 								(ODR.booking_id=BOK.bookId AND BOK.status IN (0,1,2,3,5,6))
 						LEFT JOIN flight_booking AS FBK ON 
 								(ODR.booking_id=FBK.flight_book_id AND FBK.status IN (0,1,2,3,5))
 						LEFT JOIN hotel_booking AS HBK ON 
 								(ODR.booking_id=HBK.hotel_book_id AND HBK.status IN (0,1,2,3,5)) 
						WHERE ODR.customer_id='$user_id'
 						GROUP BY ODR.order_id 
 						ORDER BY ODR.order_id DESC $cond";

				$sql = "SELECT ODR.order_id,ODR.order_type,ODR.booking_id 
						FROM orders AS ODR
 						INNER JOIN booking AS BOK ON (ODR.booking_id=BOK.bookId)
						WHERE ODR.customer_id='$user_id' AND ODR.order_type='1' AND BOK.status IN (0,1,2,5,6)
	 					GROUP BY ODR.order_id 
 						ORDER BY ODR.order_id DESC $cond";

				$bookedData = $this->db->query($sql);

				if($per_page == 0 && $page == 0){
					return $bookedData->num_rows();
				}
				if(count($bookedData) > 0) {
					if($count > $page_limit) {
						$bookData = array();
						foreach (($bookedData = $bookedData->result_array()) as $key => $value) {
							switch($value['order_type']){
								case 1 : $resp = $this->getEventData($value['booking_id'],$user_id);break;
								// case 2 : $resp = $this->getHotelData($value['booking_id'],$user_id);break;
								// case 3 : $resp = $this->getFlightData($value['booking_id'],$user_id);break;
							}
							if(!empty($resp)){
								$bookData[] = $resp;
							}
						}
 						$meta = array('total_pages'=>ceil($count/$per_page),'total'=>$count,
 									  'current_page'=>$page,'per_page'=>$per_page);

 						$response = array('data'=>$bookData,'meta'=>$meta);
 						$res = array('status'=>1,'data'=>$response);
 					} else {
 						$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 					}
 				} else {
 					$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 				} 				
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function getEventData($booking_id='',$user_id=''){
		$sql = "SELECT booking.id AS book_id,booking.bookId AS bookingCode,booking.amount,
					   event_date_time.date AS event_date,booking.qrcode,booking.ticket_details,
					   venue.location,event_date_time.time AS event_time,booking.event_id,
					   event_gallery.media_url,booking.no_of_ticket,events.has_payment,
					   venue.id AS venue_id,venue.location_lat AS lat,venue.location_lng AS lng,
					   transaction.status AS transaction_status,booking.status AS book_status,
					   customer.name AS customer_name,customer.profile_image
				FROM booking
				INNER JOIN events ON booking.event_id = events.event_id
				INNER JOIN event_date_time ON booking.event_date_id = event_date_time.id
				INNER JOIN venue ON venue.id = events.venue_id
				INNER JOIN customer ON customer.customer_id=booking.customer_id
				LEFT JOIN event_gallery ON events.event_id=event_gallery.event_id AND 
 														   event_gallery.media_type=0 
				LEFT JOIN transaction ON transaction.booking_id=booking.bookId
				WHERE booking.bookId='$booking_id' AND booking.customer_id=$user_id";

		$eventData = $this->db->query($sql)->row_array();
		if(empty($evtData = $this->db->query($sql)->row_array()) || 
		   ($evtData['has_payment'] == '1' && $evtData['transaction_status'] != '1')){
			return;
		}
		$eventData['order_type'] = 1;

		$evtLang  = langTranslator($eventData['event_id'],'EVT');
		$vneLang  = langTranslator($eventData['venue_id'],'VEN');
		$eventData = array_merge($eventData,$evtLang);
		$eventData = array_merge($eventData,$vneLang);
		return $eventData;
	}

	function getHotelData($booking_id='',$user_id=''){
		$sql = "SELECT HBK.id AS book_id, HBK.hotel_book_id AS bookingCode,HBK.price AS amount,
					   HBK.checkin AS event_date,HBK.hotel_name AS event_name,HBK.qrcode,
					   HBK.hotel_image AS media_url,HBK.status AS book_status,HBK.traveller_details,
					   TRS.status AS transaction_status
				FROM hotel_booking AS HBK
				LEFT JOIN transaction AS TRS ON TRS.booking_id=HBK.hotel_book_id
				WHERE HBK.hotel_book_id='$booking_id'";

		$hotelData =  $this->db->query($sql)->row_array();
		if(empty($hotelData)){
			return;
		}

		$hotelData['location'] = '';
		$hotelData['no_of_ticket'] = '';
		if(isset($hotelData['traveller_details']) && !empty($hotelData['traveller_details']) && 
		   !empty($trvlDtls = json_decode($hotelData['traveller_details']))){
			$hotelData['location'] = (isset($trvlDtls->hotel_address))?$trvlDtls->hotel_address:'';
			$hotelData['no_of_ticket'] = (isset($trvlDtls->roomDetails) && isset($trvlDtls->roomDetails->room))?$trvlDtls->roomDetails->room.' Room':'';
		}
		$hotelData['order_type'] = 2;
		$hotelData['has_payment'] = 1;
		$hotelData['event_time'] = '11:00';
		$hotelData['venue_id'] = $hotelData['event_id'] = $hotelData['book_id'];
		return $hotelData;
	}

	function getFlightData($booking_id='',$user_id=''){
		$sql = "SELECT FBK.id AS book_id,FBK.flight_book_id AS bookingCode,FBK.price AS amount,
					   FBK.departure_date AS event_date,FBK.flight_name AS event_name,FBK.qrcode,
					   FBK.flight_image AS media_url,FBK.status AS book_status,
					   FBK.traveller_details,TRS.status AS transaction_status 
				FROM flight_booking AS FBK
				LEFT JOIN transaction AS TRS ON TRS.booking_id=FBK.flight_book_id
				WHERE FBK.flight_book_id='$booking_id'";

		$flightData =  $this->db->query($sql)->row_array();
		if(empty($flightData)){
			return;
		}
		$flightData['location'] = '';
		$flightData['no_of_ticket'] = '';
		if(isset($flightData['traveller_details']) && !empty($flightData['traveller_details']) && 
		   !empty($trvlDtls = json_decode($flightData['traveller_details']))){
		   	if(isset($trvlDtls->fromAirportCity) && isset($trvlDtls->toAirportCity)){
		   		$flightData['location'] = $trvlDtls->fromAirportCity.' - '.$trvlDtls->toAirportCity;
		   	}
		   	if(isset($trvlDtls->passengerDetails) && isset($trvlDtls->passengerDetails->adult) && 
		       isset($trvlDtls->passengerDetails->children) && isset($trvlDtls->passengerDetails->infant)){
		   		$flightData['no_of_ticket'] = (int)$trvlDtls->passengerDetails->adult + 
		  			(int)$trvlDtls->passengerDetails->children + (int)$trvlDtls->passengerDetails->infant;
		   	}
			
		}
		
		$fghtTme = explode("T",$flightData['event_date']); 
		$flightData['event_date'] = (isset($fghtTme[0]) && !empty($fghtTme[0]))?$fghtTme[0]:'';
		$flightData['event_time'] = (isset($fghtTme[1]) && !empty($fghtTme[1]))?$fghtTme[1]:'';
		$flightData['order_type'] = 3;
		$flightData['has_payment'] = 1;
		$flightData['venue_id'] = $flightData['event_id'] = $flightData['book_id'];
		return $flightData;
	}

 	function bookingdetails($data) {
 		$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		try {
 			$user_id = $this->auth_token_get($data['auth_token']);
 			$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			if($user_id > 0) {
 				$cond = array('booking_id'=>$data['bookingCode'],'customer_id'=>$user_id);
 				$ordType = $this->get_where('orders',$cond)->row_array();
 				if(empty($ordType) || !isset($ordType['order_type']) || empty($ordType['order_type'])){
 					return array('status'=>0,'message'=>'Invalid booking code','code'=>'ER24');
 				}

 				if($ordType['order_type'] == 1){
					$resp = $this->getEventData($data['bookingCode'],$user_id);
					$res = array('status'=>0,'message'=>'No Data Found','code'=>'ER30');
					if(!empty($resp)){
						$res = array('status'=>1,'data'=>$resp);
					}
				}
 			}
 		} catch(Exception $e) {} 
 		return $res;
 	}

 	function cancel($data) {
 		try {
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) { 
				$rs = $this->db->where('bookId',$data['bookingCode'])->update('booking',array('status'=>0));
				if($rs) {
					$sql = "SELECT TEVT.event_name, CONCAT(EDATE.date,' ',EDATE.time) AS show_time,
				            	   CUST.name, CUST.email, EVT.provider_id, PDR.email AS prv_email
				            FROM booking AS BK 
				            INNER JOIN events AS EVT ON (EVT.event_id=BK.event_id)
				       	    INNER JOIN translator_event AS TEVT ON (TEVT.event_id=EVT.event_id)
				            INNER JOIN customer AS CUST ON (CUST.customer_id=BK.customer_id)
				            INNER JOIN event_date_time AS EDATE ON (EDATE.id=BK.event_date_id)
						    LEFT JOIN provider AS PDR ON (PDR.provider_id=EVT.provider_id)
				            WHERE BK.bookId='".$data['bookingCode']."' AND TEVT.language_code='EN'";
	          		$bkData = $this->db->query($sql)->row_array();

	          		if(!empty($bkData)){
	          			$showTime   = date("d'S F Y - h:i, (l)",strtotime($bkData['show_time']));
	          			$message = "<html><body><p>
	    							Hi, Booking canceled for the event ".$bkData['event_name'].", booked by ".
		    						$bkData['name']." (".$bkData['email'].") for the show on '".$showTime.
		    						"'. Booking ID ".$data['bookingCode']."
			    					</p></body></html>";
						if(empty($bkData['provider_id']) || $bkData['provider_id'] == 1){
							$settings   = getSettings();
							$adminMail = $settings['admin_mail_id'];
							$this->send_mail("Booking Cancelled - TimeOut",$adminMail,$message);
						} else {
							$this->send_mail("Booking Cancelled - TimeOut",$bkData['prv_email'],$message);
						}
	          		}

					$res = array('status'=>1,'data'=>null);
				} else {
					$res = array('status'=>0,'message'=>'Cancel submission failed','code'=>'ER25');
				}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}

 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function confirm($data) {
 		try {
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) { 
 				$res_count=$this->db->where('bookId',$data['bookingCode'])->get('booking')->num_rows();
 				if($res_count > 0) {
					$sql = "SELECT booking.id AS book_id,booking.event_id,booking.bookId AS bookingCode,
								   booking.qrcode,booking.no_of_ticket,booking.amount,venue.id AS venue_id,
								   booking.status AS book_status,event_gallery.media_url,venue.location,
								   customer.name AS customer_name,customer.profile_image,
								   booking.ticket_details,event_date_time.time,event_date_time.date,
								   venue.location_lat AS lat,venue.location_lng AS lng
						    FROM booking 
						    JOIN events ON booking.event_id=events.event_id 
						    JOIN event_date_time ON booking.event_date_id=event_date_time.id 
						    JOIN venue ON venue.id=events.venue_id 
						    LEFT JOIN event_gallery ON events.event_id=event_gallery.event_id 
						    JOIN customer ON customer.customer_id=booking.customer_id 
						    WHERE booking.bookId='".$data['bookingCode']."'";
				    $result = $this->db->query($sql)->row_array();

	 				if(count($result)>0){
	 					$eData  = langTranslator($result['event_id'],'EVT');
	 					$result = array_merge($result,$eData);
	 					$vData  = langTranslator($result['venue_id'],'VEN');
	 					$result = array_merge($result,$vData);

	 					$res = array('status'=>1,'data'=>$result);
	 				} else {
	 					$res = array('status'=>0,'message'=>'Invalid booking code','code'=>'ER24');
	 				}
 				} else {
 					$res = array('status'=>0,'message'=>'Invalid booking code','code'=>'ER24');
 				}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}

 		} catch(Exception $e) {
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	public function userinfo($data){
 		try{
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) { 
 				$this->db->select('customer.name,customer.phone,customer.email,customer.profile_image AS image,customer.gender,users.id AS userId, customer.profile_city AS city');
	 			$this->db->where('users.id',$user_id);
		 		$this->db->from('users');
		 		$this->db->join('customer','customer.customer_id = users.id');
		 		$result = $this->db->get()->row();
		 		if($result){
		 			$res = array('status'=>1,'data'=>$result);
		 		} else {
		 			$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
		 		}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');	
 			} 			
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;	
 	}

    function imageResize($path,$size){
        $this->load->library('image_lib');
        $config['width']          = $size['width'];
        $config['height']         = $size['height'];
        $config['new_image']      = $path;
        $config['source_image']   = $path;
        $config['create_thumb']   = FALSE;
        $config['image_library']  = 'gd2';
        $config['maintain_ratio'] = TRUE;
        $this->image_lib->clear();
        $this->image_lib->initialize($config);
        $this->image_lib->resize();
    }

 	public function update_profile($data) {
 		try{
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) { 
		 		$post_data = $data;
		 		unset($post_data['file']);
		 		unset($post_data['auth_token']);
		 		$post_data['dob'] = (!empty($post_data['dob']))?strtotime($post_data['dob'])*1000:'';
		 		if(isset($post_data['city'])){
		 			$post_data['profile_city'] = $post_data['city'];
		 			unset($post_data['city']);
		 		}

	 			$state = $this->db->where('customer_id',$user_id)->update('customer',$post_data);
	 			if($state){
					$this->db->select('customer.name,customer.dob,customer.phone,customer.email,
		 							   customer.profile_image AS image,customer.gender,users.id AS userId,
		 							   customer.profile_image_qr,customer.profile_city AS city');
		 			$this->db->where('users.id',$user_id);
			 		$this->db->from('users');
			 		$this->db->join('customer','customer.customer_id = users.id');
			 		$result = $this->db->get()->row();
			 		
			 		if($result){
			 			$result->dob = (!empty($result->dob))?date("m/d/Y", ($result->dob)/1000):'';
			 			$res = array('status'=>1,'data'=>$result);
			 		} else {
			 			$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
			 		}
				} else {
					$res = array('status'=>0,'message'=>'Profile update failed','code'=>'ER32');
				}
		 	} else {
		 		$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');	
		 	} 
		} 
		catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function tempbooking($data) {
 		try{
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) {
 				$post_data = $data;
 				$status = (isset($post_data['has_payment']) && $post_data['has_payment'] == 0)?'1':'3';
				
 				$post_data['status'] 			= $status;
				$post_data['bookId'] 			= 'TO'.date('ymd').str_pad(rand(1111,9999),4,0,STR_PAD_LEFT);
				$post_data['qrcode'] 			= genQRcode($post_data['bookId']);
 				$post_data['customer_id'] 		= $user_id;
				$post_data['booking_date'] 		= date('Y-m-d H:i:s');
 				$post_data['ticket_details'] 	= json_encode($post_data['ticket_details']);

 				if(!isset($post_data['amount']) || $post_data['amount'] == ''){
 					$post_data['amount'] = 0;
 				}

 				$evtData = $this->db->get_where('event_date_time',
 												array('event_id'=>$post_data['event_id'],
			        	    						  'date'=>$post_data['event_date'],
			        	    						  'time'=>$post_data['event_time'],'status'=>'1'));
				if(empty($evtData = $evtData->row_array()) || !isset($evtData['id']) || 
				   empty($post_data['event_date_id'] = $evtData['id'])){
					$res = array('status'=>0,'message'=>'Event date or time is invalid','code'=>'ER06');
				}

				$evtData = $this->db->get_where('events',array('event_id'=>$post_data['event_id']));
				$evtData = $evtData->row_array();
				if(!empty($evtData) && isset($evtData['approve_booking']) && $evtData['approve_booking']=='1'){
					$post_data['status'] = '6';
				}

				$promocodeData = array();
				if(isset($post_data['promocode_id']) && !empty($post_data['promocode_id']) && 
				   isset($post_data['redeem_amount']) && !empty($post_data['redeem_amount'])){

					$promoStatus   = ($post_data['status'] == '1')?1:0;
					$promocodeData = array('user_id'=>$user_id,'booking_id'=>$post_data['bookId'],
										   'promocode_id'=>$post_data['promocode_id'],
										   'redeem_amount'=>$post_data['redeem_amount'],
										   'created_date'=>date('Y-m-d H:i:s'),'status'=>$promoStatus);
				}
				$auth_token = $post_data['auth_token'];
				$card_data = (isset($post_data['cardData']))?$post_data['cardData']:array();
 				unset($post_data['auth_token'],$post_data['has_payment'],$post_data['cardData'],
 					  $post_data['promocode_id'],$post_data['redeem_amount'],$post_data['event_date'],
 					  $post_data['event_time']);

				$rs = $this->db->insert('booking', $post_data);
				$this->db->insert('orders',array('booking_id'=>$post_data['bookId'],'order_type'=>'1','created_date'=>date('Y-m-d h:i:s'),'customer_id'=>$user_id));
				if($rs){
					if(!empty($promocodeData)){
						$this->db->insert('promocode_used',$promocodeData);
					}
					$cardDetails = array();
					if(!empty($card_data)){
						switch($card_data->card_type) {
							case '1': $cardDetails['cardMode'] = 'DD'; break;
							case '2': $cardDetails['cardMode'] = 'CC'; break;
							default : $cardDetails['cardMode'] = 'CC'; break;
						}

						switch(substr($card_data->card_number,0,1)) {
							case '4': $cardDetails['cardType'] = 'VisaCard'; break;
							case '5': $cardDetails['cardType'] = 'Mastercard'; break;
							case '6': $cardDetails['cardType'] = 'DiscoverCard'; break;
							default : $cardDetails['cardType'] = 'Mastercard'; break;
						}

						$cardDetails['cvv'] = $card_data->card_cvv;
						$cardDetails['cardNumber'] = $card_data->card_number;
						$cardDetails['expMonthYear'] = $card_data->exp_date.$card_data->exp_year;
						$cardDetails['cardHolderName'] = $card_data->holder_name;
					}
		 			$reqData = array('amount'=>$post_data['amount'],'event_id'=>$post_data['event_id'],
		 							 'cardData'=>$cardDetails,'auth_token'=>$auth_token,
		 							 'booking_id'=>$post_data['bookId']);

		 			$res = array('status'=>1,'data'=>array('user_id'=>$user_id,
		 						 'bookingCode'=>$post_data['bookId'],'reqData'=>$reqData));

		 			if($status == 1){
		 				$sql = "SELECT TEVT.event_name, CUST.name, CUST.email, CUST.phone,
					            	   CONCAT(EDATE.date,' ',EDATE.time) AS show_time, PDR.fcm_token,
					            	   EVT.provider_id, PDR.email AS prv_email
					            FROM booking AS BK 
					            INNER JOIN events AS EVT ON (EVT.event_id=BK.event_id)
					            INNER JOIN customer AS CUST ON (CUST.customer_id=BK.customer_id)
					            INNER JOIN event_date_time AS EDATE ON (EDATE.id=BK.event_date_id)
					            INNER JOIN translator_event AS TEVT ON (TEVT.event_id=EVT.event_id)
					            LEFT JOIN provider AS PDR ON (PDR.provider_id=EVT.provider_id)
					            WHERE EVT.status='1' AND BK.status IN ('1','6') AND EDATE.status='1' AND 
					                  TEVT.language_code='EN' AND BK.bookId='".$post_data['bookId']."'";
		          		$bkData = $this->db->query($sql)->row_array();

		          		if(!empty($bkData)){
						    $showTime   = date("d'S F Y - h:i, (l)",strtotime($bkData['show_time']));
						    $msgContent = "Hi, Your booking is confirmed for the event '".
						    			   $bkData['event_name']."' and show is on '".$showTime."'. 
						    			   Booking ID ".$post_data['bookId'];
						    $message    = "<html><body><p>".$msgContent."</p></body></html>";

					        $template   = getNotifTemplate();
				            if(isset($template['booking_mail']) && !empty($template['booking_mail'])){
				                $msgContent = str_replace(
						        				array('{:event_name}','{:booking_id}','{:time}'),
				    						    array($bkData['event_name'],$post_data['bookId'],$showTime),
				    						    $template['booking_mail']);
				            }
						    $this->send_mail("Your Tickets - TimeOut",$bkData['email'],$message);

						    $message = "<html><body><p>
			    						Hi, New booking for the event ".$bkData['event_name']." is done by ".
			    						$bkData['name']." (".$bkData['email'].") and show is on '".$showTime.
			    						"'. Booking ID ".$post_data['bookId']."
				    					</p></body></html>";
	    					if(empty($bkData['provider_id']) || $bkData['provider_id'] == 1){
	    						$settings   = getSettings();
	    						$adminMail = $settings['admin_mail_id'];
	    						$this->send_mail("New Event Booking - TimeOut",$adminMail,$message);
	    					} else {
	    						$this->send_mail("New Event Booking - TimeOut",$bkData['prv_email'],$message);
	    					}
						    
						    if(isset($template['booking_sms']) && !empty($template['booking_sms'])){
						        $msgContent = str_replace(
						        				array('{:event_name}','{:booking_id}','{:time}'),
				    						    array($bkData['event_name'],$post_data['bookId'],$showTime),
				    						    $template['booking_sms']);
						    }
						    $this->sendSMS($bkData['phone'],$msgContent);

						    if($post_data['status'] == 6 && 
						       isset($bkData['fcm_token']) && !empty($bkData['fcm_token'])){
						    	$userData = array('id'=>$post_data['bookId'],
								  'title'=>'New Booking',
								  'param'=>'booking_id',
								  'message'=>'New Booking is There For Approval');
		  						push_sent_cancel(2,$bkData['fcm_token'],$userData);
						    }
		          		}
					}
		 		} else {
		 			$res = array('status'=>0,'message'=>'Seat booking failed','code'=>'ER37');
		 		}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');	
 			} 			
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res;
 	}

 	function generateQR($data) {
 		return 'https://www.barcodefaq.com/wp-content/uploads/2018/08/gs1-qrcode-fnc1.png';
 	}

 	function recommend($data) {
 		try {
 			$locCond = '';
 			$per_page = 10;
 			$user_id = $this->auth_token_get($data['auth_token']);

 			if(isset($data['city_id']) && !empty($data['city_id'])){
 				$locCond = " AND venue.region_id='".$data['city_id']."'";
 			}

			$languages = getLanguages();	
			$tagDummy = array();
			foreach ($languages AS $lang) {
		 		$tagDummy['tag_'.$lang] = array();
		 	} 	
 			if($user_id > 0) {
 				$count = $this->db->query("
 					SELECT events.event_id 
 					FROM events 
 					INNER JOIN venue ON venue.id = events.venue_id
 					INNER JOIN event_date_time ON events.event_id = event_date_time.event_id
 					WHERE events.status = 1 AND event_date_time.status='1' AND  						  
 						  event_date_time.date >= DATE_FORMAT(NOW(),'%Y-%m-%d') $locCond
 					GROUP BY events.event_id")->num_rows();
 				if($count > 0) {

 					if(isset($data['page'])) {
 						$page = $data['page']; 						
 					} else {
 						$page = 1;
 					}

 					$page_limit = ($page - 1) * $per_page;

 					if($count > $page_limit) {
 						$this->db->query("SET SESSION group_concat_max_len = 200000");
 						$sql = "SELECT events.event_id,venue.location,events.seat_pricing,venue.id AS venue_id,
 									   events.custom_seat_layout,venue.layout,venue.layout_details,
 									   event_gallery.media_url,favourite.status AS fav_status,
 									   GROUP_CONCAT(DISTINCT event_tags.tag_id) AS tag_ids,
 									   GROUP_CONCAT(DISTINCT CONCAT_WS('#',event_date_time.id,event_date_time.date,event_date_time.time)) AS date_time,events.directory_listing
 							FROM events 
 							INNER JOIN event_date_time ON events.event_id = event_date_time.event_id
 							INNER JOIN venue ON venue.id = events.venue_id 
 							LEFT JOIN event_gallery ON events.event_id=event_gallery.event_id AND 
 											           event_gallery.media_type=0 
 							LEFT JOIN booking ON booking.event_id = events.event_id 
 							LEFT JOIN favourite ON favourite.event_id = events.event_id AND 
 												   favourite.user_id = '$user_id' AND favourite.status = 1 
 							LEFT JOIN event_tags ON events.event_id = event_tags.event_id 
 							WHERE events.status = 1 AND event_date_time.status='1' AND 
 								  event_date_time.date>=DATE_FORMAT(NOW(),'%Y-%m-%d') $locCond
 							GROUP BY events.event_id 
 							LIMIT $page_limit,$per_page";
 						$result = $this->db->query($sql)->result();

						if(count($result)>0){
							$resultData = array();
							foreach ($result as $rs) {
								if(!empty($dates = explode(',',$rs->date_time))){
									$checkTime = 0;
									foreach ($dates as $date) {
										$dArr = explode('#', $date);
										if($dArr[1] == date("Y-m-d") && 
										   $dArr[1].' '.$dArr[2] < date("Y-m-d H:i", strtotime('+15 minutes'))){
											$checkTime += 1;
										}
									}
									if($checkTime == count($dates)){
										continue;
									}
								} else {
									continue;
								}

								$sql    = "SELECT AVG(review.rate) AS rate 
										   FROM review WHERE event_id=$rs->event_id";
								$rating = $this->db->query($sql)->row_array();
								$rate   = isset($rating['rate'])&&!empty($rating['rate'])?
										  round($rating['rate'],1):'0.0';

								$sql    = "SELECT SUM(booking.no_of_ticket) AS attend FROM booking 
										   WHERE status IN (1,2) AND event_id=$rs->event_id";
								$atten  = $this->db->query($sql)->row_array();
								$atte   = isset($atten['attend'])&&!empty($atten['attend'])?
											$atten['attend']:'0';

								if($rs->layout!=''){
									if($rs->custom_seat_layout!=''){
										$pricelist = json_decode($rs->custom_seat_layout, TRUE);
										$price = min(array_column($pricelist, 'price'));
									} else {
										$pricelist = json_decode($rs->layout_details, TRUE);
										$price = min(array_column($pricelist, 'price'));
									}
								} else {
									$pricelist = json_decode($rs->seat_pricing, TRUE);
									$price = $pricelist['price'];
								}

								$tagArr = array();
								$resData = array();

								$resData['rate'] = $rate;
								$resData['price'] = $price;
								$resData['event_id'] = $rs->event_id;
								$resData['is_demo'] = $rs->directory_listing;
								$resData['attendees'] = $atte;
								$resData['media_url'] = $rs->media_url;
								$resData['fav_status'] = $rs->fav_status;
								$resData['venue_location'] = $rs->location;

								$evtData = langTranslator($rs->event_id,'EVT');
								$resData = array_merge($resData,$evtData);

								$venData = langTranslator($rs->venue_id,'VEN');
								$resData = array_merge($resData,$venData);

								if(!empty($rs->tag_ids) && !empty($tag_ids = explode(',',$rs->tag_ids))){
									foreach ($tag_ids AS $key => $id) {
										$tags = langTranslator($id,'TAG');
										foreach ($tags AS $key => $id) {
											if(isset($tagArr[$key])){
												$tagArr[$key][] = $id;
											} else {
												$tagArr[$key] = array($id);
											}
										}
								 	} 
								} else {
									$tagArr = $tagDummy;
								}
								$resData = array_merge($resData,$tagArr);
								array_push($resultData, $resData);
							}
							
							$meta = array('total_pages'=>ceil($count/$per_page),
		 									  'total'=>$count,
		 									  'current_page'=>$page,
		 									  'per_page'=>$per_page
		 									 );
							$response = array('data'=>$resultData,'meta'=>$meta);
							$res = array('status'=>1,'data'=>$response);
						} else {
							$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
						}
					} else {
 						$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 					}
 				} else {
 					$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
 				}
 			} else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}
 		} catch(Exception $e) {
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res; 		
 	}

 	function discover($data) {

 		try {
			$cat_id = $data['cat_id'];
			$city_id = $data['city'];
			$category = $this->db->where('cat_id',$cat_id)->get('event_category')->row();
			$this->db->query("SET SESSION group_concat_max_len = 200000");
			$sql = "SELECT events.event_id,events.seat_pricing,events.custom_seat_layout,venue.layout, 
						   venue.layout_details,event_gallery.media_url,GROUP_CONCAT(DISTINCT CONCAT_WS('#',event_date_time.id,event_date_time.date,event_date_time.time)) AS date_time 
				    FROM events 
				    INNER JOIN venue ON venue.id=events.venue_id 
				    INNER JOIN event_date_time ON events.event_id=event_date_time.event_id AND 
				    							  event_date_time.date>=DATE_FORMAT(NOW(),'%Y-%m-%d') 
				    LEFT JOIN event_gallery ON events.event_id=event_gallery.event_id AND 
				    						   event_gallery.media_type=0 
				    WHERE events.status=1 AND events.category_id='$cat_id' AND 
			    		  event_date_time.status='1' AND venue.region_id='$city_id'
				    GROUP BY events.event_id";
			$result = $this->db->query($sql)->result();

			if(count($result)>0){
				$resultData = array();
				foreach ($result as $rs) {
					if(!empty($dates = explode(',',$rs->date_time))){
						$checkTime = 0;
						foreach ($dates as $date) {
							$dArr = explode('#', $date);
							if($dArr[1] == date("Y-m-d") && 
							   $dArr[1].' '.$dArr[2] < date("Y-m-d H:i", strtotime('+15 minutes'))){
								$checkTime += 1;
							}
						}
						if($checkTime == count($dates)){
							continue;
						}
					} else {
						continue;
					}

					if($rs->layout!=''){
						if($rs->custom_seat_layout!=''){
							$pricelist = json_decode($rs->custom_seat_layout, TRUE);
							$price = min(array_column($pricelist, 'price'));
						} else {
							$pricelist = json_decode($rs->layout_details, TRUE);
							$price = min(array_column($pricelist, 'price'));
						}
					} else {
						$pricelist = json_decode($rs->seat_pricing, TRUE);
						$price = $pricelist['price'];
					}
					$resData = langTranslator($rs->event_id,'EVT');
					$resData['price'] = $price;
					$resData['event_id'] = $rs->event_id;
					$resData['media_url'] = $rs->media_url;
					array_push($resultData, $resData);
				}
				$category->data = $resultData;
				$res = array('status'=>1,'data'=>$category);
			} else {
				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
			}
 		} catch(Exception $e) {
 			 $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res; 		
 	}


 	function event($data) {
 		try {
 			$bookedCount = 0;
			$event_id    = $data['event_id'];
			if(isset($data['auth_token']) && !empty($data['auth_token'])){
				$user_id = $this->auth_token_get($data['auth_token']); 
			}

			$tagDummy = array();
			$languages = getLanguages();	
			foreach ($languages AS $lang) {
		 		$tagDummy['tag_'.$lang] = array();
		 	} 	
		 	
 			if(!empty($user_id)) {
 				$sql = "SELECT SUM(no_of_ticket) AS bookCount FROM booking AS BOK
						WHERE event_id='$event_id' AND customer_id='$user_id' AND status IN (1)";
				$result = $this->db->query($sql)->row_array();
				if(!empty($result)){
					$bookedCount = $result['bookCount'];
				}
 			}

			$this->db->query("SET SESSION group_concat_max_len = 200000");
			$sql = "SELECT events.has_payment,events.event_id,events.seat_pricing,venue.layout,
						   events.custom_seat_layout,venue.id AS venue_id,events.seat_pricing,
						   venue.layout_details,events.max_booking,venue.location,
						   venue.location_lat AS lat,venue.location_lng AS lng, 
						   favourite.status AS fav_status,host_categories.show_layout,
						   GROUP_CONCAT(DISTINCT event_gallery.media_url) AS media_url,
						   GROUP_CONCAT(DISTINCT event_tags.tag_id) AS tag_ids,
						   GROUP_CONCAT(DISTINCT event_date_time.date) AS event_date,
						   GROUP_CONCAT(DISTINCT event_date_time.time) AS event_time, 
						   host_categories.customer_choice, events.directory_listing
					FROM events 
				    INNER JOIN event_date_time ON events.event_id = event_date_time.event_id 
				    INNER JOIN venue ON venue.id = events.venue_id 
				    LEFT JOIN event_gallery ON events.event_id=event_gallery.event_id AND 
				   			                  event_gallery.status!=0 
                    LEFT JOIN favourite ON favourite.event_id=events.event_id AND 
                   						  favourite.status=1 AND favourite.user_id='$user_id' 
					LEFT JOIN event_tags ON events.event_id=event_tags.event_id 
					INNER JOIN host_categories ON venue.host_cat_id=host_categories.host_cat_id
					WHERE events.event_id='$event_id' AND event_date_time.status='1'
					GROUP BY events.event_id, event_date_time.event_id";
			$result = $this->db->query($sql)->result();

			if(count($result)>0){
				$resultData = array();
				$event_layout = '';
				foreach ($result as $rs) {
					$sql = "SELECT AVG(review.rate) AS rate 
							FROM review WHERE event_id=$rs->event_id";
					$rating = $this->db->query($sql)->row_array();
					$rate=isset($rating['rate'])&&!empty($rating['rate'])?$rating['rate']:'0.0';

					$sql = "SELECT SUM(booking.no_of_ticket) AS attend FROM booking 
							WHERE status IN (1,2) AND event_id=$rs->event_id";
					$atten = $this->db->query($sql)->row_array();
					$atte=isset($atten['attend'])&&!empty($atten['attend'])?$atten['attend']:'0';
					$latlng = array('lat'=>$rs->lat, 'lng'=>$rs->lng);
					if($rs->layout!=''){
						if($rs->custom_seat_layout!=''){
							$pricelist = json_decode($rs->custom_seat_layout, TRUE);
							$price = min(array_column($pricelist, 'price'));
							$event_layout = $rs->custom_seat_layout;
						} else {
							$pricelist = json_decode($rs->layout_details, TRUE);
							$price = min(array_column($pricelist, 'price'));
							$event_layout = $rs->layout_details;
						}
					} else {
						$pricelist = json_decode($rs->seat_pricing, TRUE);
						$price = $pricelist['price'];
						$event_layout = $rs->seat_pricing;
					}

					$resData = array();
					$resData['latlng'] = $latlng;
					$resData['event_id'] = $rs->event_id;
					$resData['event_date'] = explode(',',$rs->event_date);
					$resData['event_time'] = explode(',',$rs->event_time);
					$resData['event_rate'] = $rate;
					$resData['event_urls'] = explode(',',$rs->media_url);
					$resData['fav_status'] = $rs->fav_status;
					$resData['event_price'] = $price;
					$resData['has_payment'] = $rs->has_payment;
					$resData['max_booking'] = $rs->max_booking-$bookedCount;
					$resData['show_layout'] = $rs->show_layout;
					$resData['seat_pricing'] = $rs->seat_pricing;
					$resData['venue_location'] = $rs->location;
					$resData['event_attendees'] = $atte;
					$resData['event_layout_url'] = $rs->layout;
					$resData['is_demo'] = $rs->directory_listing;
					$resData['is_requestable'] = $rs->customer_choice;
					$resData['event_price_layout'] = $event_layout;

					$evtData = langTranslator($rs->event_id,'EVT');
					$resData = array_merge($resData,$evtData);

					$venData = langTranslator($rs->venue_id,'VEN');
					$resData = array_merge($resData,$venData);

					$tagArr  = array();
					if(!empty($rs->tag_ids) && !empty($tag_ids = explode(',',$rs->tag_ids))){
						foreach ($tag_ids AS $key => $id) {
							$tags = langTranslator($id,'TAG');
							foreach ($tags AS $key => $id) {
								if(isset($tagArr[$key])){
									$tagArr[$key][] = $id;
								} else {
									$tagArr[$key] = array($id);
								}
							}
					 	} 
					} else {
						$tagArr = $tagDummy;
					}
					$resData = array_merge($resData,$tagArr);
					array_push($resultData, $resData);
				}
				$res = array('status'=>1,'data'=>$resultData);
			} else {
				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
			}
 			
 		} catch(Exception $e) {
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res; 		
 	}

 	function search($data) {
 		try {
 			$per_page = 10;
			$where = $case = '';
			$user_id = (!isset($data['auth_token']) || empty($data['auth_token']))?'':$this->auth_token_get($data['auth_token']); 	

			$languages = getLanguages();	
			$tagDummy = array();
			foreach ($languages AS $lang) {
		 		$tagDummy['tag_'.$lang] = array();
		 	} 	

			if(isset($data['cat_id']) && !empty($data['cat_id'])) {
				$where = ' AND events.category_id='.$data['cat_id'];
			}

			if(isset($data['choose_date']) && !empty($data['choose_date'])) {
				switch ($data['choose_date']) {
					case '1':$case = "";break;
					case '2':$case = "AND event_date_time.date = DATE_FORMAT(NOW(),'%Y-%m-%d')";break;
					case '3':
						$case = "AND event_date_time.date = DATE_FORMAT(NOW() + INTERVAL 1 DAY,'%Y-%m-%d')";
						break;
					case '4':
						$first_day_of_the_week = 'Monday';
						$start_of_the_week     = strtotime("Last $first_day_of_the_week");
						if ( strtolower(date('l')) === strtolower($first_day_of_the_week) ) {
						    $start_of_the_week = strtotime('today');
						}
						$end_of_the_week = $start_of_the_week + (60 * 60 * 24 * 7) - 1;
						$date_format =  'Y-m-d';
						$start_date =  date($date_format, $start_of_the_week);
						$end_date = date($date_format, $end_of_the_week);
						$case = "AND event_date_time.date>=$start_date AND event_date_time.date<=$end_date";
						break;
					case '5':
						$sunday = date( 'Y-m-d', strtotime( 'sunday this week'));
						$saturday = date( 'Y-m-d', strtotime( 'saturday this week'));
						$case = "AND event_date_time.date = $sunday OR event_date_time.date = $saturday";
						break;
				}
			}

			$sql = "SELECT events.event_id FROM events 
		 		    INNER JOIN event_date_time ON events.event_id=event_date_time.event_id $case 
		 		    WHERE events.status = 1 AND event_date_time.status='1' $where 
		 		    GROUP BY events.event_id";
			$count = $this->db->query($sql)->num_rows();

			if(isset($data['venue_id']) && !empty($data['venue_id'])) {
				$where .= " AND locality.id ='".$data['venue_id']."'";
			}

			if(isset($data['city_id']) && !empty($data['city_id'])) {
				$where .= " AND venue.region_id='".$data['city_id']."'";
			}

			if($count > 0) {
				if(isset($data['page'])) {
					$page = $data['page']; 						
				} else {
					$page = 1;
				}
				$page_limit = ($page - 1) * $per_page;

				if($count > $page_limit) {
					$this->db->query("SET SESSION group_concat_max_len = 200000");
					$result = $this->db->query("
						SELECT events.event_id,venue.id AS venue_id,venue.location,events.seat_pricing,
							   venue.layout,venue.layout_details,events.custom_seat_layout,
							   event_gallery.media_url,favourite.status AS fav_status,
							   GROUP_CONCAT(DISTINCT event_tags.tag_id) AS tag_ids,
							   GROUP_CONCAT(DISTINCT CONCAT_WS('#',event_date_time.id,event_date_time.date,event_date_time.time)) AS date_time,events.directory_listing
						FROM events 
						INNER JOIN event_date_time ON events.event_id=event_date_time.event_id $case
						INNER JOIN venue ON venue.id=events.venue_id 
						LEFT JOIN locality ON locality.id=venue.locality_id
						LEFT JOIN event_gallery ON events.event_id=event_gallery.event_id AND 
												   event_gallery.media_type=0 
						LEFT JOIN favourite ON favourite.event_id=events.event_id AND 
						          			   favourite.user_id='$user_id' AND favourite.status=1 
						LEFT JOIN event_tags ON events.event_id=event_tags.event_id AND event_tags.status=1
						WHERE events.status=1 AND event_date_time.status='1' AND 
							  event_date_time.date>=DATE_FORMAT(NOW(),'%Y-%m-%d') $where 
						GROUP BY events.event_id 
						ORDER BY events.event_id DESC LIMIT $page_limit,$per_page")->result();

			if(count($result)>0){
				$resultData = array();
				foreach ($result as $rs) {
					if(!empty($dates = explode(',',$rs->date_time))){
						$checkTime = 0;
						foreach ($dates as $date) {
							$dArr = explode('#', $date);
							if($dArr[1] == date("Y-m-d") && 
							   $dArr[1].' '.$dArr[2] < date("Y-m-d H:i", strtotime('+15 minutes'))){
								$checkTime += 1;
							}
						}
						if($checkTime == count($dates)){
							continue;
						}
					} else {
						continue;
					}

					$sql    = "SELECT AVG(review.rate) AS rate 
							   FROM review WHERE event_id=$rs->event_id";
					$rating = $this->db->query($sql)->row_array();
					$rate   = isset($rating['rate'])&&!empty($rating['rate'])?
							  $rating['rate']:'0.0';

					$sql    = "SELECT SUM(booking.no_of_ticket) AS attend FROM booking 
							   WHERE status IN (1,2) AND event_id=$rs->event_id";
					$atten  = $this->db->query($sql)->row_array();
					$atte   = isset($atten['attend'])&&!empty($atten['attend'])?
								$atten['attend']:'0';

					if($rs->layout!=''){
						if($rs->custom_seat_layout!=''){
							$pricelist = json_decode($rs->custom_seat_layout, TRUE);
							$price = min(array_column($pricelist, 'price'));
						} else {
							$pricelist = json_decode($rs->layout_details, TRUE);
							$price = min(array_column($pricelist, 'price'));
						}
					} else {
						$pricelist = json_decode($rs->seat_pricing, TRUE);
						$price = $pricelist['price'];
					}

					$tagArr = array();
					$resData = array();

					$resData['rate'] = $rate;
					$resData['price'] = $price;
					$resData['event_id'] = $rs->event_id;
					$resData['attendees'] = $atte;
					$resData['media_url'] = $rs->media_url;
					$resData['fav_status'] = $rs->fav_status;
					$resData['venue_location'] = $rs->location;
					$resData['is_demo'] = $rs->directory_listing;

					$evtData = langTranslator($rs->event_id,'EVT');
					$resData = array_merge($resData,$evtData);

					$venData = langTranslator($rs->venue_id,'VEN');
					$resData = array_merge($resData,$venData);

					if(!empty($rs->tag_ids) && !empty($tag_ids = explode(',',$rs->tag_ids))){
						foreach ($tag_ids AS $key => $id) {
							$tags = langTranslator($id,'TAG');
							foreach ($tags AS $key => $id) {
								if(isset($tagArr[$key])){
									$tagArr[$key][] = $id;
								} else {
									$tagArr[$key] = array($id);
								}
							}
					 	} 
					} else {
						$tagArr = $tagDummy;
					}
					$resData = array_merge($resData,$tagArr);
					array_push($resultData, $resData);
				}
				$meta = array('total_pages'=>ceil($count/$per_page),'total'=>$count,
							  'current_page'=>$page,'per_page'=>$per_page);

				$response = array('data'=>$resultData,'meta'=>$meta);
				$res = array('status'=>1,'data'=>$response);
			} else {
				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
			}
		} else {
					$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
				}
			} else {
				$res = array('status'=>0,'message'=>'No records found','code'=>'ER13');
			}
 		} catch(Exception $e) {
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		} 
 		return $res; 		
 	}


	function searchEvent($data) {
 		$str = urldecode(strtolower($data['str']));

		$this->db->query("SET SESSION group_concat_max_len=20000");
		$sql = "SELECT GROUP_CONCAT(DISTINCT CONCAT_WS('#',EDATE.id,EDATE.date,EDATE.time)) 
					   AS date_time,EVT.event_id
				FROM events AS EVT
				INNER JOIN event_date_time AS EDATE ON (EVT.event_id=EDATE.event_id)
				INNER JOIN translator_event AS TEVT ON (TEVT.event_id=EVT.event_id)
				WHERE TEVT.event_name LIKE '%$str%' AND EDATE.date>=DATE_FORMAT(NOW(),'%Y-%m-%d') AND 
					  EVT.status='1' AND EDATE.status='1'
	  		    GROUP BY EVT.event_id LIMIT 5";
		$resCount = $this->db->query($sql)->result_array();
		
		if(!empty($resCount)){
			foreach ($resCount AS $key => $rs) {
			  	if(!empty($dates = explode(',',$rs['date_time']))){
					$checkTime = 0;
					foreach ($dates as $date) {
						if(empty($date)){ unset($resCount[$key]); continue; }

						$dArr = explode('#', $date);
						if($dArr[1] == date("Y-m-d") && 
						   $dArr[1].' '.$dArr[2] < date("Y-m-d H:i", strtotime('+15 minutes'))){
							$checkTime += 1;
						}
					}
					if($checkTime == count($dates)){ 
						unset($resCount[$key]); 
						continue; 
					}
					$evtData = langTranslator($rs['event_id'],'EVT');
					$resCount[$key] = array_merge($resCount[$key],$evtData);
				} else { 
					unset($resCount[$key]); continue; 
				}
				unset($resCount[$key]->date_time);
			}
		}
		$sEvents = (!empty($resCount))?$resCount:[];

 		$region = $this->db->query("SELECT REG.id FROM region AS REG
 									INNER JOIN translator_region AS TREG ON (TREG.region_id=REG.id)
 			                        WHERE TREG.region_name LIKE '%$str%' AND REG.status=1 
	                                GROUP BY REG.id LIMIT 5")->result_array();
 		if(!empty($region)){
 			foreach ($region AS $key => $regData) {
 				$reg = langTranslator($regData['id'],'REG');
 				$region[$key] = array_merge($region[$key],$reg);
 			}
 		}
 		$response = array('events'=>$sEvents, 'cityList'=>$region);
 		$res = array('status'=>1,'data'=>$response);
 		return $res;
 	}

 	function getUserData($cust_id = ''){
 		if(empty($cust_id)){
 			return 0;
 		}
	    $this->db->select('customer.name,customer.dob,customer.phone,customer.email,customer.gender,
	    				   customer.profile_image AS image,users.id AS userId,customer.profile_city AS city,customer.dob,
	    				   customer.email_verified');
		$this->db->where('users.status',1);
 		$this->db->where('customer.customer_id',$cust_id);
 		$this->db->from('users');
 		$this->db->join('customer','customer.customer_id = users.id');
 		return $this->db->get()->row();
 	}

 	function payNow($data){
 		try{
 			$user_id = $this->auth_token_get($data['auth_token']);
 			if($user_id > 0) {
 				$callback_url = (isset($data['callback_url']))?$data['callback_url']:'';
 				$insertData = array('customer_id'=>$user_id,'booking_id'=>$data['booking_id'],
 								    'datetime'=>date('Y-m-d h:i:s'),'amount'=>$data['amount'],
 								    'callback_url'=>$callback_url);
				$this->db->insert('transaction',$insertData);
				$last_id = $this->db->insert_id();

				$custData = $this->getUserData($user_id);
				$res = array('status'=>1,'transaction_id'=>$last_id,'custData'=>$custData);
			}else {
 				$res = array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
 			}
 		}catch(Exception $e){
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		}
 		return $res; 
 	}

 	function updateWalletTxn($txnData = array()){
 		try{
 			if(empty($txnData)){
 				return;
 			}
 			if($txnData['status'] == '0'){
 				if(!isset($txnData['mode']) || empty($txnData['mode']) || 
 				   !isset($txnData['amount']) || empty($txnData['amount']) || 
 				   !isset($txnData['auth_token']) || empty($txnData['auth_token'])){
 					return;
 				}
 				$user_id = $this->auth_token_get($txnData['auth_token']);
 				if(empty($user_id)){
 					return;
 				}
 				$txnCode = 'TXN'.date('ymd').str_pad(rand(1111,9999),4,0,STR_PAD_LEFT);
				$insertData = array('customer_id'=>$user_id,'transaction_type'=>$txnData['mode'],
									'created_date'=>date('Y-m-d h:i:s'),'amount'=>$txnData['amount'],
									'transaction_code'=>$txnCode,'status'=>0);
				$this->db->insert('wallet_transactions',$insertData);
				return array('status'=>1,'transaction_id'=>$txnCode);
 			} else {
 				if(!isset($txnData['tnx_id']) || empty($txnData['tnx_id'])){
 					return;
 				}
 				$this->db->update('wallet_transactions',array('status'=>$txnData['status']),
 												        array('transaction_code'=>$txnData['tnx_id']));
 				if($txnData['status'] == 1){
 					$cond = array('transaction_code'=>$txnData['tnx_id'],'status'=>'1');
 					$lastTxn = $this->db->get_where('wallet_transactions',$cond)->row_array();
 					
 					$amount = $lastTxn['amount'];
 					$customer_id = $lastTxn['customer_id'];
 					$sql = "UPDATE wallet SET balance_amount=balance_amount+$amount
 							WHERE customer_id=$customer_id";
 					$this->db->query($sql);
 				}
 			}
 		}catch(Exception $e){}
 	}

 	function update_payment($response='',$transactionid='',$last_id,$status,$eventid = ''){
 		try{
 			if(empty($last_id)){
 				return;
 			}
 			$this->db->update('transaction',array('transaction_id'=>$transactionid,'status'=>$status,
			 				              	      'transaction_response'=>json_encode($response)),
 				              				array('id'=>$last_id));
 			$callback_url = '';
 			$transResp = $this->db->get_where('transaction',array('id'=>$last_id))->row_array();
 			if(!empty($transResp)){
 				$callback_url = $transResp['callback_url'];
 			}
 			if($status == 1){
	 			$trBook = $this->db->get_where('transaction',array('id'=>$last_id))->row_array();
	 			$book_id = $trBook['booking_id'];

				$sql = "SELECT TEVT.event_name, CONCAT(EDATE.date,' ',EDATE.time) AS show_time,
			            	   CUST.name, CUST.email, CUST.phone, EVT.approve_booking, PDR.fcm_token, 
			            	   EVT.provider_id, PDR.email AS prv_email
			            FROM booking AS BK 
			            INNER JOIN events AS EVT ON (EVT.event_id=BK.event_id)
			       	    INNER JOIN translator_event AS TEVT ON (TEVT.event_id=EVT.event_id)
			            INNER JOIN customer AS CUST ON (CUST.customer_id=BK.customer_id)
			            INNER JOIN event_date_time AS EDATE ON (EDATE.id=BK.event_date_id)
					    LEFT JOIN provider AS PDR ON (PDR.provider_id=EVT.provider_id)
			            WHERE BK.bookId='".$trBook['booking_id']."' AND EVT.status='1' AND 
			                  BK.status IN('3','6') AND EDATE.status='1' AND TEVT.language_code='EN'";
          		$bkData = $this->db->query($sql)->row_array();

          		$bokStatus = '1';
			    if(!empty($bkData)){
		    		$bokStatus  = (isset($bkData['approve_booking'])&&$bkData['approve_booking']=='1')?'6':'1';

				    $subject    = "Your Tickets - TimeOut";
				    $showTime   = date("d'S F Y - h:i, (l)",strtotime($bkData['show_time']));
				    $msgContent = "Hi, Your booking is confirmed for the event '".$bkData['event_name'].
				    			  "' and show is on '".$showTime."'. Booking ID ".$trBook['booking_id'];
				    $message    = "<html><body><p>".$msgContent."</p></body></html>";

			        $template = getNotifTemplate();
		            if(isset($template['booking_mail']) && !empty($template['booking_mail'])){
		                $msgContent = str_replace(
				        				array('{:event_name}','{:booking_id}','{:time}'),
		    						    array($bkData['event_name'],$trBook['booking_id'],$showTime),
		    						    $template['booking_mail']);
		            }
				    $this->send_mail($subject,$bkData['email'],$message);

				    $message = "<html><body><p>
	    						Hi, New booking for the event ".$bkData['event_name']." is done by ".
	    						$bkData['name']." (".$bkData['email'].") and show is on '".$showTime.
	    						"'. Booking ID ".$post_data['bookId']."
		    					</p></body></html>";
					if(empty($bkData['provider_id']) || $bkData['provider_id'] == 1){
						$settings   = getSettings();
						$adminMail = $settings['admin_mail_id'];
						$this->send_mail("New Event Booking - TimeOut",$adminMail,$message);
					} else {
						$this->send_mail("New Event Booking - TimeOut",$bkData['prv_email'],$message);
					}

				    if(isset($template['booking_sms']) && !empty($template['booking_sms'])){
				        $msgContent = str_replace(array('{:event_name}','{:booking_id}','{:time}'),
		    						    		  array($bkData['event_name'],$trBook['booking_id'],$showTime),
	    						    			  $template['booking_sms']);
				    }
				    $this->sendSMS($bkData['phone'],$msgContent);

				    if($bokStatus == '6' && !empty($bkData['fcm_token'])){
				    	$userData = array('id'=>$book_id,
						  'title'=>'New Booking',
						  'param'=>'booking_id',
						  'message'=>'New Booking is There For Approval');
  						push_sent_cancel(2,$bkData['fcm_token'],$userData);
				    }
			    }
			    $evtInvite = $this->db->get_where('event_invites',array('book_id'=>$book_id))->result_array();
				if(!empty($evtInvite)){
			    	$msg = "Hi, You are invited for the event '".$bkData['event_name']."', and show is on '".
			    		   $showTime."'. Booking ID ".$post_data['bookId'].
			    		   ". Find the QR Code ".base_url('/'.$bkData['qrcode']);
				    foreach ($evtInvite AS $inviteData) {
				    	if(!empty($inviteData['phone'])){
				    		$this->sendSMS($inviteData['phone'],$msg);
				    	}
				    	if(!empty($inviteData['user_id'])){
				    		$usrData = $this->db->get_where('customer',
				    							  array('customer_id'=>$inviteData['user_id']))->row_array();
							$this->sendSMS($usrData['phone'],$msg);
				    	}
				    }
				}
          		$this->db->update('booking',array('status'=>$bokStatus),array('bookId'=>$book_id));
          		$this->db->update('event_invites',array('status'=>'1'),array('book_id'=>$book_id));
          		$this->db->update('promocode_used',array('status'=>'1'),array('booking_id'=>$book_id));
 			}
 			$res = array('status'=>1,'callback_url'=>$callback_url);
 		}catch(Exception $e){
 			$res = array('status'=>0,'callback_url'=>$callback_url);
 		}
 		return $res; 
 	}

 	function get_cms_data(){
 		$language = array();
 		try{
 			$cmsData = $this->db->get('translator_policies')->result_array();
 			if(!empty($cmsData)){
 				foreach ($cmsData AS $cms) {
 					$lang = $cms['language_code'];
 					$language['faq_'.$lang] = $cms['faq'];
 					$language['instruction_'.$lang] = $cms['instruction'];
 					$language['privacy_policy_'.$lang] = $cms['privacy_policy'];
 					$language['terms_and_conditions_'.$lang] = $cms['terms_and_conditions'];
 				}
 				$res = array('status'=>1,'data'=>$language);
 			}
 		}catch(Exception $e){
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		}
 		return $res; 
 	}

 	public function save_organizer($data){
 		try{
 			$data['phone'] = preg_replace('/\D/', '', $data['phone']);
	 		$userNameChk = $this->db->query("SELECT * FROM users 
 									     	 WHERE user_type='2' AND status!='2' AND 
 									     		   username='".$data['email_id']."'");
	 		if(!empty($userNameChk) && $userNameChk->num_rows() > 0){
	 			$res = array('status'=>0,'message'=>'Username Already Exist','code'=>'ER07');
	 			return $res;
	 		}

	 		$emailChk = $this->db->query("SELECT * FROM provider AS PRV 
	 									  INNER JOIN users AS USR ON (USR.id=PRV.provider_id)
									      WHERE USR.user_type='2' AND USR.status!='2' AND 
									      		PRV.email='".$data['email_id']."'");
	 		if(!empty($emailChk) && $emailChk->num_rows() > 0){
	 			$res = array('status'=>0,'message'=>'Email Id Already Exist','code'=>'ER08');
	 			return $res;
	 		}

	 		$phoneChk = $this->db->query("SELECT * FROM provider AS PRV 
	 									  INNER JOIN users AS USR ON (USR.id=PRV.provider_id)
										  WHERE USR.user_type='2' AND USR.status!='2' AND 
										  	    PRV.phone LIKE '%".$data['phone']."%'");
	 		if(!empty($phoneChk) && $phoneChk->num_rows() > 0){
	 			$res = array('status'=>0,'message'=>'Phone Number Already Exist','code'=>'ER09');
	 			return $res;
	 		}
 			
			$this->db->insert('users',array('username'=>$data['email_id'],'display_name'=>$data['name'],
							  'password'=>md5($data['password']),'user_type'=>'2','status'=>'0'));

 			$last_id = $this->db->insert_id();
 			if($this->db->insert('provider',array('provider_id'=>$last_id,'name'=>$data['name'],
 												  'email'=>$data['email_id'],'phone'=>$data['phone']))){
 				$res = array('status'=>1);	
 			}
 		}catch(Exception $e){
 			$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
 		}
 		return $res;
 	}

	public function reset_password($data){
		try{
			$cust = $this->db->query("SELECT CUST.customer_id FROM customer AS CUST
									INNER JOIN users AS USER ON (USER.id=CUST.customer_id)
									WHERE CUST.reset_key='".$data['reset_key']."' AND USER.status!='2'");
			if(!empty($cust)){
				$cust = $cust->row_array();
				if($this->db->update('users',array('password'=>md5($data['password'])),
											 array('id'=>$cust['customer_id']))){
					$this->db->update('customer',array('reset_key'=>''),
												 array('customer_id'=>$cust['customer_id']));
				    $res= array('status'=>1,'data'=>'Password Updated Successfully');
				}else{
				    $res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER24');
				}
			} else {
			    $res = array('status'=>0,'message'=>'Sorry, Reset Key Expired','code'=>'ER25');
			}
		}catch(Exception $e){
		  	$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
		}
		return $res;
	}

	public function verifyMail($data = ''){
		$settings   = getSettings();
		$redUrl     = $settings['web_base_url'];
		try{
			$cust = $this->db->query("SELECT CUST.customer_id,CUST.email,CUST.phone 
									  FROM customer AS CUST
									  INNER JOIN users AS USER ON (USER.id=CUST.customer_id)
									  WHERE CUST.confirm_link='".$data['unique_id']."' AND USER.status!='2'");

			if(!empty($cust) && !empty($cust = $cust->row_array())){
				$email    = $cust['email'];
				$subject  = "New account created successfully";
				$message  = "Hi, Welcome to TimeOut. Please use username: ".$email.
				            " for access your account";

	 			if(isset($template['registration_mail']) && !empty($template['registration_mail'])){
	               $message=str_replace(array('{:email}'),array($email),$template['registration_mail']);
	            }
	            $this->send_mail($subject,$email,$message);

	 			if(isset($template['registration_sms']) && !empty($template['registration_sms'])){
	                $message=str_replace(array('{:email}'),array($email),$template['registration_sms']);
	            }
	            $this->sendSMS($cust['phone'],$message);

				if($this->db->update('customer',array('confirm_link'=>'','email_verified'=>'1'),
												array('customer_id'=>$cust['customer_id']))){
					header('Location:'.$redUrl.'location?login=1');
				}
			}
		}catch(Exception $e){}
		header('Location:'.$redUrl.'location');
	}

	public function checkSeatAvailability($data = ''){
		try{
 			$date   	 = $data['date'];
 			$time  	 	 = $data['time'];
 			$user_id 	 = $this->auth_token_get($data['auth_token']);
 			$event_id 	 = $data['event_id'];
	    	$lyCapacity  = array();

	    	$capacity = $usrBooked = $maxBooking = 0;
 			$sql = "SELECT EDATE.date,EDATE.time,EVT.custom_seat_layout,EVT.seat_pricing,
 			               EVT.max_booking,VEN.layout_details,HST.show_layout 
				    FROM events AS EVT 
				    INNER JOIN venue AS VEN ON (VEN.id=EVT.venue_id) 
				    INNER JOIN event_date_time AS EDATE ON (EVT.event_id=EDATE.event_id) 
				    INNER JOIN host_categories AS HST ON (VEN.host_cat_id=HST.host_cat_id) 
				    WHERE EVT.event_id='$event_id' AND EDATE.date='$date' AND EDATE.time='$time' AND 
				    	  EDATE.status='1' AND EDATE.date >= DATE_FORMAT(NOW(),'%Y-%m-%d')";
		    $evtSql = $this->db->query($sql);

		    if(empty($evtSql) || empty($evtData = $evtSql->row_array())){
		    	return array('status'=>0,'message'=>'No Record Found','code'=>'ER25');
		    }

		    if($evtData['date'].' '.$evtData['time'] < date("Y-m-d H:i", strtotime('+15 minutes'))){
				return array('status'=>0,'message'=>'Booking Closed','code'=>'ER26');
			}

 			if(!empty($user_id)){
				$sql = "SELECT SUM(BOK.no_of_ticket) AS bookCount
						FROM booking AS BOK
						INNER JOIN event_date_time AS EDATE ON (BOK.event_date_id=EDATE.id)
						WHERE BOK.event_id='$event_id' AND BOK.customer_id='$user_id' AND 
						      EDATE.date='$date' AND EDATE.time='$time' AND EDATE.status='1' AND 
						      BOK.status IN (1,2)";

				$result = $this->db->query($sql)->row_array();
				$usrBooked = (!empty($result))?$result['bookCount']:0;
			}

		    $maxBooking = $evtData['max_booking']-$usrBooked;
		    if($evtData['show_layout'] == 0){
		    	$lyout = json_decode($evtData['seat_pricing'],true);
		    	$capacity = $lyout['capacity'];
		    } else {
		    	$lyout = (!empty($evtData['custom_seat_layout']))
						 ?json_decode($evtData['custom_seat_layout'],true)
						 :json_decode($evtData['layout_details'],true);

	 			foreach($lyout AS $custLy) {
	 				$lyCapacity[$custLy['color']] = $custLy['capacity'];
	 			}
		    }

			$sql = "SELECT BOOK.no_of_ticket,BOOK.ticket_details
				    FROM booking AS BOOK 
				    INNER JOIN event_date_time AS EDATE ON (BOOK.event_date_id=EDATE.id) 
				    WHERE EDATE.status='1' AND BOOK.event_id='$event_id' AND EDATE.date='$date' AND 
				    	  EDATE.time='$time'";

		    if(!empty($result = $this->db->query($sql)->result_array())){
		    	foreach($result AS $value) {
			    	if($evtData['show_layout'] == 0){
			    		$capacity = $capacity-$value['no_of_ticket'];
			    	} else {
			    		$tkDtls = json_decode($value['ticket_details'],true);
			    		$aval = $lyCapacity[$tkDtls['color']];
			    		$aval = ($tkDtls['no_ticket']>$aval)?0:$aval-$tkDtls['no_ticket'];
			    		$lyCapacity[$tkDtls['color']] = $aval;
			    	}
		    	}
		    }

		    if($evtData['show_layout'] == 0){
		    	$capacity = ($capacity < $maxBooking)?$capacity:$maxBooking;
	    	} else {
	    		foreach($lyCapacity AS $block => $avail) {
	    			$lyCapacity[$block] = ($avail < $maxBooking)?$avail:$maxBooking;
	    		}
	    	}
	    	$res = array('status'=>1,'data'=>array('capacity'=>$capacity,'lyCapacity'=>$lyCapacity,
							    				   'show_layout'=>$evtData['show_layout']));
		} catch(Exception $e) {
		  	$res = array('status'=>0,'message'=>'Ohh No!! Something went South!!','code'=>'ER06');
	  	}
  		return $res;
	}

	function sendSMS($phone_no, $message) {
		$phone_no = trim($phone_no);
		$phone_no = trim($phone_no,'+');
		if(empty($phone_no) && count($phone_no) < 10 && empty($message)){
			return;
		}

		$user     = "Timeoutksa";
		$senderid = "Timeout";
		$password = "24617804";
		$url      = "http://www.smscountry.com/SMSCwebservice_Bulk.aspx";
		$message  = urlencode($message);

		if($ch = curl_init()){
			$ret = curl_setopt ($ch, CURLOPT_URL, $url);
				   curl_setopt ($ch, CURLOPT_POST, 1);
				   curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
				   curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 2);
				   curl_setopt ($ch, CURLOPT_POSTFIELDS, "User=$user&passwd=$password&mobilenumber=$phone_no&message=$message&sid=$senderid&mtype=N&DR=Y");
			$ret = curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
			$curlresponse = curl_exec ($ch);		
		}	
	}

	public function validate_promo_code($data =array()){
		$user_id = $this->auth_token_get($data['auth_token']);
		if($user_id > 0){
			$date = date('Y-m-d');
			$tot_cost  = $data['tot_cost'];
			$promoCode = $data['promo_code'];
			$promoData = $this->db->query("SELECT PROM.* FROM promocode_management AS PROM 
										   WHERE PROM.promocode_name='$promoCode' AND PROM.status='1' AND 
										  	     PROM.start_date<='$date' AND PROM.end_date>='$date' AND 
										         PROM.use_limit>(SELECT count(id) FROM promocode_used AS PU 
										         				 WHERE PU.promocode_id=PROM.promocode_id AND 
										         				       PU.status=1)");
			if(empty($promoData) || empty($promoData = $promoData->row_array())){
				$respArr['code'] = 980;
				$respArr['status'] = 0;
				$respArr['message'] = 'Promocode Invalid or Expired';
				return $respArr;
			}
			if(!empty($promoData['event_id']) && $promoData['event_id'] != $data['event_id']){
				$respArr['code'] = 981;
				$respArr['status'] = 2;
				$respArr['message'] = 'Promocode is not valid for this Event';
				return $respArr;
			}
			if(!empty($promoData['category_id']) || !empty($promoData['city_id'])){
				$sql = "SELECT VEN.region_id,EVT.category_id FROM events AS EVT 
					    INNER JOIN venue AS VEN ON (VEN.id = EVT.venue_id) 
					    WHERE EVT.event_id='".$data['event_id']."' AND EVT.status=1";
				$eventData = $this->db->query($sql)->row_array();

				if(empty($eventData)){
					$respArr['code'] = 982;
					$respArr['status'] = 0;
					$respArr['message'] = 'Invalid Event ID or wrong Data';
					return $respArr;
				}
				if(!empty($promoData['category_id']) && $promoData['category_id']!=$eventData['category_id']){
					$respArr['code'] = 983;
					$respArr['status'] = 3;
					$respArr['message'] = 'Promocode is not valid for this Category';
					return $respArr;	
				}
				if(!empty($promoData['city_id']) && $promoData['city_id']!=$eventData['region_id']){
					$respArr['code'] = 984;
					$respArr['status'] = 4;
					$respArr['message'] = 'Promocode is not valid for the selected region';
					return $respArr;	
				}
			}
			if(!empty($promoData['min_order_amount']) && $promoData['min_order_amount'] > $tot_cost){
				$respArr['code'] = 985;
				$respArr['status'] = 5;
				$respArr['message'] = 'Minimum amount is not satisfied';
				$respArr['data'] = array('message'=>'Minimum amount is not satisfied',
									     'minimum_amount'=>$promoData['min_order_amount']);
				return $respArr;	
			}

			$discAmt = 0;
			if($promoData['discount_type'] == 1){
				$discAmt = ($tot_cost * $promoData['discount_percentage'])/100;
			} else {
				$discAmt = ($tot_cost<=$promoData['discount_percentage'])?$tot_cost:$promoData['discount_percentage'];
			}
			$discAmt = (!empty($maxReedem=$promoData['max_redeem'])&&$maxReedem<$discAmt)?$maxReedem:$discAmt;
			$tot_cost = $tot_cost-$discAmt;
			$tot_cost = ($tot_cost <= 0)?0:$tot_cost;

			$datas['discount'] = $data['tot_cost']-$tot_cost;
			$datas['promocode_id'] = $promoData['promocode_id'];
			$datas['discounted_price'] = $tot_cost;
			$promDetails = langTranslator($promoData['promocode_id'],'PROMO');

			$datas = array_merge($datas,$promDetails);
			$respArr['status'] = 1;
			$respArr['message'] = 'Success';
			$respArr['data'] = $datas;
			return $respArr;
		}else{
			return array('status'=>0,'message'=>'Invalid user','code'=>'ER19');
		}
	}

	public function hotelBooking($txnData = array()){
		try{
 			if(empty($txnData)){
 				return;
 			}
 			if($txnData['status'] == '0'){
 				if(!isset($txnData['mode']) || empty($txnData['mode']) || 
 				   !isset($txnData['amount']) || empty($txnData['amount']) || 
 				   !isset($txnData['auth_token']) || empty($txnData['auth_token']) || 
 				   !isset($txnData['bookData']) || empty($bookData = $txnData['bookData'])){
 					return;
 				}
 				$user_id = $this->auth_token_get($txnData['auth_token']);
 				if(empty($user_id)){
 					return;
 				}
 				$bookId = 'HTL'.date('ymd').str_pad(rand(1111,9999),4,0,STR_PAD_LEFT);
 				$qrcode = genQRcode($bookId);
 				$trvlerDtls = array("roomDetails"=>array("room"=>$bookData['rooms'],"adult"=>$bookData['adult'],"children"=>$bookData['child']),"checkin"=>$bookData['checkin'],"checkout"=>$bookData['checkout'],"hotel_address"=>$bookData['hotelAddress']);

				$insert = array('hotel_book_id'=>$bookId,'customer_id'=>$user_id,'hotel_name'=>
								$bookData['hotelName'],'hotel_image'=>$bookData['hotelImage'],'checkin'=>
								$bookData['checkin'],'checkout'=>$bookData['checkout'],'price'=>
								$bookData['amount'],'request_data'=>json_encode($bookData['requestData']),'traveller_details'=>json_encode($trvlerDtls),
								'qrcode'=>$qrcode);
				$this->db->insert('hotel_booking',$insert);
				$this->db->insert('orders',array('booking_id'=>$bookId,'order_type'=>'2','created_date'=>date('Y-m-d h:i:s'),'customer_id'=>$user_id));
				return array('status'=>1,'transaction_id'=>$bookId);
 			} else if($txnData['status'] == '1' && isset($txnData['tnx_id']) && 
 				      !empty($txnData['tnx_id'])){
 				$bookedHotelData = $this->db->get_where('hotel_booking',array('hotel_book_id'=>$txnData['tnx_id']))->row_array();
				if(!empty($bookedHotelData) && !empty($bookedHotelData['request_data'])){
					$hotelData = json_decode($bookedHotelData['request_data'])->getBookingDetails;
					$result = $this->bookHotel($hotelData);
					$this->db->update('hotel_booking',array('booking_response'=>json_encode($result),'status'=>'1'),array('hotel_book_id'=>$txnData['tnx_id']));
					return array('status'=>1);
				} 				
 			} else if($txnData['status'] == '2' && isset($txnData['tnx_id']) && !empty($txnData['tnx_id'])){
				$this->db->update('hotel_booking',array('status'=>'5'),array('hotel_book_id'=>$txnData['tnx_id']));
				return array('status'=>1);	
 			}
 		}catch(Exception $e){
 			return array('status'=>0,'message'=>'Ohh No!! Something Went South!!','code'=>'ER19');
 		}
 	}

 	public function flightBooking($txnData = array()){
 		try{
 			if(empty($txnData)){
 				return;
 			}
 			if($txnData['status'] == '0'){
 				if(!isset($txnData['mode']) || empty($txnData['mode']) || 
 				   !isset($txnData['amount']) || empty($txnData['amount']) || 
 				   !isset($txnData['auth_token']) || empty($txnData['auth_token']) || 
 				   !isset($txnData['bookData']) || empty($bookData = $txnData['bookData'])){
 					return;
 				}
 				$user_id = $this->auth_token_get($txnData['auth_token']);
 				if(empty($user_id)){
 					return;
 				}
 				$bookId = 'FBK'.date('ymd').str_pad(rand(1111,9999),4,0,STR_PAD_LEFT);
 				$qrcode = genQRcode($bookId);
				$insert = array('flight_book_id'=>$bookId,'customer_id'=>$user_id,'flight_name'=>
					$bookData['flightName'],'flight_image'=>$bookData['flightImage'],
					'departure_date'=>$bookData['departure_date'],'price'=>$bookData['amount'],
					'arrival_date'=>$bookData['arrival_date'],'request_data'=>json_encode($bookData['requestData']),'traveller_details'=>json_encode($bookData['requestData']['traveller_details']),'qrcode'=>$qrcode);
				$this->db->insert('flight_booking',$insert);
				$this->db->insert('orders',array('booking_id'=>$bookId,'order_type'=>'3','created_date'=>date('Y-m-d h:i:s'),'customer_id'=>$user_id));
				return array('status'=>1,'transaction_id'=>$bookId);
 			} else if($txnData['status'] == '1' && isset($txnData['tnx_id']) && 
 				      !empty($txnData['tnx_id'])){
 				$bookedFlightData = $this->db->get_where('flight_booking',array('flight_book_id'=>$txnData['tnx_id']))->row_array();
				if(!empty($bookedFlightData) && !empty($bookedFlightData['request_data'])){
					$flightData = json_decode($bookedFlightData['request_data'])->flightRequestDetails;
					$result = $this->bookFlight($flightData);
					$this->db->update('flight_booking',array('booking_response'=>json_encode($result),'status'=>'1'),array('flight_book_id'=>$txnData['tnx_id']));
					return array('status'=>1);
				} 				
 			} else if($txnData['status'] == '2' && isset($txnData['tnx_id']) && !empty($txnData['tnx_id'])){
				$this->db->update('flight_booking',array('status'=>'5'),array('flight_book_id'=>$txnData['tnx_id']));
				return array('status'=>1);
 			}
 		}catch(Exception $e){
 			return array('status'=>0,'message'=>'Ohh No!! Something Went South!!','code'=>'ER19');
 		}
 	}

 	public function bookHotel($data = ''){
 		$settings = getSettings();
		$url = "https://trawex.biz/api/hotel_trawexv5/hotel_book";
		$postData = array(
						"user_id"=>$settings['trawex_user_id'],
						"user_password"=>$settings['trawex_user_password'],
						"access"=>$settings['trawex_access'],
						"ip_address"=>$settings['trawex_ip_address'],
						"TraceId"=>$data->TraceId,"propertyid"=>$data->propertyid,
						"trackingId"=>$data->trackingId,"sessionId"=>$data->sessionId,
						"productId"=>$data->productId,"TokenId"=>$data->TokenId,
						"resultindex"=>$data->resultindex,"hotelcode"=>$data->hotelcode,
						"changedOccupancy"=>$data->changedOccupancy,
						"extrabeds"=>$data->extrabeds,
						"guests_details"=>$data->guests_details,"refcode"=>$data->refcode,
						"prebookingtoken"=>$data->prebookingtoken
					);
		$result = passToJsonCurl($url,$postData);
	    if(!empty($result)){
	    	$result = json_decode($result,true);
	    	return $result;
	    }
	    return;
 	}

 	public function bookFlight($data = ''){
    	$settings = getSettings();
		$data->first_name = str_replace(" ","<br>",$data->first_name);
		$data->last_name = str_replace(" ","<br>",$data->last_name);
		$data->title = str_replace(" ","<br>",$data->title);
		$data->dob = str_replace(" ","<br>",$data->dob);
		$data->gender = str_replace(" ","<br>",$data->gender);
		$data->issue_country = str_replace(" ","<br>",$data->issue_country);
		$data->passport_expiry = str_replace(" ","<br>",$data->passport_expiry);
		$data->passport_no = str_replace(" ","<br>",$data->passport_no);
        $childMealplan = (isset($data->childMealplan) && !empty($data->childMealplan))?$data->childMealplan:'';
        $infantMealplan = (isset($data->infantMealplan) && !empty($data->infantMealplan))?$data->infantMealplan:'';
        $adultmealplan = (isset($data->adultmealplan) && !empty($data->adultmealplan))?$data->adultmealplan:'';
        $postCode = (isset($data->PostCode) && !empty($data->PostCode))?$data->PostCode:'';

		$url = "https://trawex.biz/api/flight_trawex/book?user_id=".$settings['trawex_user_id']."&user_password=".$settings['trawex_user_password']."&access=".$settings['trawex_access']."&ip_address=".$settings['trawex_ip_address']."&target=".$data->target."&session_id=".$data->session_id."&area_code=".$data->area_code."&country_code=".$data->country_code."&first_name=".$data->first_name."&last_name=".$data->last_name."&title=".$data->title."&email_id=".$data->email_id."&mobile_no=".$data->mobile_no."&dob=".$data->dob."&gender=".$data->gender."&issue_country=".$data->issue_country."&passport_expiry=".$data->passport_expiry."&passport_no=".$data->passport_no."&type=".$data->type."&IsPassportMandatory=".$data->IsPassportMandatory."&adult_flight=".$data->adult_flight."&child_flight=".$data->child_flight."&infant_flight=".$data->infant_flight."&frequentFlyrNum=".$data->frequentFlyrNum."&adultmealplan=".$adultmealplan."&child_dob=".$data->child_dob."&child_gender=".$data->child_gender."&child_title=".$data->child_title."&child_first_name=".$data->child_first_name."&child_last_name=".$data->child_last_name."&child_passport_expiry_date=".$data->child_passport_expiry_date."&child_passport_no=".$data->child_passport_no."&child_frequentFlyrNum=".$data->child_frequentFlyrNum."&childMealplan=".$childMealplan."&infant_dob=".$data->infant_dob."&infant_gender=".$data->infant_gender."&infant_first_name=".$data->infant_first_name."&infant_last_name=".$data->infant_last_name."&infant_title=".$data->infant_title."&infantMealplan=".$infantMealplan."&FareSourceCode=".$data->FareSourceCode."&PostCode=".$postCode."";
		$result = passToJsonCurl($url,'');
		if(!empty($result)){
			//$result = json_decode($result);
            $result = array('BookFlightResponse'=>array('BookFlightResult'=>array('Errors'=>'','Status'=>'CONFIRMED','Success'=> 'true','Target'=> 'Test','TktTimeLimit'=>'', 'UniqueID'=>'TR04632018')));
			return $result;
		}
    	return;
 	}
} 
?>