<?php
/*error_reporting(E_ALL);
ini_set("display_errors", 1);*/
// Añadimos la librearía php de OpenPay
require (dirname(__FILE__) . '/../../../main/includes/librerias/openpay-php/Openpay.php');

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
    
require '../../../PHPMailer/src/Exception.php';
require '../../../PHPMailer/src/PHPMailer.php';
require '../../../PHPMailer/src/SMTP.php';

//Inicializamos variables
$_POST = json_decode(file_get_contents('php://input'), true);

// Variables del cliente
$nombre = $_POST['nombre'];
$apellidos = $_POST['apellidos'];
$nombre_cliente = $nombre. " ". $apellidos;
$telefono = $_POST['telefono'];
$email = $_POST['email'];
$domicilio = $_POST['domicilio'];
$curp = $_POST['curp'];
$cod_postal = $_POST['cod_postal'];
$fecha_nacimiento = $_POST['fecha_nacimiento'];
if($fecha_nacimiento == ""){
    $fecha_nacimiento = "1970-01-01";
}
$genero = $_POST['genero'];

// Datos del gimnasio
$sucursal = $_POST['sucursal'];
$centro = $_POST['centro'];
$db = $_POST['db'];

// Variables del plan
$paquete = $_POST['paquete'];
$concepto = $_POST['concepto'];
$nombre_concepto = $_POST['nombre_concepto'];
$precio_total = $_POST['total'];

// Datos del token
$token = $_POST['token_id'];
$deviceSessionId = $_POST['deviceSessionId'];

// Datos Openpay
$openpay_id = $_POST['openpay_id'];
$private_key = $_POST['private_key'];

// Fechas
date_default_timezone_set("America/Mexico_City");
$hoy = date('Y-m-d G:i:s', time());
$fecha_fin = getVencimiento($hoy,$concepto);

//Iniciamos conexión a la base de datos
include("../../../mysql_connection/mysql_data.php");

$server_data = new serverData;
$servername = $server_data -> getServerName();
$username = $server_data -> getUserName();
$password = $server_data -> getPassword();


$bd = "direct18_ProGymCloud";
$conn = new mysqli($servername,$username,$password, $bd);
    
$query="SELECT correo_gym as 'correoGym', activar_smtp, host_smtp, user_smtp, pass_smtp, encrypt_smtp, port_smtp, zona_horaria FROM redes_sociales_gym WHERE gimnasio_idGym = ?;";
$stmt = $conn->prepare($query);
$stmt->bind_param('i', $centro);
$stmt->execute();
$rs = $stmt->get_result();
$row = mysqli_fetch_array($rs, MYSQLI_ASSOC);
$correoGym = $row['correoGym'];
$zona = $row['zona_horaria'];
$activar_smtp = "0";
$query="SELECT NombreGimnasio as 'nombre'FROM gimnasios WHERE idGimnasio = ?;";
$stmt = $conn->prepare($query);
$stmt->bind_param('i', $centro);
$stmt->execute();
$rs = $stmt->get_result();
$row = mysqli_fetch_array($rs, MYSQLI_ASSOC);
$name = $row['nombre'];
$query="SELECT secure3d FROM info_openpay WHERE gimnasio_idGimnasio = ? AND sucursal_idSucursal = ?;";
$stmt = $conn->prepare($query);
$stmt->bind_param('ss', $centro,$sucursal);
$stmt->execute();
$rs = $stmt->get_result();
$row = mysqli_fetch_array($rs, MYSQLI_ASSOC);
$secure3d = $row['secure3d'];

if($activar_smtp === "1"){
    $host_smtp = $row['host_smtp'];
    $user_smtp = $row['user_smtp'];
    $pass_smtp = $row['pass_smtp'];
    $encrypt_smtp = $row['encrypt_smtp'];
    $port_smtp = $row['port_smtp'];
}
else if($activar_smtp === "0"){
    $host_smtp = "manager.progymcloud.com";
    $user_smtp = "notificaciones@progymcloud.com";
    $pass_smtp = "PGCloud1243.";
    $encrypt_smtp = "ssl";
    $port_smtp = "465";
}

$conn = new mysqli($servername,$username,$password, $db);

