<?php
/**
 * Script centralizado para envío de mensajes de WhatsApp
 * Puede ser usado de dos formas:
 * 1. Llamada directa via POST/GET: WhatsApp/index.php?num=595...&mje=Hola
 * 2. Incluido como función: include 'WhatsApp/index.php'; enviarWhatsAppCentral($num, $mje);
 * 
 * API: whats-flow.com
 */

require_once __DIR__ . '/../includes/db.php';

/**
 * Función principal para enviar WhatsApp
 * @param string $telefono Número de destino (con código de país, ej: 595994850808)
 * @param string $mensaje Texto del mensaje
 * @param bool $incluir_pie Si agregar firma de la empresa al final
 * @return array ['success' => bool, 'message' => string, 'http_code' => int, 'response' => mixed]
 */
function enviarWhatsAppCentral($telefono, $mensaje, $incluir_pie = true) {
    try {
        $db = new Database();
        
        // Obtener configuración de WhatsApp desde la base de datos
        $config = $db->query("SELECT instance_id, api_token, sitio_web FROM configuracion LIMIT 1")->fetch(PDO::FETCH_ASSOC);
        
        // Validar que existan los datos de configuración
        if (empty($config['instance_id']) || empty($config['api_token'])) {
            return [
                'success' => false,
                'message' => 'Faltan datos de configuración de WhatsApp (instance_id o api_token) en la tabla configuracion',
                'http_code' => 0,
                'response' => null
            ];
        }
        
        // Limpiar número de teléfono - Solo números
        $tel = preg_replace('/[^0-9]/', '', $telefono);
        
        // Remover 0 del inicio si existe
        if (substr($tel, 0, 1) === '0') {
            $tel = substr($tel, 1);
        }
        
        // Validaciones del número
        if (strlen($tel) < 8) {
            return [
                'success' => false,
                'message' => "Número de teléfono muy corto: $telefono (procesado: $tel)",
                'http_code' => 0,
                'response' => null
            ];
        }
        
        if (strlen($tel) > 15) {
            return [
                'success' => false,
                'message' => "Número de teléfono muy largo: $telefono (procesado: $tel)",
                'http_code' => 0,
                'response' => null
            ];
        }
        
        // Construir mensaje completo con pie de firma si corresponde
        $mensaje_completo = $mensaje;
        if ($incluir_pie) {
            $nombre_empresa = $config['sitio_web'] ?? 'Nombre de Comercio';
            $mensaje_completo .= "\n\nAtentamente,\n*" . $nombre_empresa . "*";
        }
        
        // ================= ENVÍO WHATSAPP via whats-flow.com =================
        $url = "https://whats-flow.com/api/send/whatsapp";
        
        $payload = [
            'secret'    => $config['instance_id'],
            'account'   => $config['api_token'],
            'recipient' => $tel,
            'type'      => 'text',
            'message'   => $mensaje_completo
        ];
        
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => http_build_query($payload),
            CURLOPT_TIMEOUT        => 30
        ]);
        
        $response = curl_exec($ch);
        $curlError = curl_error($ch);
        $httpCode  = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        if ($curlError) {
            return [
                'success' => false,
                'message' => 'Error de cURL: ' . $curlError,
                'http_code' => $httpCode,
                'response' => null
            ];
        }
        
        // Considerar éxito si HTTP 200 o si la respuesta contiene indicadores de éxito
        $response_data = json_decode($response, true);
        $success = ($httpCode >= 200 && $httpCode < 300);
        
        return [
            'success' => $success,
            'message' => $success ? 'Mensaje de WhatsApp enviado correctamente' : 'Error al enviar mensaje',
            'http_code' => $httpCode,
            'response' => $response_data ?? $response,
            'numero_enviado' => $tel,
            'mensaje_enviado' => $mensaje_completo
        ];
        
    } catch (Exception $e) {
        return [
            'success' => false,
            'message' => 'Error: ' . $e->getMessage(),
            'http_code' => 0,
            'response' => null
        ];
    }
}

// ================= EJECUCIÓN DIRECTA (via GET/POST) =================
// Solo se ejecuta si se llama directamente (no cuando se incluye)
if (basename($_SERVER['SCRIPT_FILENAME']) === basename(__FILE__)) {
    
    header('Content-Type: application/json; charset=utf-8');
    
    // Obtener parámetros de autenticación
    $secret = $_REQUEST['secret'] ?? '';
    $account = $_REQUEST['account'] ?? '';
    
    // Validar credenciales primero (seguridad)
    if (empty($secret) || empty($account)) {
        http_response_code(401);
        echo json_encode([
            'success' => false,
            'error' => true,
            'message' => 'Acceso denegado. Se requieren credenciales de autenticación.',
            'parametros_requeridos' => 'secret, account, num, mje'
        ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    // Verificar credenciales contra la base de datos
    $db = new Database();
    $config = $db->query("SELECT instance_id, api_token FROM configuracion LIMIT 1")->fetch(PDO::FETCH_ASSOC);
    
    if (!$config || $secret !== $config['instance_id'] || $account !== $config['api_token']) {
        http_response_code(403);
        echo json_encode([
            'success' => false,
            'error' => true,
            'message' => 'Credenciales inválidas.'
        ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    // Obtener parámetros del mensaje
    $num = $_REQUEST['num'] ?? $_REQUEST['telefono'] ?? '';
    $mje = $_REQUEST['mje'] ?? $_REQUEST['mensaje'] ?? '';
    $incluir_pie = isset($_REQUEST['sin_pie']) ? false : true;
    
    // Validar parámetros requeridos
    if (empty($num) || empty($mje)) {
        http_response_code(400);
        echo json_encode([
            'success' => false,
            'error' => true,
            'message' => 'Parámetros requeridos: num (número de teléfono) y mje (mensaje)',
            'uso' => 'WhatsApp/index.php?secret=XXX&account=XXX&num=595994850808&mje=Hola',
            'parametros_opcionales' => 'sin_pie=1 (para no incluir firma de la empresa)'
        ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    // Enviar mensaje
    $resultado = enviarWhatsAppCentral($num, $mje, $incluir_pie);
    
    echo json_encode($resultado, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
