<?php
require_once 'conexao.php';
session_start();

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

// Verificar se é uma requisição POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['success' => false, 'message' => 'Método não permitido.']);
    exit;
}

// Verificar CSRF token
if (!isset($_SESSION['csrf_token']) || !isset($_POST['csrf_token']) || $_SESSION['csrf_token'] !== $_POST['csrf_token']) {
    echo json_encode(['success' => false, 'message' => 'Token CSRF inválido.']);
    exit;
}

// Verificar se o usuário está logado
if (!isset($_SESSION['logado']) || $_SESSION['logado'] !== true) {
    echo json_encode(['success' => false, 'message' => 'Não autorizado.']);
    exit;
}

// Verificar permissões
$tenant_id = $_SESSION['tenant_id'] ?? null;
$usuario_id = $_SESSION['usuario_id'] ?? null;
$permissao = $_SESSION['permissao'] ?? 'usuario';
$is_admin = ($permissao === 'admin');
$is_super_admin = ($permissao === 'super_admin');

if (!$tenant_id || !$usuario_id) {
    echo json_encode(['success' => false, 'message' => 'Sessão inválida.']);
    exit;
}

// Obter IDs dos clientes a serem excluídos
$ids = $_POST['ids'] ?? [];

// Validar entrada
if (empty($ids) || !is_array($ids)) {
    echo json_encode(['success' => false, 'message' => 'Nenhum cliente selecionado.']);
    exit;
}

// Validar cada ID
$valid_ids = [];
foreach ($ids as $id) {
    if (is_numeric($id) && $id > 0) {
        $valid_ids[] = (int)$id;
    }
}

if (empty($valid_ids)) {
    echo json_encode(['success' => false, 'message' => 'IDs inválidos.']);
    exit;
}

// Criar string de placeholders para a consulta IN
$placeholders = implode(',', array_fill(0, count($valid_ids), '?'));

// Verificar permissão para ver todos os clientes
$stmtPerm = $conn->prepare("SELECT ver_todos_clientes FROM usuarios WHERE id = ?");
$stmtPerm->bind_param("i", $usuario_id);
$stmtPerm->execute();
$resultPerm = $stmtPerm->get_result();
$linhaPerm = $resultPerm->fetch_assoc();
$ver_todos_clientes = isset($linhaPerm['ver_todos_clientes']) ? (int)$linhaPerm['ver_todos_clientes'] : 0;
$stmtPerm->close();

// Verificar se os clientes existem e pertencem ao tenant
if ($is_admin || $is_super_admin || $ver_todos_clientes === 1) {
    $sql_verifica = "SELECT id, Nome_Cliente FROM clientes WHERE id IN ($placeholders) AND tenant_id = ?";
    $params_verifica = array_merge($valid_ids, [$tenant_id]);
    $types_verifica = str_repeat('i', count($valid_ids)) . 'i';
} else {
    $sql_verifica = "SELECT id, Nome_Cliente FROM clientes WHERE id IN ($placeholders) AND tenant_id = ? AND responsavel = ?";
    $params_verifica = array_merge($valid_ids, [$tenant_id, $usuario_id]);
    $types_verifica = str_repeat('i', count($valid_ids)) . 'ii';
}

$stmt_verifica = $conn->prepare($sql_verifica);
$stmt_verifica->bind_param($types_verifica, ...$params_verifica);
$stmt_verifica->execute();
$result_verifica = $stmt_verifica->get_result();

$clientes_validos = [];
$nomes_clientes = [];

while ($row = $result_verifica->fetch_assoc()) {
    $clientes_validos[] = $row['id'];
    $nomes_clientes[] = $row['Nome_Cliente'];
}
$stmt_verifica->close();

if (empty($clientes_validos)) {
    echo json_encode(['success' => false, 'message' => 'Nenhum cliente encontrado para exclusão.']);
    exit;
}

// INICIAR TRANSAÇÃO
$conn->begin_transaction();

