<?php
// whatsapp_clickservice_v2.php - Usando novo endpoint /report.php

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

header('Content-Type: application/json');

// ══════════════════════════════════════════
//  CONFIGURAÇÕES
// ══════════════════════════════════════════
define('CLICKSERVICE_API_URL', 'https://clickservice.com.br/api/v1');
define('CLICKSERVICE_API_KEY', getConfig('clickservice_apikey', ''));
define('CLICKSERVICE_MAX_ITEMS', 60); // Limite da API

// ══════════════════════════════════════════
//  VALIDAÇÃO
// ══════════════════════════════════════════
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['sucesso' => false, 'erro' => 'Método não permitido. Use POST.']);
    exit;
}

if (!verifyCsrf($_POST['csrf_token'] ?? '')) {
    echo json_encode(['sucesso' => false, 'erro' => 'CSRF inválido.']);
    exit;
}

if (empty(CLICKSERVICE_API_KEY)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Chave API ClickService não configurada.']);
    exit;
}

$id = (int)($_POST['id'] ?? 0);
$numeros = json_decode($_POST['numeros'] ?? '[]', true);
$texto = trim($_POST['texto'] ?? '');
$fotos = json_decode($_POST['fotos'] ?? '[]', true);
$interval = (int)($_POST['interval'] ?? 2000);
$statusUrl = $_POST['status_url'] ?? '';

if (!$id) {
    echo json_encode(['sucesso' => false, 'erro' => 'ID da OS não informado.']);
    exit;
}

if (empty($numeros) || !is_array($numeros)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Nenhum número de supervisor informado.']);
    exit;
}

if (empty($texto)) {
    echo json_encode(['sucesso' => false, 'erro' => 'Mensagem vazia.']);
    exit;
}

// ══════════════════════════════════════════
//  FUNÇÕES AUXILIARES
// ══════════════════════════════════════════

function getUrlAbsoluta(string $caminhoRelativo): string {
    $proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
    return $proto . '://' . $host . '/' . ltrim($caminhoRelativo, '/');
}

function detectarTipoMidia(string $caminho): string {
    $ext = strtolower(pathinfo($caminho, PATHINFO_EXTENSION));
    $map = [
        'jpg' => 'image', 'jpeg' => 'image', 'png' => 'image', 
        'webp' => 'image', 'gif' => 'image',
        'mp4' => 'video', 'mov' => 'video', 'avi' => 'video',
        'pdf' => 'document', 'doc' => 'document', 'docx' => 'document',
        'xls' => 'document', 'xlsx' => 'document', 'txt' => 'document'
    ];
    return $map[$ext] ?? 'image';
}

function obterNomeArquivo(string $caminho): string {
    return basename($caminho);
}

function obterMimeType(string $caminho): string {
    $ext = strtolower(pathinfo($caminho, PATHINFO_EXTENSION));
    $map = [
        'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg',
        'png' => 'image/png', 'webp' => 'image/webp',
        'gif' => 'image/gif', 'pdf' => 'application/pdf',
        'doc' => 'application/msword',
        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        'xls' => 'application/vnd.ms-excel',
        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'txt' => 'text/plain'
    ];
    return $map[$ext] ?? 'application/octet-stream';
}

/**
 * Envia relatório via /report.php (novo endpoint)
 */
function enviarRelatorioClickService(
    string $numero,
    string $texto,
    array $itens,
    int $interval = 2000,
    ?string $statusUrl = null
): array {
    $payload = [
        'number' => '55' . preg_replace('/\D/', '', $numero),
        'text' => $texto,
        'interval' => max(1000, $interval),
        'items' => []
    ];

    if ($statusUrl) {
        $payload['status_url'] = $statusUrl;
    }

    // Monta os itens
    foreach ($itens as $item) {
        $midia = [
            'media' => $item['url'],
            'mediatype' => $item['tipo'] ?? 'image'
        ];
        
        if (!empty($item['caption'])) {
            $midia['caption'] = $item['caption'];
        }
        
        if ($midia['mediatype'] === 'document' && !empty($item['fileName'])) {
            $midia['fileName'] = $item['fileName'];
        }
        
        if (!empty($item['mimetype'])) {
            $midia['mimetype'] = $item['mimetype'];
        }
        
        $payload['items'][] = $midia;
    }

    // Se não tem itens, envia só o texto
    if (empty($payload['items'])) {
        $payload['text'] = $texto;
        unset($payload['items']);
    }

    $ch = curl_init(CLICKSERVICE_API_URL . '/report.php');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'apikey: ' . CLICKSERVICE_API_KEY
        ],
        CURLOPT_TIMEOUT => 60,
        CURLOPT_SSL_VERIFYPEER => true
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);

    if ($error) {
        return ['sucesso' => false, 'erro' => "CURL error: $error"];
    }

    $data = json_decode($response, true);
    
    if ($httpCode === 200 && isset($data['ok']) && $data['ok'] === true) {
        return [
            'sucesso' => true,
            'jobId' => $data['jobId'] ?? null,
            'total' => $data['total'] ?? 0,
            'batches' => $data['batches'] ?? 0,
            'estimatedSeconds' => $data['estimatedSeconds'] ?? 0,
            'statusUrl' => $data['statusUrl'] ?? null,
            'limits' => $data['limits'] ?? null
        ];
    }

    return [
        'sucesso' => false,
        'erro' => $data['error'] ?? "HTTP $httpCode - " . substr($response, 0, 200)
    ];
}

