<?php

if (!defined('ABSPATH')) {
    exit;
} // Exit if accessed directly

/**
 * gateway class
 */
class gama_sms
{

    public $smsnumber;
    public $smstext;
    public $myshorturl;  //variable shorturl usada por wordpress
    public $smstype;
	public $msgfrom;
	public $medio; // usado por SendMsg -> GamaConnect.  El medio por dondee se envia sms, whatsapp, etc
    protected $token;

    public function __construct()
    {
        global $wpgamasms_option;
		
		// Para que no genere error a la hora de instalar el plugin
		if(isset($wpgamasms_option['token'])){
            $this->token = $wpgamasms_option['token'];
		}else{
			$this->token = "";
		}

		if(isset($wpgamasms_option['smstype'])){
            $this->smstype = $wpgamasms_option['smstype'];
		}else{
			$this->smstype = "0";
		}
		
		// Este es el medio por donde se envia el mensaje puede ser sms, whatsasp, etc 
		if(isset($wpgamasms_option['medio'])){
            $this->medio = $wpgamasms_option['medio'];
		}else{
			$this->medio = "sms";
		}

        $this->myshorturl = "0";
		$this->msgfrom = "gamasms";

     }


    public function SendSMS($mute=false,$codeerr=false)
    {
		
		// valida smstext y smsnumber 
		if(!$this->sms_validate()){
			if($mute){
		         return;
	        }else{
				 if($codeerr){
				      $resp = "4"; // Credenciales no validas
			     }else{
				      $resp =  "Datos nulos o vacios.";
				 }
	             return $resp;
	        }		
			
		}
		
		// Si token es vacio no enviar mensaje
		if(empty($this->token)){
			if($mute){
		         return;
	        }else{
				 if($codeerr){
				      $resp = "17"; // Credenciales no validas
			     }else{
				      $resp =  "No se pudo enviar mensaje, TOKEN no configurado.";
				 }
	             return $resp;
	        }
		}
		
		// verificamos si el numero esta en la lista negra
		if($this->not_call()){
			if($mute){
		         return;
	        }else{
				 if($codeerr){
				      $resp = "10"; // Mensaje Rechazado
			     }else{
				      $resp =  "No se pudo enviar mensaje, Ver lista de numeros no permitidos.";
				 }
	             return $resp;
	        }			
		}
        $autorization = "Authorization: Bearer ".$this->token;
        $fields_string = "";
		$myfields_string = "";

        $numbers_array= preg_split("/[\s,]+/",$this->smsnumber,-1,PREG_SPLIT_NO_EMPTY);
        $numbers_array = array_keys(array_count_values($numbers_array));  // elimina numeros repetidos

        foreach($numbers_array as $key=>$value) { 
          $myfields_string .= $value.','; 
        }
        $myfields_string = rtrim($myfields_string,',');
        $smsnumber = $myfields_string;

        $url = 'https://api3.gamanet.pe/token/smssend'; 
        $fields = array(
                        'smsnumber'=>urlencode($smsnumber),
                        'smstext'=>urlencode($this->smstext),
                        'smstype'=>urlencode($this->smstype),
                        'shorturl'=>urlencode($this->myshorturl)
                );

       //Preparamos el string para hacer POST (formato querystring)
       foreach($fields as $key=>$value) { 
          $fields_string .= $key.'='.$value.'&'; 
       }
       $fields_string = rtrim($fields_string,'&');


       //abrimos la conexion
       $ch = curl_init();

       //configuramos la URL, numero de variables POST y los datos POST
       curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/x-www-form-urlencoded', $autorization));
       curl_setopt($ch,CURLOPT_URL,$url);
       curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //Descomentarlo si usa HTTPS
       curl_setopt($ch,CURLOPT_POST,count($fields));
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
       curl_setopt($ch,CURLOPT_TIMEOUT,6);
       curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

       //ejecutamos POST
	   if(!curl_errno($ch)){
		   $result = curl_exec($ch);
		   $array = json_decode($result,true);
		   $resp_message = $array["message"];
           if($resp_message == 0){
                $resp =  "Mensaje enviado!";
           }else{
                if($resp_message == 4 ){
                    $resp =  "No se pudo enviar mensaje, verifique los destinatarios.";
                }elseif($resp_message==5){
                         $resp =  "No se pudo enviar mensaje no hay saldo suficiente";						
				}elseif($resp_message==6){
                         $resp =  "No se pudo enviar mensaje, datos vacios o numero telefonico incorrecto";
				}else{
						 $resp =  "No se pudo enviar mensaje code:".$resp_message;	
				}
            }
			
			if($codeerr){
				$resp = $array["message"];
			}
			
	   }else{
		   	if($codeerr){
                $resp = "14"; // Mensaje no entregado
			}else{
                $resp =  "Error: No se pudo enviar mensaje. ";				
			}
	   }

       //cerramos la conexion
       curl_close($ch);
	   
	   if($mute){
		   return;
	   }else{
	       return $resp;
	   }

    }

