<?php
if (count(get_included_files()) === 1) {
    http_response_code(403);
    exit('Forbidden');
}

/**
 * MetaWhatsApp — envía mensajes via Meta Cloud API (Graph API v25).
 *
 * El token de acceso NUNCA se lee del entorno aquí: el caller lo obtiene
 * desde tenant_whatsapp (cifrado en DB), lo descifra y lo pasa como parámetro.
 * Así el servicio no conoce secretos; solo habla HTTP.
 */
class MetaWhatsApp {
    private const API_BASE    = 'https://graph.facebook.com';
    private const API_VERSION = 'v25.0';

    /**
     * Envía un mensaje de texto libre (solo dentro de la ventana de 24h).
     *
     * @param string $phoneNumberId  ID del número de teléfono en Meta.
     * @param string $toWaId         WA ID del destinatario (solo dígitos).
     * @param string $body           Cuerpo del mensaje.
     * @param string $accessToken    Token desencriptado, obtenido por el caller desde DB.
     * @return array{ok:bool, message_id?:string, error?:string}
     */
    public static function sendText(
        string $phoneNumberId,
        string $toWaId,
        string $body,
        string $accessToken
    ): array {
        $to = preg_replace('/\D/', '', $toWaId);

        $payload = json_encode([
            'messaging_product' => 'whatsapp',
            'recipient_type'    => 'individual',
            'to'                => $to,
            'type'              => 'text',
            'text'              => ['preview_url' => false, 'body' => $body],
        ]);

        return self::post($phoneNumberId, $payload, $accessToken);
    }

    /**
     * Envía una plantilla aprobada (para mensajes fuera de la ventana de 24h).
     *
     * @param string $accessToken  Token desencriptado, obtenido por el caller desde DB.
     * @return array{ok:bool, message_id?:string, error?:string}
     */
    public static function sendTemplate(
        string $phoneNumberId,
        string $toWaId,
        string $name,
        string $languageCode,
        string $accessToken
    ): array {
        $to = preg_replace('/\D/', '', $toWaId);

        $payload = json_encode([
            'messaging_product' => 'whatsapp',
            'to'                => $to,
            'type'              => 'template',
            'template'          => [
                'name'     => $name,
                'language' => ['code' => $languageCode],
            ],
        ]);

        return self::post($phoneNumberId, $payload, $accessToken);
    }

    /**
     * Verifica la firma X-Hub-Signature-256 del webhook.
     * Usa META_APP_SECRET del .env. Si no está configurado, deja pasar con warning.
     */
    public static function validateSignature(string $rawBody): bool {
        $appSecret = getenv('META_APP_SECRET') ?: '';
        if ($appSecret === '') {
            error_log('MetaWhatsApp: META_APP_SECRET no configurado — saltando validación de firma.');
            return true;
        }
        $signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
        if ($signature === '') {
            return false;
        }
        $expected = 'sha256=' . hash_hmac('sha256', $rawBody, $appSecret);
        return hash_equals($expected, $signature);
    }

    private static function post(string $phoneNumberId, string $jsonPayload, string $token): array {
        if ($token === '') {
            error_log('MetaWhatsApp::post: token vacío, abortando envío.');
            return ['ok' => false, 'error' => 'token vacío'];
        }

        $url = self::API_BASE . '/' . self::API_VERSION . '/' . rawurlencode($phoneNumberId) . '/messages';

        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $jsonPayload,
            CURLOPT_TIMEOUT        => 20,
            CURLOPT_HTTPHEADER     => [
                'Authorization: Bearer ' . $token,
                'Content-Type: application/json',
            ],
        ]);
        $resp = curl_exec($ch);
        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $err  = curl_error($ch);

        if ($resp === false) {
            error_log("MetaWhatsApp cURL error: $err");
            return ['ok' => false, 'error' => 'cURL: ' . $err];
        }
        $data = json_decode($resp, true);
        if ($code >= 200 && $code < 300) {
            return ['ok' => true, 'message_id' => $data['messages'][0]['id'] ?? null];
        }
        $errMsg = $data['error']['message'] ?? ('HTTP ' . $code);
        error_log("MetaWhatsApp send error ($code): $errMsg — body: $resp");
        return ['ok' => false, 'error' => $errMsg];
    }
}