try {
    $clientes_excluidos = count($clientes_validos);
    $placeholders_validos = implode(',', array_fill(0, count($clientes_validos), '?'));
    
    // Array com todos os IDs válidos
    $tipos_int = str_repeat('i', count($clientes_validos));
    
    // 1. EXCLUIR PERMISSÕES DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'permissoes_clientes'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM permissoes_clientes WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 2. EXCLUIR ARQUIVOS DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'cliente_arquivos'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM cliente_arquivos WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 3. EXCLUIR USO DE ESPAÇO DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'cliente_uso_espaco'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM cliente_uso_espaco WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 4. EXCLUIR PRODUTOS DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'cliente_produtos'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM cliente_produtos WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 5. EXCLUIR ATIVIDADES DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'atividades'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM atividades WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 6. EXCLUIR CLIENTE_ATIVIDADES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'cliente_atividades'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM cliente_atividades WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 7. EXCLUIR LOGS DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'cliente_logs'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM cliente_logs WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 8. EXCLUIR OBSERVAÇÕES DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'cliente_observacoes'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM cliente_observacoes WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 9. EXCLUIR CHAMADAS TELEFÔNICAS DOS CLIENTES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'chamadas_telefonicas'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM chamadas_telefonicas WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 10. EXCLUIR AGENDAMENTOS DE EMAIL
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'agendamentos_email'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM agendamentos_email WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 11. EXCLUIR CLIENTES PERDIDOS
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'clientes_perdidos'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM clientes_perdidos WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 12. EXCLUIR ENVIOS DE FORMULÁRIO
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'envios_formulario'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM envios_formulario WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 13. EXCLUIR RESPOSTAS DE FORMULÁRIO
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'respostas_formulario'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM respostas_formulario WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 14. EXCLUIR LOGS DE INTEGRAÇÃO
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'integracao_logs'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM integracao_logs WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 15. EXCLUIR TIMELINE
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'timeline'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM timeline WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 16. EXCLUIR WEBHOOK LOGS
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'webhook_logs'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        $sql = "DELETE FROM webhook_logs WHERE cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 17. EXCLUIR NOTIFICAÇÕES
    $tabela_existe = $conn->query("SHOW TABLES LIKE 'notificacoes'");
    if ($tabela_existe && $tabela_existe->num_rows > 0) {
        // Notificações podem não ter cliente_id direto, mas podem ter via atividade
        $sql = "DELETE n FROM notificacoes n 
                LEFT JOIN atividades a ON n.atividade_id = a.id 
                WHERE a.cliente_id IN ($placeholders_validos)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param($tipos_int, ...$clientes_validos);
        $stmt->execute();
        $stmt->close();
    }
    
    // 18. FINALMENTE EXCLUIR OS CLIENTES
    $sql_cliente = "DELETE FROM clientes WHERE id IN ($placeholders_validos) AND tenant_id = ?";
    $params_cliente = array_merge($clientes_validos, [$tenant_id]);
    $types_cliente = $tipos_int . 'i';
    
    $stmt_cliente = $conn->prepare($sql_cliente);
    $stmt_cliente->bind_param($types_cliente, ...$params_cliente);
    $stmt_cliente->execute();
    $affected_rows = $stmt_cliente->affected_rows;
    $stmt_cliente->close();
    
    // Confirmar transação
    $conn->commit();
    
    // Registrar log da exclusão
    registrarLogMultiplo('Exclusão múltipla de clientes', "Clientes excluídos: " . implode(', ', $clientes_validos) . " - Nomes: " . implode(', ', $nomes_clientes) . ", Quantidade: $clientes_excluidos, Tenant ID: $tenant_id, Usuário: $usuario_id");
    
    echo json_encode([
        'success' => true,
        'message' => "{$affected_rows} cliente(s) excluído(s) com sucesso."
    ]);
    
} catch (Exception $e) {
    // Rollback em caso de erro
    $conn->rollback();
    
    echo json_encode([
        'success' => false,
        'message' => 'Erro ao excluir clientes: ' . $e->getMessage()
    ]);
}

$conn->close();
exit;

// Função de log melhorada
function registrarLogMultiplo($acao, $detalhes = '') {
    $diretorioLogs = 'logs';
    $arquivoLog = $diretorioLogs . '/cliente_acoes.log';
    $dataHora = date('Y-m-d H:i:s');
    $usuario = $_SESSION['usuario_id'] ?? 'Sistema';
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'IP desconhecido';
    
    // Criar diretório se não existir
    if (!file_exists($diretorioLogs)) {
        mkdir($diretorioLogs, 0755, true);
    }
    
    $mensagem = sprintf(
        "[%s] [Usuário: %s] [IP: %s] [Ação: %s] %s\n",
        $dataHora,
        $usuario,
        $ip,
        $acao,
        $detalhes
    );
    
    file_put_contents($arquivoLog, $mensagem, FILE_APPEND | LOCK_EX);
}
?>