if(($secure3d == 1 || $secure3d == "1" ) && $precio_total > 20000){
    $cargo = crearCargo($openpay_id,$private_key,$nombre,$apellidos,$email,$token,$precio_total,$nombre_concepto,$deviceSessionId,$secure3d,$db);
    $data = array(
            "estado" => 201,
            "url" => $cargo['url']);
    guardarCargo($conn, $apellidos, $nombre, $nombre_cliente, $domicilio, $cod_postal, $telefono, $fecha_nacimiento, $email, $genero, $curp, $sucursal, $paquete, $servicio, $hoy, $fecha_fin, $precio_total, $concepto, $nombre_concepto, $correoGym, $name, $host_smtp, $user_smtp, $pass_smtp, $encrypt_smtp, $port_smtp, $cargo['cargo_id'], 2);
    echo json_encode($data);
}
else{
    $cargo = crearCargo($openpay_id,$private_key,$nombre,$apellidos,$email,$token,$precio_total,$nombre_concepto,$deviceSessionId,$secure3d,$db);
    guardarCargo($conn, $apellidos, $nombre, $nombre_cliente, $domicilio, $cod_postal, $telefono, $fecha_nacimiento, $email, $genero, $curp, $sucursal, $paquete, $servicio, $hoy, $fecha_fin, $precio_total, $concepto, $nombre_concepto, $correoGym, $name, $host_smtp, $user_smtp, $pass_smtp, $encrypt_smtp, $port_smtp, "", 1);
    echo json_encode(200);
    
}

function crearCargo ($openpay_id,$private_key,$nombre,$apellidos,$email,$token,$precio_total,$nombre_concepto,$deviceSessionId,$secure3d,$db){
    try {
    	// Agregamos las keys para las librerís de 
    	Openpay::setProductionMode(true);
    	$openpay = Openpay::getInstance($openpay_id, $private_key);
    
    	$customer = array(
    	     'name' => $nombre,
    	     'last_name' => $apellidos,
    	     'phone_number' => $telefono,
    	     'email' => $email);
        if(($secure3d == 0 || $secure3d == "0" ) || $precio_total <= 20000){
        	$chargeRequest = array(
        		'method' => 'card',
        		'source_id' => $token,
        		'amount' => $precio_total,
        		'description' => $nombre_concepto,		
        		'device_session_id' => $deviceSessionId,
        		'customer' => $customer);
        	
        	$charge = $openpay->charges->create($chargeRequest);
            return 200;
        }
        else if(($secure3d == 1 || $secure3d == "1" ) && $precio_total > 20000){
            $chargeRequest = array(
        		'method' => 'card',
        		'source_id' => $token,
        		'amount' => $precio_total,
        		'description' => $nombre_concepto,		
        		'device_session_id' => $deviceSessionId,
        		'customer' => $customer,
        		'redirect_url' => "https://test.progymcloud.com/clientes/main/openpay/validarPago.php?db=".$db."&dest=2&payment=0",
        		'use_3d_secure' => true);
        	$charge = $openpay->charges->create($chargeRequest);
        	return ["cargo_id"=>$charge->id, "url"=>$charge->payment_method->url];
        }
    
    } catch (OpenpayApiTransactionError $e) {
    	echo json_encode('ERROR on the transaction: ' . $e->getMessage() . 
    	      ' [error code: ' . $e->getErrorCode() . 
    	      ', error category: ' . $e->getCategory() . 
    	      ', HTTP code: '. $e->getHttpCode() . 
    	      ', request ID: ' . $e->getRequestId() . ']', 0) ;
    
    } catch (OpenpayApiRequestError $e) {
    	echo json_encode('ERROR on the request: ' . $e->getMessage(), 0);
    
    } catch (OpenpayApiConnectionError $e) {
    	echo json_encode('ERROR while connecting to the API: ' . $e->getMessage(), 0);
    
    } catch (OpenpayApiAuthError $e) {
    	echo json_encode('ERROR on the authentication: ' . $e->getMessage(), 0);
    	
    } catch (OpenpayApiError $e) {
    	echo json_encode('ERROR on the API: ' . $e->getMessage(), 0);
    	
    } catch (Exception $e) {
    	echo json_encode('Error on the script: ' . $e->getMessage(), 0);
    }
}

