<?php
/**
 * ajax/enviar_relatorio_wa.php
 * Envia relatório completo da OS via WhatsApp API
 *
 * Suporta:
 *   - Z-API    (https://z-api.io)
 *   - Evolution API (self-hosted)
 *   - WPPConnect Server (self-hosted)
 *   - Callmebot (gratuito, sem imagens)
 *
 * Configuração via tabela `configuracoes`:
 *   wa_api_tipo       → "zapi" | "evolution" | "wppconnect" | "callmebot"
 *   wa_api_url        → URL base da instância (ex: https://api.z-api.io/instances/XXXXX)
 *   wa_api_token      → Token / Security Token
 *   wa_api_instance   → Nome da instância (Evolution/WPPConnect)
 */

require_once __DIR__ . '/../auth.php';
require_once __DIR__ . '/../functions.php';
requireLogin();

header('Content-Type: application/json; charset=utf-8');

// ── Lê configurações ──────────────────────────────────────────────
$apiTipo     = getConfig('wa_api_tipo',     '');
$apiUrl      = rtrim(getConfig('wa_api_url', ''), '/');
$apiToken    = getConfig('wa_api_token',    '');
$apiInstance = getConfig('wa_api_instance', '');

if (!$apiTipo || !$apiUrl || !$apiToken) {
    echo json_encode(['ok' => false, 'erro' => 'API do WhatsApp não configurada. Vá em Configurações → WhatsApp API.']);
    exit;
}

// ── Lê payload do POST ────────────────────────────────────────────
$input    = json_decode(file_get_contents('php://input'), true) ?? [];
$telefone = preg_replace('/\D/', '', $input['telefone'] ?? '');
$mensagem = trim($input['mensagem'] ?? '');
$fotos    = $input['fotos'] ?? [];   // array de caminhos relativos

if (!$telefone || strlen($telefone) < 10) {
    echo json_encode(['ok' => false, 'erro' => 'Telefone inválido.']);
    exit;
}
if (!$mensagem) {
    echo json_encode(['ok' => false, 'erro' => 'Mensagem vazia.']);
    exit;
}

// Adiciona DDI 55 se não tiver
if (!str_starts_with($telefone, '55')) $telefone = '55' . $telefone;

// ── Funções de envio por API ──────────────────────────────────────

/**
 * Faz requisição HTTP via curl com timeout
 */
function apiPost(string $url, array $headers, string $body): array {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $body,
        CURLOPT_HTTPHEADER     => $headers,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_SSL_VERIFYPEER => false,
    ]);
    $resp   = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $err    = curl_error($ch);
    curl_close($ch);

    if ($err) return ['ok' => false, 'erro' => "cURL: $err"];
    $data = json_decode($resp, true);
    return ['ok' => ($status >= 200 && $status < 300), 'status' => $status, 'data' => $data, 'raw' => $resp];
}

/**
 * Converte arquivo local em base64 data URI
 */
function fileToBase64(string $path): ?string {
    $full = __DIR__ . '/../' . ltrim($path, '/');
    if (!file_exists($full)) return null;
    $ext  = strtolower(pathinfo($full, PATHINFO_EXTENSION));
    $mime = match($ext) { 'png'=>'image/png','webp'=>'image/webp','gif'=>'image/gif',default=>'image/jpeg' };
    return 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($full));
}

/**
 * Retorna URL pública da imagem
 */
function fileToUrl(string $path): string {
    $proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') ? 'https' : 'http';
    $host  = $_SERVER['HTTP_HOST'] ?? 'localhost';
    return $proto . '://' . $host . '/' . ltrim($path, '/');
}

// ── Implementações por API ────────────────────────────────────────
$resultados = [];
$erros      = [];

// ─── Z-API ───────────────────────────────────────────────────────
if ($apiTipo === 'zapi') {
    $headers = [
        'Content-Type: application/json',
        'Client-Token: ' . $apiToken,
    ];

    // 1. Envia texto
    $r = apiPost(
        $apiUrl . '/send-text',
        $headers,
        json_encode(['phone' => $telefone, 'message' => $mensagem])
    );
    $resultados[] = ['tipo' => 'texto', 'ok' => $r['ok'], 'resp' => $r['raw']];
    if (!$r['ok']) $erros[] = 'Erro ao enviar texto: ' . ($r['erro'] ?? $r['raw']);

    // 2. Envia cada imagem
    foreach ($fotos as $idx => $path) {
        $b64 = fileToBase64($path);
        if (!$b64) { $erros[] = "Foto #{$idx}: arquivo não encontrado"; continue; }

        $caption = match(true) {
            str_contains($path, 'fachada') || str_contains($path, 'instalacao') => '🏠 Fachada da residência',
            str_contains($path, 'olt')     => '📡 Foto da OLT/CTO',
            default                        => '📸 Foto do serviço (' . ($idx + 1) . ')',
        };

        $r = apiPost(
            $apiUrl . '/send-image',
            $headers,
            json_encode([
                'phone'   => $telefone,
                'image'   => $b64,
                'caption' => $caption,
            ])
        );
        $resultados[] = ['tipo' => "foto_{$idx}", 'ok' => $r['ok'], 'resp' => $r['raw']];
        if (!$r['ok']) $erros[] = "Erro ao enviar foto #{$idx}: " . ($r['erro'] ?? $r['raw']);

        usleep(800000); // 0.8s entre imagens para não bloquear
    }
}

