<?php
/**
 * ajax/enviar_relatorio_wa.php
 * Envia o relatório completo da OS via Evolution API (WhatsApp)
 * Suporta: texto formatado + imagens (uma por mensagem com legenda)
 * Suporte a múltiplos destinatários (supervisores)
 *
 * POST params:
 *   os_id          - ID da ordem de serviço
 *   telefone       - Número destino (ex: 5517999999999) - opcional se supervisor_id
 *   supervisor_id  - ID do supervisor (opcional, usa tabela supervisores)
 *   enviar_todos   - "1" para enviar a todos supervisores ativos
 *   instancia      - Nome da instância (opcional, usa config do BD)
 */
require_once __DIR__ . '/../auth.php';
require_once __DIR__ . '/../functions.php';
requireLogin();

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

// ── Helpers ─────────────────────────────────────────────────────────
function evolucaoPost(string $endpoint, array $body): array {
    $url     = rtrim(getConfig('wa_api_url'), '/') . $endpoint;
    $token   = getConfig('wa_api_token');

    $payload = json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    $opts = stream_context_create([
        'http' => [
            'method'        => 'POST',
            'header'        => "Content-Type: application/json\r\napikey: {$token}\r\n",
            'content'       => $payload,
            'timeout'       => 30,
            'ignore_errors' => true,
        ]
    ]);
    $res  = @file_get_contents($url, false, $opts);
    $code = (int)($http_response_header[0] ?? '0');

    if ($res === false) {
        return ['ok' => false, 'code' => 0, 'body' => 'Conexão recusada — verifique a URL da API'];
    }
    $json = json_decode($res, true) ?? [];
    return ['ok' => $code >= 200 && $code < 300, 'code' => $code, 'body' => $json, 'raw' => $res];
}

function imgParaBase64(string $caminho): ?array {
    $path = __DIR__ . '/../' . ltrim($caminho, '/');
    if (!file_exists($path)) return null;
    $ext  = strtolower(pathinfo($path, PATHINFO_EXTENSION));
    $mime = match($ext) {
        'png'  => 'image/png',
        'webp' => 'image/webp',
        'gif'  => 'image/gif',
        default => 'image/jpeg',
    };
    $data = base64_encode(file_get_contents($path));
    return ['base64' => $data, 'mime' => $mime, 'mediatype' => 'image'];
}

