<?php
session_start();

// === CSRF helper (multi-token, one-time use) ===
if (!isset($_SESSION['csrf_tokens']) || !is_array($_SESSION['csrf_tokens'])) {
    $_SESSION['csrf_tokens'] = [];
}

function csrf_gc($ttl = 7200) {
    $now = time();
    foreach ($_SESSION['csrf_tokens'] as $t => $ts) {
        if ($now - (int)$ts > $ttl) {
            unset($_SESSION['csrf_tokens'][$t]);
        }
    }
}

function csrf_issue($ttl = 7200) {
    csrf_gc($ttl);
    $token = bin2hex(random_bytes(32));
    $_SESSION['csrf_tokens'][$token] = time();
    return $token;
}

function csrf_validate($token, $ttl = 7200, $consume = true) {
    csrf_gc($ttl);
    if (!$token) {
        error_log("CSRF Error: Token vazio");
        return false;
    }
    if (!isset($_SESSION['csrf_tokens'][$token])) {
        error_log("CSRF Error: Token não encontrado na sessão. Tokens disponíveis: " . implode(', ', array_keys($_SESSION['csrf_tokens'])));
        return false;
    }
    $age = time() - (int)$_SESSION['csrf_tokens'][$token];
    $ok = $age <= $ttl;
    if ($consume) {
        unset($_SESSION['csrf_tokens'][$token]);
    }
    return $ok && $age >= 0;
}

function csrf_header_token() {
    $headers = function_exists('getallheaders') ? getallheaders() : [];
    $token = $headers['X-CSRF-Token'] ?? $headers['X-Csrf-Token'] ?? ($_SERVER['HTTP_X_CSRF_TOKEN'] ?? null);
    return $token;
}
// ================================================
require_once 'conexao.php';

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

// DEBUG: Log para verificar a sessão
error_log("SESSION na atualização: " . print_r($_SESSION, true));

// Verifica se o usuário está logado
if (!isset($_SESSION['logado'])) {
    echo json_encode(['status' => 'erro', 'mensagem' => 'Usuário não autenticado']);
    exit;
}

// Verifica tenant_id
$tenant_id = $_SESSION['tenant_id'] ?? null;
if (!$tenant_id || !is_numeric($tenant_id)) {
    echo json_encode(['status' => 'erro', 'mensagem' => 'Tenant não identificado']);
    exit;
}

// Verifica o token CSRF
$json = file_get_contents('php://input');
$dados = json_decode($json, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo json_encode(['status' => 'erro', 'mensagem' => 'JSON inválido: ' . json_last_error_msg()]);
    exit;
}

// DEBUG: Log dos dados recebidos
error_log("Dados recebidos na atualização: " . print_r($dados, true));

// Accept token from JSON body OR X-CSRF-Token header
$headers = function_exists('getallheaders') ? getallheaders() : [];
$header_token = $headers['X-CSRF-Token'] ?? $headers['X-Csrf-Token'] ?? ($_SERVER['HTTP_X_CSRF_TOKEN'] ?? null);
$json_token = $dados['csrf_token'] ?? null;
$token_to_check = $json_token ?? $header_token;

error_log("Token a verificar: " . $token_to_check);

if (!csrf_validate($token_to_check)) {
    echo json_encode(['status' => 'erro', 'mensagem' => 'Token CSRF inválido ou expirado']);
    exit;
}

// Verificar se o ID do formulário foi fornecido
if (!isset($dados['id']) || empty($dados['id'])) {
    echo json_encode(['status' => 'erro', 'mensagem' => 'ID do formulário não fornecido']);
    exit;
}

$formulario_id = $dados['id'];
$conn->begin_transaction();

