<?php
// ajax/wa_enviar_relatorio.php
// Envia relatório de OS (texto + fotos) via Evolution API para supervisor(es).
// Chamado via fetch() por os_detalhe.php -> enviarRelatorioWhatsApp()

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

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

function jsonOut(array $data, int $code = 200): void {
    http_response_code($code);
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    jsonOut(['success' => false, 'message' => 'Método inválido.'], 405);
}

if (!verifyCsrf($_POST['csrf_token'] ?? '')) {
    jsonOut(['success' => false, 'message' => 'CSRF inválido. Recarregue a página e tente novamente.'], 403);
}

$osId         = (int)($_POST['os_id'] ?? 0);
$supervisorId = (int)($_POST['supervisor_id'] ?? 0);
$telefoneRaw  = trim($_POST['telefone'] ?? '');
$enviarTodos  = ($_POST['enviar_todos'] ?? '0') === '1';

if ($osId <= 0) {
    jsonOut(['success' => false, 'message' => 'OS inválida.'], 400);
}

$os = getOSById($osId);
if (!$os) {
    jsonOut(['success' => false, 'message' => 'OS não encontrada.'], 404);
}

// ══════════════════════════════════════════
//  CONFIGURAÇÃO DA EVOLUTION API
// ══════════════════════════════════════════
$apiUrl    = rtrim(getConfig('wa_api_url', ''), '/');
$apiToken  = getConfig('wa_api_token', '');
$instancia = getConfig('wa_instancia', '');

if ($apiUrl === '' || $apiToken === '' || $instancia === '') {
    jsonOut(['success' => false, 'message' => 'Evolution API não configurada. Verifique Configurações.'], 400);
}

// ══════════════════════════════════════════
//  MONTA LISTA DE DESTINATÁRIOS
// ══════════════════════════════════════════
$destinatarios = []; // [ ['nome' => ..., 'telefone' => ...], ... ]

try {
    if ($enviarTodos) {
        $stmt = pdo()->query("SELECT nome, whatsapp FROM supervisores WHERE ativo = 1 ORDER BY nome");
        foreach ($stmt->fetchAll() as $s) {
            $tel = preg_replace('/\D/', '', $s['whatsapp'] ?? '');
            if ($tel !== '') {
                $destinatarios[] = ['nome' => $s['nome'], 'telefone' => $tel];
            }
        }
    } elseif ($supervisorId > 0) {
        $stmt = pdo()->prepare("SELECT nome, whatsapp FROM supervisores WHERE id = ? AND ativo = 1 LIMIT 1");
        $stmt->execute([$supervisorId]);
        $s = $stmt->fetch();
        if ($s) {
            $tel = preg_replace('/\D/', '', $s['whatsapp'] ?? '');
            if ($tel !== '') {
                $destinatarios[] = ['nome' => $s['nome'], 'telefone' => $tel];
            }
        }
    } elseif ($telefoneRaw !== '') {
        $tel = preg_replace('/\D/', '', $telefoneRaw);
        $destinatarios[] = ['nome' => 'Supervisor', 'telefone' => $tel];
    }
} catch (Exception $e) {
    // Tabela supervisores pode não existir; se um telefone manual foi passado, usa ele
    if ($telefoneRaw !== '') {
        $destinatarios[] = ['nome' => 'Supervisor', 'telefone' => preg_replace('/\D/', '', $telefoneRaw)];
    }
}

if (empty($destinatarios)) {
    jsonOut(['success' => false, 'message' => 'Nenhum destinatário válido encontrado.'], 400);
}

// ══════════════════════════════════════════
//  DADOS DA OS PARA O RELATÓRIO
// ══════════════════════════════════════════
$stmtMat = pdo()->prepare("SELECT mu.quantidade_usada, m.nome AS mat_nome, m.unidade
    FROM materiais_usados_os mu JOIN materiais m ON m.id = mu.material_id
    WHERE mu.os_id = ? ORDER BY mu.data_registro");
$stmtMat->execute([$osId]);
$materiais = $stmtMat->fetchAll();

$stmtFotos = pdo()->prepare("SELECT caminho_arquivo, descricao, tipo FROM fotos_os WHERE os_id = ? ORDER BY tipo, data_envio");
$stmtFotos->execute([$osId]);
$fotos = $stmtFotos->fetchAll();

$usuario = usuarioLogado();

// Monta o texto do relatório
$linhas = [];
$linhas[] = "📋 *RELATÓRIO DE OS — {$os['numero_os']}*";
$linhas[] = "";
$linhas[] = "👤 Cliente: {$os['cliente_nome']}";
if (!empty($os['endereco_cidade'])) $linhas[] = "📍 Cidade: {$os['endereco_cidade']}";
$linhas[] = "🔧 Tipo: " . (function_exists('labelTipoOS') ? labelTipoOS($os['tipo_os']) : $os['tipo_os']);
$linhas[] = "📌 Status: {$os['status']}";
$linhas[] = "👷 Técnico: " . ($os['tecnico_nome'] ?: ($usuario['nome'] ?? '—'));
if (!empty($os['descricao_servico'])) {
    $linhas[] = "";
    $linhas[] = "📝 *Descrição do serviço:*";
    $linhas[] = $os['descricao_servico'];
}
if (!empty($os['solucao'])) {
    $linhas[] = "";
    $linhas[] = "✅ *Solução aplicada:*";
    $linhas[] = $os['solucao'];
}
if (!empty($materiais)) {
    $linhas[] = "";
    $linhas[] = "📦 *Materiais utilizados:*";
    foreach ($materiais as $m) {
        $linhas[] = "• {$m['mat_nome']} — {$m['quantidade_usada']} {$m['unidade']}";
    }
}
$linhas[] = "";
$linhas[] = "🕐 Enviado em " . date('d/m/Y H:i');

$textoRelatorio = implode("\n", $linhas);

// ══════════════════════════════════════════
//  HELPERS EVOLUTION API
// ══════════════════════════════════════════

function evoRequest(string $apiUrl, string $endpoint, string $apiToken, array $body): array {
    $ch = curl_init($apiUrl . $endpoint);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($body, JSON_UNESCAPED_UNICODE),
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'apikey: ' . $apiToken,
        ],
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
    ]);
    $resp = curl_exec($ch);
    $err  = curl_error($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($resp === false) {
        return ['ok' => false, 'error' => "Falha de conexão: $err"];
    }
    $decoded = json_decode($resp, true);
    if ($code >= 200 && $code < 300) {
        return ['ok' => true, 'data' => $decoded];
    }
    $msg = $decoded['message'] ?? $decoded['error'] ?? "HTTP $code";
    if (is_array($msg)) $msg = implode('; ', $msg);
    return ['ok' => false, 'error' => $msg];
}