function registrarLog(int $osId, string $destino, string $status, int $imgsEnv, int $imgsTotal, string $erro = ''): void {
    try {
        pdo()->prepare(
            "INSERT INTO wa_envios_log (os_id, destino, status, imagens_enviadas, total_imagens, erro, enviado_em)
             VALUES (?, ?, ?, ?, ?, ?, NOW())"
        )->execute([$osId, $destino, $status, $imgsEnv, $imgsTotal, $erro ?: null]);
    } catch (Exception $e) {
        // Tabela pode não existir ainda - cria
        try {
            pdo()->exec("CREATE TABLE IF NOT EXISTS wa_envios_log (
                id INT AUTO_INCREMENT PRIMARY KEY,
                os_id INT NOT NULL,
                destino VARCHAR(50) NOT NULL,
                status VARCHAR(20) NOT NULL DEFAULT 'pendente',
                imagens_enviadas INT DEFAULT 0,
                total_imagens INT DEFAULT 0,
                erro TEXT NULL,
                enviado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                INDEX idx_os (os_id),
                INDEX idx_status (status),
                INDEX idx_enviado (enviado_em)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
            pdo()->prepare(
                "INSERT INTO wa_envios_log (os_id, destino, status, imagens_enviadas, total_imagens, erro, enviado_em)
                 VALUES (?, ?, ?, ?, ?, ?, NOW())"
            )->execute([$osId, $destino, $status, $imgsEnv, $imgsTotal, $erro ?: null]);
        } catch (Exception $e2) {
            // Silencia
        }
    }
}

// ── Lê e valida entrada ─────────────────────────────────────────────
$osId          = (int)($_POST['os_id']        ?? $_GET['os_id']        ?? 0);
$supervisorId  = (int)($_POST['supervisor_id'] ?? $_GET['supervisor_id'] ?? 0);
$enviarTodos   = ($_POST['enviar_todos'] ?? $_GET['enviar_todos'] ?? '0') === '1';
$telefone      = preg_replace('/\D/', '', $_POST['telefone']   ?? $_GET['telefone']   ?? '');
$instancia     = trim($_POST['instancia']     ?? $_GET['instancia']     ?? '') ?: getConfig('wa_instancia');

if (!$osId)     { echo json_encode(['success'=>false,'message'=>'OS inválida']); exit; }
if (!$instancia){ echo json_encode(['success'=>false,'message'=>'Instância não configurada']); exit; }
if (!getConfig('wa_api_url'))  { echo json_encode(['success'=>false,'message'=>'URL da API não configurada']); exit; }
if (!getConfig('wa_api_token')){ echo json_encode(['success'=>false,'message'=>'Token da API não configurado']); exit; }

// ── Define lista de destinatários ───────────────────────────────────
$destinatarios = [];

if ($enviarTodos) {
    // Busca todos supervisores ativos
    try {
        $stmtSup = pdo()->query("SELECT id, nome, whatsapp, cargo FROM supervisores WHERE ativo = 1");
        $supervisores = $stmtSup->fetchAll();
        foreach ($supervisores as $sup) {
            $tel = preg_replace('/\D/', '', $sup['whatsapp']);
            if (strlen($tel) >= 10) {
                if (!str_starts_with($tel, '55')) $tel = '55' . $tel;
                $destinatarios[] = [
                    'id'    => $sup['id'],
                    'nome'  => $sup['nome'],
                    'cargo' => $sup['cargo'] ?? 'Supervisor',
                    'tel'   => $tel,
                ];
            }
        }
    } catch (Exception $e) {
        echo json_encode(['success'=>false,'message'=>'Erro ao buscar supervisores: ' . $e->getMessage()]);
        exit;
    }
} elseif ($supervisorId > 0) {
    // Busca supervisor específico
    try {
        $stmtSup = pdo()->prepare("SELECT id, nome, whatsapp, cargo FROM supervisores WHERE id = ? AND ativo = 1");
        $stmtSup->execute([$supervisorId]);
        $sup = $stmtSup->fetch();
        if ($sup) {
            $tel = preg_replace('/\D/', '', $sup['whatsapp']);
            if (strlen($tel) >= 10) {
                if (!str_starts_with($tel, '55')) $tel = '55' . $tel;
                $destinatarios[] = [
                    'id'    => $sup['id'],
                    'nome'  => $sup['nome'],
                    'cargo' => $sup['cargo'] ?? 'Supervisor',
                    'tel'   => $tel,
                ];
            }
        }
    } catch (Exception $e) {
        // Tenta usar telefone manual
    }
}

// Fallback: telefone manual (legado)
if (empty($destinatarios) && strlen($telefone) >= 10) {
    if (!str_starts_with($telefone, '55')) $telefone = '55' . $telefone;
    $destinatarios[] = [
        'id'    => 0,
        'nome'  => 'Destinatário',
        'cargo' => '',
        'tel'   => $telefone,
    ];
}

if (empty($destinatarios)) {
    echo json_encode(['success'=>false,'message'=>'Nenhum destinatário encontrado. Selecione um supervisor ou informe um telefone.']);
    exit;
}

// ── Carrega dados da OS ─────────────────────────────────────────────
$os = pdo()->prepare(
    "SELECT os.*, c.nome AS cliente_nome, c.telefone AS cliente_tel,
            c.endereco_cidade, c.plano, t.nome AS tecnico_nome
     FROM ordens_servico os
     LEFT JOIN clientes c ON c.id = os.cliente_id
     LEFT JOIN usuarios t ON t.id = os.tecnico_id
     WHERE os.id = ?"
);
$os->execute([$osId]);
$os = $os->fetch();
if (!$os) { echo json_encode(['success'=>false,'message'=>'OS não encontrada']); exit; }

$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]);
$matList = $stmtMat->fetchAll();

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