try {
    // 1. Verificar se o formulário existe e pertence ao tenant
    $stmt_check = $conn->prepare("SELECT id FROM formularios WHERE id = ? AND tenant_id = ?");
    $stmt_check->bind_param("ii", $formulario_id, $tenant_id);
    $stmt_check->execute();
    $result = $stmt_check->get_result();
    
    if ($result->num_rows === 0) {
        throw new Exception("Formulário não encontrado ou não pertence a este tenant");
    }
    $stmt_check->close();

    // 2. Preparar dados para atualização
  // 2. Preparar dados para atualização
$tipo = $dados['tipo'] ?? 'email';

// PADRONIZAR O TIPO DO FORMULÁRIO - CORREÇÃO ADICIONADA
$tipo = ($tipo === 'questionario') ? 'questionario' : 'E-mail';
    $nota_minima = null;
    $temperatura_nome = null;

    // DEBUG: Log dos dados recebidos
    error_log("Dados recebidos - Tipo: " . $tipo);
    error_log("Temperaturas recebidas: " . print_r($dados['temperaturas'] ?? 'NULL', true));
    error_log("Temperatura mínima recebida: " . ($dados['temperatura_minima'] ?? 'NULL'));

    // Processar configurações de temperatura se for questionário
    if ($tipo === 'questionario') {
        // Obter o nome da temperatura mínima selecionada
        $temperatura_minima_nome = $dados['temperatura_minima'] ?? null;
        
        // Encontrar a nota correspondente à temperatura mínima
        if ($temperatura_minima_nome && isset($dados['temperaturas']) && is_array($dados['temperaturas'])) {
            foreach ($dados['temperaturas'] as $temperatura) {
                if ($temperatura['nome'] === $temperatura_minima_nome) {
                    $nota_minima = floatval($temperatura['nota']);
                    $temperatura_nome = $temperatura_minima_nome;
                    error_log("Temperatura mínima encontrada: " . $temperatura_nome . " com nota: " . $nota_minima);
                    break;
                }
            }
        }
        
        // Se não encontrou, usar valor padrão
        if ($nota_minima === null) {
            $nota_minima = 7.0;
            $temperatura_nome = 'Quente';
            error_log("Usando temperatura mínima padrão: " . $temperatura_nome . " com nota: " . $nota_minima);
        }
    }

    // 3. Preparar a estrutura JSON atualizada
    $estrutura_json = json_encode([
        'tipo' => $tipo,
        'temperaturas' => $dados['temperaturas'] ?? [],
        'temperatura_minima' => $temperatura_nome,
        'nota_minima' => $nota_minima,
        'perguntas' => $dados['perguntas'] ?? []
    ]);

    // 4. Atualizar formulário principal - CORRIGIDO: atualizar também a estrutura
    if ($tipo === 'questionario') {
        $stmt = $conn->prepare("UPDATE formularios SET nome = ?, tipo = ?, nota_minima = ?, temperatura = ?, estrutura = ? WHERE id = ? AND tenant_id = ?");
        $stmt->bind_param("ssdssii", 
            $dados['nome'], 
            $tipo,
            $nota_minima,
            $temperatura_nome,
            $estrutura_json,
            $formulario_id,
            $tenant_id
        );
    } else {
        // Para formulários do tipo email, limpar os campos
        $estrutura_json_email = json_encode([
            'tipo' => 'email',
            'perguntas' => $dados['perguntas'] ?? []
        ]);
        
        $stmt = $conn->prepare("UPDATE formularios SET nome = ?, tipo = ?, nota_minima = NULL, temperatura = NULL, estrutura = ? WHERE id = ? AND tenant_id = ?");
        $stmt->bind_param("sssii", 
            $dados['nome'], 
            $tipo,
            $estrutura_json_email,
            $formulario_id,
            $tenant_id
        );
    }
    
    $stmt->execute();
    
    if ($stmt->affected_rows === 0) {
        // Não é um erro crítico, pode ser que apenas os dados das perguntas tenham mudado
        error_log("Aviso: Nenhuma alteração nos dados principais do formulário");
    }
    $stmt->close();

    // DEBUG: Log do resultado da atualização
    error_log("Formulário atualizado - ID: " . $formulario_id . ", Tipo: " . $tipo . ", Temperatura Mínima: " . ($temperatura_nome ?? 'NULL') . ", Nota Mínima: " . ($nota_minima ?? 'NULL'));

    // 5. ESTRATÉGIA SIMPLIFICADA: Remover TODAS as perguntas e respostas
    // Primeiro, remover opções de resposta - CORREÇÃO DA SINTAXE
    $stmt = $conn->prepare("DELETE FROM opcoes_resposta WHERE pergunta_id IN (SELECT id FROM perguntas WHERE formulario_id = ?)");
    $stmt->bind_param("i", $formulario_id);
    $stmt->execute();
    $stmt->close();

    // Depois, remover todas as perguntas
    $stmt = $conn->prepare("DELETE FROM perguntas WHERE formulario_id = ?");
    $stmt->bind_param("i", $formulario_id);
    $stmt->execute();
    $stmt->close();

    // 6. Função recursiva para salvar perguntas
    function salvarPerguntaRecursiva($conn, $formulario_id, $perguntaData, $parent_resposta_id = null, $ordem = 0) {
        error_log("Salvando pergunta: " . $perguntaData['texto'] . " - Parent: " . $parent_resposta_id . " - Ordem: " . $ordem);
        
        // Inserir pergunta
        $stmt = $conn->prepare("INSERT INTO perguntas (formulario_id, texto, tipo, parent_resposta_id, obrigatoria, ordem) VALUES (?, ?, ?, ?, ?, ?)");
        $obrigatoria = isset($perguntaData['obrigatoria']) ? (int)$perguntaData['obrigatoria'] : 1;
        $stmt->bind_param("issiii", $formulario_id, $perguntaData['texto'], $perguntaData['tipo'], $parent_resposta_id, $obrigatoria, $ordem);
        
        if (!$stmt->execute()) {
            throw new Exception("Erro ao inserir pergunta: " . $stmt->error);
        }
        
        $pergunta_id = $conn->insert_id;
        $stmt->close();

        // Se for pergunta com opções (não é texto/aberta), salvar as respostas
        if ($perguntaData['tipo'] !== 'texto' && isset($perguntaData['respostas']) && is_array($perguntaData['respostas'])) {
            $ordem_resposta = 0;
            foreach ($perguntaData['respostas'] as $respostaData) {
                error_log("Salvando resposta: " . $respostaData['texto'] . " - Para pergunta: " . $pergunta_id . " - Ordem: " . $ordem_resposta);
                
                // Inserir opção de resposta
                $stmt = $conn->prepare("INSERT INTO opcoes_resposta (pergunta_id, texto, pontuacao, ordem) VALUES (?, ?, ?, ?)");
                $pontuacao = $respostaData['pontuacao'] ?? 0;
                $stmt->bind_param("isdi", $pergunta_id, $respostaData['texto'], $pontuacao, $ordem_resposta);
                
                if (!$stmt->execute()) {
                    throw new Exception("Erro ao inserir resposta: " . $stmt->error);
                }
                
                $resposta_id = $conn->insert_id;
                $stmt->close();

                // Se houver perguntas condicionais para esta resposta, salvá-las recursivamente
                if (isset($respostaData['condicionais']) && is_array($respostaData['condicionais'])) {
                    error_log("Encontradas " . count($respostaData['condicionais']) . " perguntas condicionais para resposta: " . $respostaData['texto']);
                    
                    $ordem_condicional = 0;
                    foreach ($respostaData['condicionais'] as $condicionalData) {
                        salvarPerguntaRecursiva($conn, $formulario_id, $condicionalData, $resposta_id, $ordem_condicional);
                        $ordem_condicional++;
                    }
                }

                $ordem_resposta++;
            }
        }

        return $pergunta_id;
    }

    // 7. Salvar perguntas raiz
    if (!empty($dados['perguntas'])) {
        $ordem = 0;
        foreach ($dados['perguntas'] as $perguntaData) {
            // Verificar se é uma pergunta raiz (sem parent_resposta_id)
            if (!isset($perguntaData['parent_resposta_id']) || $perguntaData['parent_resposta_id'] === null) {
                salvarPerguntaRecursiva($conn, $formulario_id, $perguntaData, null, $ordem);
                $ordem++;
            }
        }
    }

    $conn->commit();
    
    echo json_encode([
        'status' => 'sucesso', 
        'mensagem' => 'Formulário atualizado com sucesso',
        'formulario_id' => $formulario_id,
        'csrf_token' => csrf_issue()
    ]);

} catch (Exception $e) {
    $conn->rollback();
    error_log("Erro ao atualizar formulário: " . $e->getMessage());
    echo json_encode([
        'status' => 'erro', 
        'mensagem' => 'Erro ao atualizar formulário: ' . $e->getMessage()
    ]);
}
?>