function guardarCargo($conn, $apellidos, $nombre, $nombre_cliente, $domicilio, $cod_postal, $telefono, $fecha_nacimiento, $email, $genero, $curp, $sucursal, $paquete, $servicio, $hoy, $fecha_fin, $precio_total, $concepto, $nombre_concepto, $correoGym, $name, $host_smtp, $user_smtp, $pass_smtp, $encrypt_smtp, $port_smtp, $cargo_id, $value){
        $password_correo = substr( md5(microtime()), 1, 8);
        $password_bd = password_hash($password_correo, PASSWORD_BCRYPT);
        
        $consultaCrearCliente = "INSERT INTO 
            socios (Apellidos,Nombre,Clasificacion,Direccion,CodigoPostal,TelefonoFijo,TelefonoCelular,FechaNacimiento,Email,Email2,TipoCliente,Empresa,Puesto,TelefonoOficina,Codigo,Sexo,TipoSangre,Emergencia,CelularEmergencia,TelefonoEmergencia,EstadoCivil,Publicidad,Activo,FechaIngreso,Descuento,Deudas,Observaciones,RFC,ReferidoPor,ARecordar,ARecibo,AMasivo,ACrono,sucursal_idSucursal,Contrasena,token_qr,RUT) 
            VALUES ('$apellidos','$nombre','','$domicilio','$cod_postal','','$telefono','$fecha_nacimiento','$email','','','','','','','$genero','O-','','','',0,'',1,'$hoy',0,0,'','',null,1,1,1,1,'$sucursal','$password_bd','','$curp')";
            
        //mysqli_query ($conn, $consultaCrearCliente);
        if (!mysqli_query($conn, $consultaCrearCliente)) {
            echo "Error: " . mysqli_error($conn);
        }
        $NoCliente = mysqli_insert_id($conn);
            
        $consultaSocioServicio = "INSERT INTO socio_servicio(idServicio,idSocio,idSocioTitular,FechaSolicitud,FechaInscripcion) 
        VALUES('$paquete','$NoCliente','$NoCliente',NOW(),NOW());";  
            
            
        mysqli_query ($conn, $consultaSocioServicio);
        $idSocioServicio = mysqli_insert_id($conn);
        
        if($value == 2 || $value == "2"){
            
            $consultaPagos = "INSERT INTO pagos(idSocio_servicio,Concepto,FechaPago,Importe,idUsuario,FechaInicio,FechaFin,idSucursal,Visible,Cancelado,Pago,Subtotal,CargoExtra) 
            VALUES('$idSocioServicio','$concepto','$hoy','$precio_total','2','$hoy','$fecha_fin','$sucursal','0','0','13','$precio_total','0');";
            
            mysqli_query ($conn, $consultaPagos);
            
            $idPago = mysqli_insert_id($conn);
            $consultaCargo = "INSERT INTO cargo_pago_openpay (id_cargo, id_pago) VALUES (?,?);";
            $stmt = $conn->prepare($consultaCargo);
            $stmt->bind_param('ss', $cargo_id,$idPago);
            $stmt->execute();
            
            setMail($email, $nombre_cliente, $servicio, $nombre_concepto, $fecha_fin, $precio_total, $name, $correoGym, $host_smtp, $user_smtp, $pass_smtp, $encrypt_smtp, $port_smtp);
        }
        else {
            $consultaPagos = "INSERT INTO pagos(idSocio_servicio,Concepto,FechaPago,Importe,idUsuario,FechaInicio,FechaFin,idSucursal,Visible,Cancelado,Pago,Subtotal,CargoExtra) 
            VALUES('$idSocioServicio','$concepto','$hoy','$precio_total','2','$hoy','$fecha_fin','$sucursal','1','0','13','$precio_total','0');";
            
            mysqli_query ($conn, $consultaPagos);
            
            setMail($email, $nombre_cliente, $servicio, $nombre_concepto, $fecha_fin, $precio_total, $name, $correoGym, $host_smtp, $user_smtp, $pass_smtp, $encrypt_smtp, $port_smtp);
        }
}

function setMail($email, $nombre_cliente, $servicio, $nombre_concepto, $fecha_fin, $precio_total, $gym, $correoGym, $host_smtp, $user_smtp, $pass_smtp, $encrypt_smtp, $port_smtp){
    $correo_mal = array();
    $correo_ok = array();
    $ext = array (
        "com",
        "net",
        "mx",
        "gob",
        "edu",
        "org",
        "com.mx",
        "org.mx",
        "net.mx",
        "edu.mx",
        "gob.mx",
        "es");
    $error = 0;
    $alerta = "";
    list($user, $domain) = explode('@', $email);
    $email_sanitizado = filter_var($email, FILTER_SANITIZE_EMAIL);
    // Check for invalid domain or incorrect format
    if (strlen($email) - strpos($email, '@') < 3 || strpos($domain, '.') === false || strlen(substr($domain, strpos($domain, '.') + 1)) < 2 ||
        in_array($domain, ['gmial.com', 'gmal.com', 'gemail.com', 'gmaill.com', 'gmai.com', 'gmaiil.com', 'gmali.com', 'gml.com', 'gmalil.com', 'gmiall.com', 'gnail.com', 'gnai.com', 'gnal.com', 'gmail.co',
                           'hormail.com','hotmial.com', 'hotmil.com', 'hotmal.com','hhotmail.com', 'hotmai.com', 'hotmial.com', 'hootmail.com', 'hotmil.com', 'hotmaill.com', 'hotamil.com', 'hotmial.com',
                           'yaho.com', 'yhaoo.com', 'yahho.com', 'yahho.com', 'yaoho.com', 'yahoi.com', 'yahop.com', 'yahio.com', 'yahhoo.com','yaoo.com', 'yhoo.com', 'yaooh.com', 'yooha.com',
                           'outloook.com', 'otulook.com', 'oulook.com', 'outloko.com', 'outlookk.com', 'oultook.com', 'outook.com', 'outlocom.com', 'outlok.com', 'outllok.com', 'otlook.com', 'outloo.com', 'outlot.es'])
        || !in_array(substr($domain, strpos($domain, '.') + 1), $ext)
    ) {
      $correo_mal[] = $email;
    }
    else if(!filter_var($email_sanitizado, FILTER_VALIDATE_EMAIL)){
        $correo_mal[] = $email;
    }
    else{
        $correo_ok[] = $email;
    }
    
    $from = $correoGym;
    $asunto = $gym." - Notificación de pago";
    $mensaje = "<div style='font-weight: normal;'>
            ¡Hola <strong>".$nombre_cliente."</strong>!<br>
            ¡Gracias por tu pago en los siguientes servicios! <br><br> 
            <table>
                <tr>
                    <td>
                        Plan:
                    </td>
                    <td>
                        <strong>".$servicio."</strong>
                    </td>
                </tr>
                <tr>
                    <td>
                        Concepto:
                    </td>
                    <td>
                        <strong>".$nombre_concepto."</strong>
                    </td>
                </tr>
                <tr>
                    <td>
                        Próximo Vencimiento:
                    </td>
                    <td>
                        <strong>".$fecha_fin."</strong>
                    </td>
                </tr>
                <tr>
                    <td>
                        Monto:
                    </td>
                    <td>
                        <strong>$".number_format($precio_total, 2, '.', ',')."</strong>
                    </td>
                </tr>
            </table><br><br> 
            ¡Saludos de ".$gym."!
        </div>";
    $err = sendMail($correo_ok,$from,$mensaje,$asunto,$gym,$host_smtp,$user_smtp,$pass_smtp,$encrypt_smtp,$port_smtp);
}