$stmtFachada = pdo()->prepare(
    "SELECT caminho_arquivo FROM clientes_fotos
     WHERE cliente_id=? AND tipo='INSTALACAO' ORDER BY data_envio DESC LIMIT 1"
);
$stmtFachada->execute([$os['cliente_id']]);
$fotoFachada = $stmtFachada->fetchColumn();

$fotosServico = array_filter($todasFotos, fn($f) => ($f['tipo']??'SERVICO')==='SERVICO');
$fotosOLT     = array_filter($todasFotos, fn($f) => ($f['tipo']??'')==='OLT');

// ── Monta texto do relatório ────────────────────────────────────────
$empresaNome = getConfig('empresa_nome', APP_NAME);
$matLinhas   = array_map(fn($m) => "  • {$m['mat_nome']}: {$m['quantidade_usada']} {$m['unidade']}", $matList);

function fmtDataSimples(?string $dt): string {
    if (!$dt) return '—';
    $ts = strtotime($dt);
    return $ts ? date('d/m/Y H:i', $ts) : '—';
}

$texto  = "📋 *RELATÓRIO DE ATENDIMENTO*\n";
$texto .= "━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
$texto .= "🔢 OS: *{$os['numero_os']}*\n";
$texto .= "📌 Tipo: " . ($os['tipo_os'] ?? '—') . "\n";
$texto .= "🏷 Status: {$os['status']}\n";
$texto .= "📅 Abertura: " . fmtDataSimples($os['data_abertura']) . "\n";
if ($os['data_fechamento']) $texto .= "✅ Conclusão: " . fmtDataSimples($os['data_fechamento']) . "\n";
$texto .= "\n👤 *CLIENTE*\n";
$texto .= "Nome: {$os['cliente_nome']}\n";
if ($os['cliente_tel'])    $texto .= "Tel: {$os['cliente_tel']}\n";
if ($os['endereco_cidade']) $texto .= "Cidade: {$os['endereco_cidade']}\n";
if ($os['plano'])           $texto .= "Plano: {$os['plano']}\n";
$texto .= "\n👷 *EXECUÇÃO*\n";
$texto .= "Técnico: " . ($os['tecnico_nome'] ?: 'N/A') . "\n";
if ($os['protocolo'])       $texto .= "Protocolo: {$os['protocolo']}\n";
if ($os['relato_cliente']) {
    $texto .= "\n📣 *Relato do cliente:*\n{$os['relato_cliente']}\n";
}
if ($os['descricao_servico']) {
    $texto .= "\n🔧 *Serviço executado:*\n{$os['descricao_servico']}\n";
}
if ($os['solucao']) {
    $texto .= "\n✔ *Solução aplicada:*\n{$os['solucao']}\n";
}
if ($matLinhas) {
    $texto .= "\n📦 *MATERIAIS UTILIZADOS*\n" . implode("\n", $matLinhas) . "\n";
}
$totalFotos = ($fotoFachada?1:0) + count($fotosServico) + count($fotosOLT);
if ($totalFotos > 0) {
    $texto .= "\n📸 *IMAGENS ANEXADAS: {$totalFotos} foto(s)*\n";
}
$texto .= "\n━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
$texto .= "_Enviado por {$empresaNome}_";

// ── Processa envio para cada destinatário ───────────────────────────
$resultados    = [];
$endpointText  = "/message/sendText/{$instancia}";
$endpointMedia = "/message/sendMedia/{$instancia}";

