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

require_once __DIR__ . '/meta_whatsapp.php';

/**
 * PlatformWhatsApp — Capa A: Supraide le habla a los DUEÑOS de negocio.
 *
 * Las credenciales de plataforma (SUPRAIDE_PHONE_NUMBER_ID + SUPRAIDE_ACCESS_TOKEN)
 * viven en el .env — son del sistema, no de un tenant.
 *
 * Diferencia con Capa B (MetaWhatsApp): Capa B usa tokens cifrados en DB por
 * tenant; Capa A usa un único token de plataforma desde env.
 *
 * NOTA sobre ventana de 24h: los mensajes outbound (bienvenida, alertas) solo
 * funcionan si el dueño escribió al número de Supraide en las últimas 24h.
 * Para mensajes fuera de ventana se necesita una plantilla aprobada por Meta.
 * Mientras tanto, si falla con "outside window", se registra en error_log y
 * el flujo continúa sin lanzar excepción.
 */
class PlatformWhatsApp {

    /** true si el .env tiene las dos credenciales de plataforma configuradas. */
    public static function isConfigured(): bool {
        return (getenv('SUPRAIDE_PHONE_NUMBER_ID') ?: '') !== ''
            && (getenv('SUPRAIDE_ACCESS_TOKEN')    ?: '') !== '';
    }

    /** Phone Number ID de Supraide (el número de la plataforma, no de un tenant). */
    public static function phoneNumberId(): string {
        return getenv('SUPRAIDE_PHONE_NUMBER_ID') ?: '';
    }

    /**
     * Envía texto libre al teléfono indicado desde el número de Supraide.
     * Falla silenciosamente: loguea el error pero no lanza excepción.
     */
    public static function sendText(string $toPhone, string $message): array {
        if (!self::isConfigured()) {
            error_log('[PlatformWhatsApp] SUPRAIDE_PHONE_NUMBER_ID / SUPRAIDE_ACCESS_TOKEN no configurados — saltando envío.');
            return ['ok' => false, 'error' => 'not_configured'];
        }
        try {
            $result = MetaWhatsApp::sendText(
                self::phoneNumberId(),
                $toPhone,
                $message,
                getenv('SUPRAIDE_ACCESS_TOKEN')
            );
            if (!($result['ok'] ?? false)) {
                error_log('[PlatformWhatsApp::sendText] to=' . $toPhone . ' error=' . ($result['error'] ?? '?'));
            }
            return $result;
        } catch (Throwable $_e) {
            error_log('[PlatformWhatsApp::sendText] ' . $_e->getMessage());
            return ['ok' => false, 'error' => $_e->getMessage()];
        }
    }

    /**
     * Devuelve el teléfono del dueño (owner) de un tenant, o null si no está registrado.
     * Se guarda en users.phone durante el wizard o en ajustes.
     */
    public static function ownerPhone(PDO $db, int $tenantId): ?string {
        try {
            $stmt = $db->prepare(
                "SELECT u.phone FROM users u
                 WHERE u.tenant_id = :t AND u.role = 'owner'
                   AND u.phone IS NOT NULL AND u.phone != ''
                 LIMIT 1"
            );
            $stmt->execute([':t' => $tenantId]);
            return $stmt->fetchColumn() ?: null;
        } catch (Throwable $_e) {
            return null;
        }
    }

    // ── Mensajes de plataforma ────────────────────────────────────────────────

    /**
     * Bienvenida al completar el onboarding.
     * Se llama cuando onboarding_status cambia a 'live'.
     */
    public static function sendBienvenida(PDO $db, int $tenantId, string $negocioName): void {
        $phone = self::ownerPhone($db, $tenantId);
        if (!$phone) return;

        $msg = "¡Tu negocio *{$negocioName}* ya está en vivo con Vale AI!\n\n"
             . "Tus clientes ya pueden escribirte por WhatsApp y Vale los va a atender de forma automática.\n\n"
             . "Panel de control: valeai.app/inicio";

        self::sendText($phone, $msg);
    }

    /**
     * Notifica al dueño cuando conecta su número de WhatsApp en /admin/whatsapp.
     */
    public static function sendWaConectado(PDO $db, int $tenantId, string $negocioName): void {
        $phone = self::ownerPhone($db, $tenantId);
        if (!$phone) return;

        $msg = "WhatsApp conectado para *{$negocioName}*.\n\n"
             . "Vale ya puede recibir y responder mensajes de tus clientes de forma automática.";

        self::sendText($phone, $msg);
    }

    /**
     * Alerta cuando el token del número del negocio venció o es inválido.
     * Vale no puede responder hasta que se actualice el token.
     */
    public static function sendAlertaTokenVencido(PDO $db, int $tenantId, string $negocioName): void {
        $phone = self::ownerPhone($db, $tenantId);
        if (!$phone) return;

        // Throttle: no mandar más de una alerta por tenant cada 6 horas.
        try {
            $lastAlert = $db->prepare(
                "SELECT created_at FROM agent_logs
                 WHERE tenant_id = :t AND type = 'platform_token_alert'
                 ORDER BY id DESC LIMIT 1"
            );
            $lastAlert->execute([':t' => $tenantId]);
            $row = $lastAlert->fetchColumn();
            if ($row && (time() - strtotime($row)) < 21600) {
                return; // ya se mandó alerta en las últimas 6h
            }
        } catch (Throwable $_e) { /* continuar */ }

        $msg = "Alerta de *{$negocioName}*: el token de WhatsApp venció o es inválido.\n\n"
             . "Vale no puede responder mensajes de tus clientes hasta que lo actualices.\n"
             . "Actualizalo en: valeai.app/ajustes";

        $result = self::sendText($phone, $msg);

        // Registrar alerta enviada para el throttle
        try {
            $db->prepare(
                "INSERT INTO agent_logs (tenant_id, type, gemini_call, payload)
                 VALUES (:t, 'platform_token_alert', 0, :p)"
            )->execute([':t' => $tenantId, ':p' => json_encode(['ok' => $result['ok'] ?? false])]);
        } catch (Throwable $_e) { /* no crítico */ }
    }

    /**
     * Construye el mensaje de soporte (sin enviarlo).
     * Lo usa agent_meta.php para armar el texto antes de encolar el envío.
     */
    public static function buildSoporteReply(string $ownerName = ''): string {
        $saludo = $ownerName ? "¡Hola, {$ownerName}!" : '¡Hola!';
        return "{$saludo} Este es el canal de soporte de Supraide.\n\n"
             . "Para ayuda con tu cuenta de Vale, visitá: valeai.app/inicio\n"
             . "Para soporte técnico escribinos a: hola@valeai.app";
    }

    /**
     * Respuesta automática cuando un dueño escribe al número de Supraide.
     * Canal de soporte básico (Capa A incoming).
     */
    public static function sendSoporteReply(string $toPhone, string $ownerName = ''): void {
        self::sendText($toPhone, self::buildSoporteReply($ownerName));
    }
}