// ─── Evolution API ────────────────────────────────────────────────
elseif ($apiTipo === 'evolution') {
    $headers = [
        'Content-Type: application/json',
        'apikey: ' . $apiToken,
    ];

    // 1. Texto
    $r = apiPost(
        $apiUrl . '/message/sendText/' . $apiInstance,
        $headers,
        json_encode([
            'number'  => $telefone,
            'options' => ['delay' => 1200, 'presence' => 'composing'],
            'textMessage' => ['text' => $mensagem],
        ])
    );
    $resultados[] = ['tipo' => 'texto', 'ok' => $r['ok'], 'resp' => $r['raw']];
    if (!$r['ok']) $erros[] = 'Erro ao enviar texto: ' . ($r['raw'] ?? $r['erro']);

    // 2. Imagens
    foreach ($fotos as $idx => $path) {
        $url64 = fileToBase64($path);
        if (!$url64) { $erros[] = "Foto #{$idx}: não encontrada"; continue; }

        $caption = match(true) {
            str_contains($path, 'fachada') || str_contains($path, 'instalacao') => '🏠 Fachada',
            str_contains($path, 'olt') => '📡 OLT/CTO',
            default => '📸 Foto ' . ($idx + 1),
        };

        $r = apiPost(
            $apiUrl . '/message/sendMedia/' . $apiInstance,
            $headers,
            json_encode([
                'number'  => $telefone,
                'options' => ['delay' => 1000, 'presence' => 'composing'],
                'mediaMessage' => [
                    'mediatype' => 'image',
                    'caption'   => $caption,
                    'media'     => $url64,
                ],
            ])
        );
        $resultados[] = ['tipo' => "foto_{$idx}", 'ok' => $r['ok'], 'resp' => $r['raw']];
        if (!$r['ok']) $erros[] = "Foto #{$idx}: " . ($r['raw'] ?? '');

        usleep(1000000);
    }
}

// ─── WPPConnect ───────────────────────────────────────────────────
elseif ($apiTipo === 'wppconnect') {
    $headers = [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $apiToken,
    ];

    // 1. Texto
    $r = apiPost(
        $apiUrl . '/api/' . $apiInstance . '/send-message',
        $headers,
        json_encode(['phone' => $telefone, 'message' => $mensagem, 'isGroup' => false])
    );
    $resultados[] = ['tipo' => 'texto', 'ok' => $r['ok'], 'resp' => $r['raw']];
    if (!$r['ok']) $erros[] = 'Texto: ' . ($r['raw'] ?? $r['erro']);

    // 2. Imagens
    foreach ($fotos as $idx => $path) {
        $b64 = fileToBase64($path);
        if (!$b64) { $erros[] = "Foto #{$idx}: não encontrada"; continue; }

        $r = apiPost(
            $apiUrl . '/api/' . $apiInstance . '/send-image',
            $headers,
            json_encode([
                'phone'    => $telefone,
                'base64'   => $b64,
                'filename' => basename($path),
                'caption'  => '📸 ' . basename($path),
            ])
        );
        $resultados[] = ['tipo' => "foto_{$idx}", 'ok' => $r['ok'], 'resp' => $r['raw']];
        if (!$r['ok']) $erros[] = "Foto #{$idx}: " . ($r['raw'] ?? '');
        usleep(800000);
    }
}

// ─── Callmebot (gratuito, só texto) ──────────────────────────────
elseif ($apiTipo === 'callmebot') {
    $url = "https://api.callmebot.com/whatsapp.php?" . http_build_query([
        'phone'  => $telefone,
        'text'   => $mensagem,
        'apikey' => $apiToken,
    ]);
    $ctx  = stream_context_create(['http' => ['timeout' => 15, 'ignore_errors' => true]]);
    $resp = @file_get_contents($url, false, $ctx);
    $ok   = $resp && str_contains(strtolower($resp), 'message queued');
    $resultados[] = ['tipo' => 'texto', 'ok' => $ok, 'resp' => $resp];
    if (!$ok) $erros[] = 'Callmebot: ' . ($resp ?: 'sem resposta');
    if ($fotos) $erros[] = 'Callmebot não suporta envio de imagens.';
}

else {
    echo json_encode(['ok' => false, 'erro' => "API '{$apiTipo}' não reconhecida."]);
    exit;
}

// ── Resposta ──────────────────────────────────────────────────────
$totalOk  = count(array_filter($resultados, fn($r) => $r['ok']));
$totalErr = count($resultados) - $totalOk;

echo json_encode([
    'ok'          => empty($erros) || $totalOk > 0,
    'total_ok'    => $totalOk,
    'total_err'   => $totalErr,
    'erros'       => $erros,
    'resultados'  => $resultados,
    'mensagem'    => $totalErr === 0
        ? "✓ Relatório enviado! ({$totalOk} mensagem(ns))"
        : "⚠ Enviado com erros: {$totalOk} OK, {$totalErr} falha(s). " . implode(' | ', $erros),
]);