/**
 * Consulta status de um job
 */
function consultarStatusRelatorio(string $jobId): array {
    $ch = curl_init(CLICKSERVICE_API_URL . '/report_status.php?job=' . urlencode($jobId));
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'apikey: ' . CLICKSERVICE_API_KEY
        ],
        CURLOPT_TIMEOUT => 30,
        CURLOPT_SSL_VERIFYPEER => true
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode === 200) {
        return json_decode($response, true) ?? ['ok' => false, 'erro' => 'Resposta inválida'];
    }

    return ['ok' => false, 'erro' => "HTTP $httpCode"];
}

// ══════════════════════════════════════════
//  PREPARA OS ITENS
// ══════════════════════════════════════════

$itens = [];
foreach ($fotos as $caminho) {
    $url = getUrlAbsoluta($caminho);
    $tipo = detectarTipoMidia($caminho);
    $nome = obterNomeArquivo($caminho);
    
    $item = [
        'url' => $url,
        'tipo' => $tipo
    ];
    
    if ($tipo === 'document') {
        $item['fileName'] = $nome;
        $item['mimetype'] = obterMimeType($caminho);
    }
    
    $itens[] = $item;
}

// ══════════════════════════════════════════
//  VALIDA LIMITE
// ══════════════════════════════════════════

if (count($itens) > CLICKSERVICE_MAX_ITEMS) {
    echo json_encode([
        'sucesso' => false,
        'erro' => "Limite de " . CLICKSERVICE_MAX_ITEMS . " mídias por chamada. " .
                  "Você tem " . count($itens) . " fotos. Divida em múltiplos envios."
    ]);
    exit;
}

// ══════════════════════════════════════════
//  EXECUTA O ENVIO
// ══════════════════════════════════════════

$resultados = [];
$sucessos = 0;
$falhas = 0;
$jobs = [];

foreach ($numeros as $numero) {
    $numeroLimpo = preg_replace('/\D/', '', $numero);
    
    if (strlen($numeroLimpo) < 10) {
        $resultados[] = [
            'numero' => $numero,
            'sucesso' => false,
            'erro' => 'Número inválido (mínimo 10 dígitos)'
        ];
        $falhas++;
        continue;
    }

    // Gera URL de status para este envio (se quiser receber callback)
    $statusUrl = getConfig('app_url', '') . '/webhook_clickservice_status.php';

    $resultado = enviarRelatorioClickService(
        $numeroLimpo,
        $texto,
        $itens,
        $interval,
        $statusUrl
    );

    if ($resultado['sucesso']) {
        $sucessos++;
        $jobs[] = $resultado['jobId'];
        $resultados[] = [
            'numero' => $numero,
            'sucesso' => true,
            'jobId' => $resultado['jobId'],
            'total' => $resultado['total'],
            'batches' => $resultado['batches'],
            'estimatedSeconds' => $resultado['estimatedSeconds']
        ];
    } else {
        $falhas++;
        $resultados[] = [
            'numero' => $numero,
            'sucesso' => false,
            'erro' => $resultado['erro'] ?? 'Falha desconhecida'
        ];
    }
}

// ══════════════════════════════════════════
//  REGISTRA LOG
// ══════════════════════════════════════════
try {
    pdo()->prepare(
        "INSERT INTO logs_whatsapp (os_id, tipo, destinatarios, sucessos, falhas, payload, data_envio)
         VALUES (?, 'REPORT_V2', ?, ?, ?, ?, NOW())"
    )->execute([
        $id,
        implode(', ', $numeros),
        $sucessos,
        $falhas,
        json_encode([
            'total_fotos' => count($itens),
            'jobs' => $jobs,
            'interval' => $interval,
            'texto' => substr($texto, 0, 500)
        ])
    ]);
} catch (Exception $e) {
    // Log não crítico
}

// ══════════════════════════════════════════
//  RESPOSTA
// ══════════════════════════════════════════
echo json_encode([
    'sucesso' => $falhas === 0,
    'sucessos' => $sucessos,
    'falhas' => $falhas,
    'total_fotos' => count($itens),
    'jobs' => $jobs,
    'detalhes' => $resultados,
    'usou_clickservice' => true,
    'versao_api' => '1.1.2'
]);