function evoSendText(string $apiUrl, string $instancia, string $apiToken, string $numero, string $texto): array {
    return evoRequest($apiUrl, "/message/sendText/{$instancia}", $apiToken, [
        'number' => $numero,
        'text'   => $texto,
    ]);
}

function evoSendMedia(string $apiUrl, string $instancia, string $apiToken, string $numero, string $mediatype, string $mimetype, string $base64, string $fileName, string $caption = ''): array {
    return evoRequest($apiUrl, "/message/sendMedia/{$instancia}", $apiToken, [
        'number'    => $numero,
        'mediatype' => $mediatype,
        'mimetype'  => $mimetype,
        'media'     => $base64,
        'fileName'  => $fileName,
        'caption'   => $caption,
    ]);
}

function mimeFromExt(string $path): string {
    $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
    return match ($ext) {
        'png'  => 'image/png',
        'webp' => 'image/webp',
        'gif'  => 'image/gif',
        default => 'image/jpeg',
    };
}

// ══════════════════════════════════════════
//  ENVIO PARA CADA DESTINATÁRIO
// ══════════════════════════════════════════
$resultados = [];

// Garante que o número tenha código do país (55 = Brasil)
function normalizarNumero(string $tel): string {
    $tel = preg_replace('/\D/', '', $tel);
    if (strlen($tel) <= 11) { // DDD + número, sem país
        $tel = '55' . $tel;
    }
    return $tel;
}

foreach ($destinatarios as $dest) {
    $numero = normalizarNumero($dest['telefone']);
    $erros = [];
    $imagensEnviadas = 0;

    // 1) Envia o texto
    $r = evoSendText($apiUrl, $instancia, $apiToken, $numero, $textoRelatorio);
    $textoOk = $r['ok'];
    if (!$textoOk) $erros[] = 'Texto: ' . $r['error'];

    // 2) Envia cada foto
    foreach ($fotos as $f) {
        $caminhoAbs = __DIR__ . '/../' . ltrim($f['caminho_arquivo'], '/');
        if (!is_file($caminhoAbs)) {
            $erros[] = "Foto não encontrada: {$f['caminho_arquivo']}";
            continue;
        }
        $conteudo = @file_get_contents($caminhoAbs);
        if ($conteudo === false) {
            $erros[] = "Falha ao ler: {$f['caminho_arquivo']}";
            continue;
        }
        $base64   = base64_encode($conteudo);
        $mimetype = mimeFromExt($caminhoAbs);
        $legenda  = ($f['tipo'] ?? 'SERVICO') === 'OLT' ? '📡 ' . ($f['descricao'] ?: 'Foto OLT') : '📸 ' . ($f['descricao'] ?: 'Foto do serviço');

        $rm = evoSendMedia($apiUrl, $instancia, $apiToken, $numero, 'image', $mimetype, $base64, basename($caminhoAbs), $legenda);
        if ($rm['ok']) {
            $imagensEnviadas++;
        } else {
            $erros[] = 'Foto ' . basename($caminhoAbs) . ': ' . $rm['error'];
        }
        // Pequena pausa para não sobrecarregar a instância
        usleep(400000);
    }

    $totalImagens = count($fotos);
    $status = 'erro';
    if ($textoOk && $imagensEnviadas === $totalImagens && empty($erros)) {
        $status = 'enviado';
    } elseif ($textoOk || $imagensEnviadas > 0) {
        $status = 'parcial';
    }

    $resultados[] = [
        'destinatario'      => "{$dest['nome']} ({$numero})",
        'texto_enviado'     => $textoOk,
        'imagens_enviadas'  => $imagensEnviadas,
        'total_imagens'     => $totalImagens,
        'erros'             => $erros,
    ];

    // Log no banco
    try {
        pdo()->prepare("INSERT INTO wa_envios_log (os_id, destinatario, status, imagens_enviadas, total_imagens, erro, enviado_em)
            VALUES (?, ?, ?, ?, ?, ?, NOW())")
            ->execute([
                $osId,
                "{$dest['nome']} ({$numero})",
                $status,
                $imagensEnviadas,
                $totalImagens,
                $erros ? implode('; ', $erros) : null,
            ]);
    } catch (Exception $e) {
        // Tabela wa_envios_log pode não existir ainda — não bloqueia o envio
    }
}

$algumSucesso = array_reduce($resultados, fn($carry, $r) => $carry || $r['texto_enviado'], false);

jsonOut([
    'success'             => $algumSucesso,
    'message'             => $algumSucesso ? 'Relatório enviado.' : 'Falha ao enviar para todos os destinatários.',
    'total_destinatarios' => count($destinatarios),
    'resultados'          => $resultados,
]);