<?php
/**
 * ajax/buscar_clientes_caixa.php
 * Busca clientes vinculados a uma determinada caixa/marcação KML
 * 
 * Parâmetros GET:
 *   nome  - Nome da caixa/marcação (obrigatório)
 *   lat   - Latitude da caixa (opcional, para busca por proximidade)
 *   lng   - Longitude da caixa (opcional, para busca por proximidade)
 * 
 * Retorno JSON:
 *   ok       - boolean
 *   clientes - array de clientes encontrados
 *   total    - número total de clientes
 */

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

require_once __DIR__ . '/../functions.php';
require_once __DIR__ . '/../auth.php';

// Verifica se usuário está logado
if (!usuarioLogado()) {
    echo json_encode([
        'ok' => false,
        'erro' => 'Não autorizado',
        'clientes' => []
    ]);
    exit;
}

$nome = trim($_GET['nome'] ?? '');
$lat  = isset($_GET['lat']) ? (float)$_GET['lat'] : null;
$lng  = isset($_GET['lng']) ? (float)$_GET['lng'] : null;

if (empty($nome)) {
    echo json_encode([
        'ok' => false,
        'erro' => 'Nome da caixa não informado',
        'clientes' => []
    ]);
    exit;
}

try {
    $pdo = pdo();
    $clientes = [];
    
    // Busca por nome exato da caixa nos campos cto_nome e marcacao_kml_nome
    $sql = "SELECT 
                id, 
                nome, 
                plano, 
                endereco_cidade AS cidade,
                endereco_logradouro,
                endereco_numero,
                endereco_bairro,
                latitude,
                longitude,
                ativo,
                bloqueado,
                marcacao_kml_dist
            FROM clientes 
            WHERE (cto_nome = :nome1 OR marcacao_kml_nome = :nome2)
            ORDER BY nome ASC
            LIMIT 30";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute(['nome1' => $nome, 'nome2' => $nome]);
    $clientes = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Se não encontrou por nome exato, tenta busca parcial (LIKE)
    if (empty($clientes)) {
        $sqlLike = "SELECT 
                        id, 
                        nome, 
                        plano, 
                        endereco_cidade AS cidade,
                        endereco_logradouro,
                        endereco_numero,
                        endereco_bairro,
                        latitude,
                        longitude,
                        ativo,
                        bloqueado,
                        marcacao_kml_dist
                    FROM clientes 
                    WHERE (cto_nome LIKE :nome1 OR marcacao_kml_nome LIKE :nome2)
                    ORDER BY nome ASC
                    LIMIT 30";
        
        $stmtLike = $pdo->prepare($sqlLike);
        $likeParam = '%' . $nome . '%';
        $stmtLike->execute(['nome1' => $likeParam, 'nome2' => $likeParam]);
        $clientes = $stmtLike->fetchAll(PDO::FETCH_ASSOC);
    }
    
    // Também busca em ordens de serviço (os) se tem referência a esta caixa
    $sqlOS = "SELECT DISTINCT
                    c.id,
                    c.nome,
                    c.plano,
                    c.endereco_cidade AS cidade,
                    c.endereco_logradouro,
                    c.endereco_numero,
                    c.endereco_bairro,
                    c.latitude,
                    c.longitude,
                    c.ativo,
                    c.bloqueado,
                    c.marcacao_kml_dist
                FROM clientes c
                INNER JOIN ordens_servico os ON os.cliente_id = c.id
                WHERE (os.descricao LIKE :desc1 OR os.observacoes LIKE :desc2)
                    AND c.id NOT IN (
                        SELECT id FROM clientes 
                        WHERE cto_nome = :nome3 OR marcacao_kml_nome = :nome4
                    )
                ORDER BY c.nome ASC
                LIMIT 20";
    
    $stmtOS = $pdo->prepare($sqlOS);
    $likeOS = '%' . $nome . '%';
    $stmtOS->execute([
        'desc1' => $likeOS,
        'desc2' => $likeOS,
        'nome3' => $nome,
        'nome4' => $nome
    ]);
    $clientesOS = $stmtOS->fetchAll(PDO::FETCH_ASSOC);
    
    // Mescla resultados sem duplicar
    $idsExistentes = array_column($clientes, 'id');
    foreach ($clientesOS as $cli) {
        if (!in_array($cli['id'], $idsExistentes)) {
            $clientes[] = $cli;
            $idsExistentes[] = $cli['id'];
        }
    }
    
    // Formata os dados para o frontend
    $resultado = array_map(function($c) {
        $status = 'Ativo';
        if ($c['bloqueado']) $status = 'Bloqueado';
        if (!$c['ativo']) $status = 'Inativo';
        
        $endereco = trim(($c['endereco_logradouro'] ?? '') . 
                        ($c['endereco_numero'] ? ', ' . $c['endereco_numero'] : '') . 
                        ($c['endereco_bairro'] ? ' - ' . $c['endereco_bairro'] : ''));
        
        return [
            'id'       => (int)$c['id'],
            'nome'     => $c['nome'],
            'plano'    => $c['plano'] ?: '—',
            'cidade'   => $c['cidade'] ?: '—',
            'status'   => $status,
            'endereco' => $endereco ?: '—',
            'lat'      => $c['latitude'] ? (float)$c['latitude'] : null,
            'lng'      => $c['longitude'] ? (float)$c['longitude'] : null,
            'dist'     => $c['marcacao_kml_dist'] ? (float)$c['marcacao_kml_dist'] : null,
        ];
    }, $clientes);
    
    echo json_encode([
        'ok'       => true,
        'clientes' => $resultado,
        'total'    => count($resultado),
        'nome'     => $nome
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    
} catch (PDOException $e) {
    // Log do erro (opcional)
    error_log('Erro buscar_clientes_caixa: ' . $e->getMessage());
    
    echo json_encode([
        'ok'       => false,
        'erro'     => 'Erro ao consultar banco de dados',
        'clientes' => [],
        'total'    => 0
    ]);
} catch (Exception $e) {
    error_log('Erro buscar_clientes_caixa: ' . $e->getMessage());
    
    echo json_encode([
        'ok'       => false,
        'erro'     => 'Erro interno',
        'clientes' => [],
        'total'    => 0
    ]);
}