function sendMail($to,$from,$body,$subject,$from_name,$host_smtp,$user_smtp,$pass_smtp,$encrypt_smtp,$port_smtp){
    $mail = new PHPMailer(true);
    $result = array();
    
    try {
        $mail->isSMTP();
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = $encrypt_smtp;
        $mail->Host = $host_smtp;
        $mail->Port = $port_smtp;
        $mail->Username = $user_smtp;
        $mail->Password = $pass_smtp;
    
        //DESTINATARIOS
        $mail->ClearReplyTos();
        $mail->addReplyTo($from);
        $mail->setFrom($from, $from_name);
        //$mail->addBCC($to);               // DESTINATARIOS
        //$mail->addCC('cc@example.com');
        foreach($to as $dest){
            $mail->addBCC($dest);
            //$mail->addBCC("carlosaalonsoibarra@outlook.com");
        }
           
        // CONTENIDO
        $mail->isHTML(true); 
        $mail->Subject = $subject;
        $mail->CharSet = 'UTF-8';
        $mail->Body    = '<b>'.$body.'</b>';
        //$mail->AltBody = $body;
                
        if(!$mail->Send()){
            $error = 0;
            $result['error'] = $error;
            $result['errorMessage'] = $mail->ErrorInfo;
        }
        else{
            $error = 1; 
            $result['error'] = $error;
        }
    }catch (Exception $e) {
        $result['errorMessage'] = "phpMailer Error: {$mail->ErrorInfo}";
    }
    return $result;
}


function getVencimiento($Fecha,$d){
    
    if($d==0)
        $d1 = date('Y-m-d', strtotime("+0 months", strtotime($Fecha)));
    else if($d==1)
        $d1 = date('Y-m-d', strtotime("+6 days", strtotime($Fecha)));
    else if($d==2)
        $d1 = date('Y-m-d', strtotime("+13 days", strtotime($Fecha)));
    else if($d==3)
        $d1 = date('Y-m-d', strtotime("+1 months", strtotime($Fecha)));
    else if($d==4)
        $d1 = date('Y-m-d', strtotime("+2 months", strtotime($Fecha)));
    else if($d==5)
        $d1 = date('Y-m-d', strtotime("+3 months", strtotime($Fecha)));
    else if($d==6)
        $d1 = date('Y-m-d', strtotime("+4 months", strtotime($Fecha)));
    else if($d==7)
        $d1 = date('Y-m-d', strtotime("+6 months", strtotime($Fecha)));
    else if($d==8)
        $d1 = date('Y-m-d', strtotime("+1 years", strtotime($Fecha)));
    else if($d==9)
        $d1 = date('Y-m-d', strtotime("-0 days", strtotime($Fecha)));
    else if($d == 97)
        $d1 = date('Y-m-d');
    else if($d == 98)
        $d1 = date('Y-m-d', strtotime("+1 months", strtotime($Fecha)));
    else if($d == 96)
        $d1 = date('Y-m-t', strtotime($Fecha));
    return $d1;
}
?>