foreach ($destinatarios as $dest) {
    $enviados  = 0;
    $erros     = [];
    $totalMsg  = 1 + ($fotoFachada ? 1 : 0) + count($fotosServico) + count($fotosOLT);
    
    // 1. Envia texto principal
    $r = evolucaoPost($endpointText, [
        'number'      => $dest['tel'],
        'text'        => $texto,
        'delay'       => 800,
        'linkPreview' => false,
    ]);
    if ($r['ok']) { 
        $enviados++; 
    } else { 
        $erros[] = "Texto: " . ($r['body']['message'] ?? $r['raw'] ?? 'erro'); 
    }
    usleep(500000);

    // 2. Fachada
    if ($fotoFachada) {
        $img = imgParaBase64($fotoFachada);
        if ($img) {
            $r = evolucaoPost($endpointMedia, [
                'number'    => $dest['tel'],
                'mediatype' => 'image',
                'mimetype'  => $img['mime'],
                'caption'   => "🏠 *Fachada — {$os['cliente_nome']}*",
                'media'     => 'data:' . $img['mime'] . ';base64,' . $img['base64'],
                'fileName'  => 'fachada.jpg',
                'delay'     => 600,
            ]);
            if ($r['ok']) $enviados++;
            else $erros[] = "Fachada: " . ($r['body']['message'] ?? 'erro');
            usleep(600000);
        }
    }

    // 3. Fotos serviço
    $numServ = 0;
    foreach ($fotosServico as $f) {
        $img = imgParaBase64($f['caminho_arquivo']);
        if (!$img) continue;
        $numServ++;
        $desc = !empty($f['descricao']) ? $f['descricao'] : 'Foto do serviço';
        $r = evolucaoPost($endpointMedia, [
            'number'    => $dest['tel'],
            'mediatype' => 'image',
            'mimetype'  => $img['mime'],
            'caption'   => "📸 *{$desc}* ({$numServ}/". count($fotosServico) .")",
            'media'     => 'data:' . $img['mime'] . ';base64,' . $img['base64'],
            'fileName'  => "servico_{$numServ}.jpg",
            'delay'     => 600,
        ]);
        if ($r['ok']) $enviados++;
        else $erros[] = "Foto serv #{$numServ}: " . ($r['body']['message'] ?? 'erro');
        usleep(600000);
    }

    // 4. Fotos OLT
    $numOlt = 0;
    foreach ($fotosOLT as $f) {
        $img = imgParaBase64($f['caminho_arquivo']);
        if (!$img) continue;
        $numOlt++;
        $desc = !empty($f['descricao']) ? $f['descricao'] : 'Foto OLT/CTO';
        $r = evolucaoPost($endpointMedia, [
            'number'    => $dest['tel'],
            'mediatype' => 'image',
            'mimetype'  => $img['mime'],
            'caption'   => "📡 *{$desc}* ({$numOlt}/". count($fotosOLT) .")",
            'media'     => 'data:' . $img['mime'] . ';base64,' . $img['base64'],
            'fileName'  => "olt_{$numOlt}.jpg",
            'delay'     => 600,
        ]);
        if ($r['ok']) $enviados++;
        else $erros[] = "Foto OLT #{$numOlt}: " . ($r['body']['message'] ?? 'erro');
        usleep(600000);
    }

    $imgsEnviadas = $enviados - 1; // desconta o texto
    if ($imgsEnviadas < 0) $imgsEnviadas = 0;
    
    $status = $enviados === $totalMsg ? 'enviado' : ($enviados > 1 ? 'parcial' : 'erro');
    
    // Registra log
    registrarLog($osId, $dest['tel'], $status, $imgsEnviadas, $totalFotos, implode('; ', $erros));

    $resultados[] = [
        'destinatario'     => $dest['nome'] . ($dest['cargo'] ? " ({$dest['cargo']})" : ''),
        'telefone'         => $dest['tel'],
        'texto_enviado'    => $enviados > 0,
        'imagens_enviadas' => $imgsEnviadas,
        'total_imagens'    => $totalFotos,
        'total_mensagens'  => $totalMsg,
        'enviadas'         => $enviados,
        'erros'            => $erros,
    ];
}

// ── Resposta ────────────────────────────────────────────────────────
$todosEnviados = count(array_filter($resultados, fn($r) => $r['enviadas'] > 0));
$sucesso = $todosEnviados > 0;

echo json_encode([
    'success'            => $sucesso,
    'message'            => $sucesso
        ? "✓ Relatório enviado para {$todosEnviados} destinatário(s)!"
        : 'Nenhuma mensagem foi enviada.',
    'total_destinatarios'=> count($destinatarios),
    'destinatarios_ok'   => $todosEnviados,
    'resultados'         => $resultados,
]);