    // Funcion que abarca todos los medios de envio. Envio de sms, whatsapp, etc
    public function SendMsg($mute=false,$codeerr=false)
    {
		
		// valida smstext y smsnumber 
		if(!$this->sms_validate()){
			if($mute){
		         return;
	        }else{
				 if($codeerr){
				      $resp = "4"; // Credenciales no validas
			     }else{
				      $resp =  "Datos nulos o vacios.";
				 }
	             return $resp;
	        }		
			
		}
		
		// Si token es vacio no enviar mensaje
		if(empty($this->token)){
			if($mute){
		         return;
	        }else{
				 if($codeerr){
				      $resp = "17"; // Credenciales no validas
			     }else{
				      $resp =  "No se pudo enviar mensaje, TOKEN no configurado.";
				 }
	             return $resp;
	        }
		}
		
		// verificamos si el numero esta en la lista negra
		if($this->not_call()){
			if($mute){
		         return;
	        }else{
				 if($codeerr){
				      $resp = "10"; // Mensaje Rechazado
			     }else{
				      $resp =  "No se pudo enviar mensaje, Ver lista de numeros no permitidos.";
				 }
	             return $resp;
	        }			
		}
		
		// verificamos el tamaño maximo del mensaje
		$text =  $this->smstext;
		$text_len = strlen($text);
		if($text_len > 800){
			$resp = "2"; // texto supera la cantidad soportada
			return $resp;
		}
	
		
        $autorization = "Authorization: Bearer ".$this->token;
        $fields_string = "";
		$myfields_string = "";

        $numbers_array= preg_split("/[\s,]+/",$this->smsnumber,-1,PREG_SPLIT_NO_EMPTY);
        $numbers_array = array_keys(array_count_values($numbers_array));  // elimina numeros repetidos

        foreach($numbers_array as $key=>$value) { 
          $myfields_string .= $value.','; 
        }
        $myfields_string = rtrim($myfields_string,',');
        $smsnumber = $myfields_string;

        if($this->medio == "whatsapp"){
            /*
			$url = 'https://whatsapi.gamanet.pe/whatsapp/token/msgsend'; 
			$fields = array(
							'msgnumber'=>urlencode($smsnumber),
							'msgtext'=>urlencode($this->smstext),
							'msgfrom'=>urlencode($this->msgfrom)
					);
			*/		
			$url = 'https://api3.gamanet.pe/token/smssend'; 
			$fields = array(
							'smsnumber'=>urlencode($smsnumber),
							'smstext'=>urlencode($this->smstext),
							'smstype'=>urlencode('3'),
							'shorturl'=>urlencode($this->myshorturl)
					);
					
		}else{ // medio: sms 

			$url = 'https://api3.gamanet.pe/token/smssend'; 
			$fields = array(
							'smsnumber'=>urlencode($smsnumber),
							'smstext'=>urlencode($this->smstext),
							'smstype'=>urlencode($this->smstype),
							'shorturl'=>urlencode($this->myshorturl)
					);
				
			
		}

       //Preparamos el string para hacer POST (formato querystring)
       foreach($fields as $key=>$value) { 
          $fields_string .= $key.'='.$value.'&'; 
       }
       $fields_string = rtrim($fields_string,'&');


       //abrimos la conexion
       $ch = curl_init();

       //configuramos la URL, numero de variables POST y los datos POST
       curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/x-www-form-urlencoded', $autorization));
       curl_setopt($ch,CURLOPT_URL,$url);
       curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //Descomentarlo si usa HTTPS
       curl_setopt($ch,CURLOPT_POST,count($fields));
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
       curl_setopt($ch,CURLOPT_TIMEOUT,6);
       curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

       //ejecutamos POST
	   if(!curl_errno($ch)){
		   $result = curl_exec($ch);
		   $array = json_decode($result,true);
		   $resp_description = $array["description"];
		   $resp_message = $array["message"];
		   $this->set_msg_details($resp_message,$resp_description);
           if($resp_message == 0){
                $resp =  "Mensaje enviado!";
           }else{
                if($resp_message == 4 ){
                    $resp =  "No se pudo enviar mensaje, verifique los destinatarios.";
                }elseif($resp_message==5){
                         $resp =  "No se pudo enviar mensaje no hay saldo suficiente";						
				}elseif(($resp_message==6)){
                         $resp =  "No se pudo enviar mensaje, datos vacios o numero telefonico incorrecto";
				}else{
						 $resp =  "No se pudo enviar mensaje code:".$resp_message;	
				}			   
            }
			
			
			if($codeerr){
				$resp = $array["message"];
			}
			
	   }else{
		   	$resp_description = "Error: No se pudo enviar mensaje. ";
		    $resp_message = "14";
		   	if($codeerr){
                $resp = $resp_message;
			}else{
                $resp = $resp_description;				
			}
			
		   $this->set_msg_details($resp_message,$resp_description);
	   }

       //cerramos la conexion
       curl_close($ch);
	   
	   if($mute){
		   return;
	   }else{
	       return $resp;
	   }

    }


    public function BalanceSMS()
    {

        $autorization = "Authorization: Bearer ".$this->token;
        $fields_string = "";

        $url = 'https://api3.gamanet.pe/token/smsbalance';
        $fields = array();

       //Preparamos el string para hacer POST (formato querystring)
       foreach($fields as $key=>$value) { 
          $fields_string .= $key.'='.$value.'&'; 
       }
       $fields_string = rtrim($fields_string,'&');


       //abrimos la conexion
       $ch = curl_init();

       //configuramos la URL, numero de variables POST y los datos POST
       curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/x-www-form-urlencoded', $autorization));
       curl_setopt($ch,CURLOPT_URL,$url);
       curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //Descomentarlo si usa HTTPS
       curl_setopt($ch,CURLOPT_POST,count($fields));
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
	   curl_setopt($ch,CURLOPT_TIMEOUT,6);
       curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

       //ejecutamos POST
       $result = curl_exec($ch);
	   
	   
       //ejecutamos POST
	   if(!curl_errno($ch)){
		   $result = curl_exec($ch);
		   $array = json_decode($result,true);
	   }else{
           $array =  null;
	   }

       //cerramos la conexion
       curl_close($ch);


       //print_r($array);
       return $array; 


     }
	 
	 // not call filtra los numeros a enviar
    public function not_call()
    {
		global $wpdb;
		$table = "{$wpdb->prefix}gamasms_not_call";
		$fields_string = "";
		
		$list_smsnumbers = explode(",",$this->smsnumber); 
		
		//var_dump($list_smsnumbers);
		
		if(count($list_smsnumbers)>0){
			 foreach($list_smsnumbers as $elem){
		                 $sql = "select * from $table where phone='$elem'";
                         $list_phones = $wpdb->get_results($sql,ARRAY_A);
                         if(empty($list_phones)){ 
                             $fields_string .= $elem.',';  
                         }else{
                             unset($list_phones);
						 }						 
            }
		}
		
        $fields_string = rtrim($fields_string,',');
        $sms_numbers = $fields_string;
        $this->smsnumber = $sms_numbers;
		
        if(empty($fields_string)){ 
            return true;
        }else{
			return false;
		}
		
	}
	
	 // registrar mensajes enviados en gamasms_msg_details
    public function set_msg_details($status,$description='')
    {
		global $wpdb;
		$table = "{$wpdb->prefix}gamasms_msg_details";
		
		$data = [
             'id' => null,
             'creationdate' => null,
             'msg_from' => $this->msgfrom,
             'msg_to' => $this->smsnumber,
             'msg_text' => $this->smstext,
             'status' => $status,
             'description' => $description,
             'medio' => $this->medio
          ];

        $result = $wpdb->insert($table,$data);
        if($result){
              return true; // se inserto registro
        }else{
              return false;  // no se pude insertar registro
        }
		
	}
	
	// validar datos
    public function sms_validate()
    {
		if(empty($this->smsnumber)){ 
            return false;
        }

		if(empty($this->smstext)){ 		
			return false;
		}
		
		return true;
		
	}
	
	// Consultamos por API los Nuevos Mensajes Recibidos
    public function GetAnswersMsg()
    {
		global $wpdb;
		$table = "{$wpdb->prefix}gamasms_msg_incoming";

        $autorization = "Authorization: Bearer ".$this->token;
        $fields_string = "";

        $url = 'https://api3.gamanet.pe/token/getanswers';
		$fields = array(
							'read'=>0 // solo las respuestas nuevas
		);

       //Preparamos el string para hacer POST (formato querystring)
       foreach($fields as $key=>$value) { 
          $fields_string .= $key.'='.$value.'&'; 
       }
       $fields_string = rtrim($fields_string,'&');


       //abrimos la conexion
       $ch = curl_init();

       //configuramos la URL, numero de variables POST y los datos POST
       curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: application/x-www-form-urlencoded', $autorization));
       curl_setopt($ch,CURLOPT_URL,$url);
       curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //Descomentarlo si usa HTTPS
       curl_setopt($ch,CURLOPT_POST,count($fields));
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
	   curl_setopt($ch,CURLOPT_TIMEOUT,6);
       curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

       //ejecutamos POST
       $result = curl_exec($ch);
	   
	   
       //ejecutamos POST
	   if(!curl_errno($ch)){
		   $result = curl_exec($ch);
		   $array = json_decode($result,true);
	   }else{
           $array =  null;
	   }

       //cerramos la conexion
       curl_close($ch);


       //print_r($array);
       return $array; 

     }
	

}