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

// === CSRF helper ===
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_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");
        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_issue($ttl = 7200) {
    csrf_gc($ttl);
    $token = bin2hex(random_bytes(32));
    $_SESSION['csrf_tokens'][$token] = time();
    return $token;
}

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

// Verificar se o usuário está logado
if (!isset($_SESSION['logado'])) {
    http_response_code(401);
    echo json_encode(['status' => 'erro', 'mensagem' => 'Não autorizado']);
    exit;
}

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

// Ler dados JSON da requisição
$input = file_get_contents('php://input');
$dados = json_decode($input, true);

if (!$dados) {
    http_response_code(400);
    echo json_encode(['status' => 'erro', 'mensagem' => 'Dados inválidos.']);
    exit;
}

// Validar CSRF
$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;

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

// Validar dados obrigatórios
if (empty($dados['nome'])) {
    echo json_encode(['status' => 'erro', 'mensagem' => 'Nome do formulário é obrigatório.']);
    exit;
}

// CORREÇÃO: Obter e validar o tipo corretamente
$nome = trim($dados['nome']);
$tipo = isset($dados['tipo']) ? $dados['tipo'] : 'E-mail';

// CORREÇÃO: Validar valores permitidos para tipo
$tipos_permitidos = ['E-mail', 'questionario'];
if (!in_array($tipo, $tipos_permitidos)) {
    $tipo = 'E-mail'; // Valor padrão
}

$nota_minima = isset($dados['nota_minima']) && $dados['nota_minima'] !== '' ? (float)$dados['nota_minima'] : null;

// DEBUG: Log dos dados recebidos
error_log("Dados recebidos - Nome: $nome, Tipo: $tipo, Nota Mínima: " . ($nota_minima ?? 'NULL'));

try {
    $conn->begin_transaction();

    // 1. Salvar formulário principal - CORREÇÃO: tipos de binding corrigidos
    $stmt = $conn->prepare("INSERT INTO formularios (nome, tenant_id, tipo, nota_minima) VALUES (?, ?, ?, ?)");
    
    // CORREÇÃO: Binding correto dos parâmetros
    if ($nota_minima === null) {
        // Se nota_minima é NULL, usar 'i' para integer (NULL é tratado como 0 em integer)
        $null_param = null;
        $stmt->bind_param("sisi", $nome, $tenant_id, $tipo, $null_param);
    } else {
        // Se tem nota_minima, usar 'd' para double
        $stmt->bind_param("sisd", $nome, $tenant_id, $tipo, $nota_minima);
    }
    
    if (!$stmt->execute()) {
        throw new Exception("Erro ao salvar formulário: " . $stmt->error);
    }
    
    $formulario_id = $conn->insert_id;
    $stmt->close();

    // DEBUG: Verificar se o formulário foi salvo corretamente
    error_log("Formulário salvo com ID: $formulario_id, Tipo: $tipo");

    // 2. Salvar perguntas
    if (!empty($dados['perguntas'])) {
        foreach ($dados['perguntas'] as $ordem => $perguntaData) {
            inserirPergunta($conn, $perguntaData, $formulario_id, $tenant_id, null, $ordem);
        }
    }

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

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

$conn->close();

// Função recursiva para inserir perguntas e respostas
function inserirPergunta($conn, $perguntaData, $formulario_id, $tenant_id, $parent_resposta_id = null, $ordem = 0) {
    $texto = trim($perguntaData['texto']);
    $tipo = $perguntaData['tipo'];
    $obrigatoria = isset($perguntaData['obrigatoria']) ? (int)$perguntaData['obrigatoria'] : 1;

    // Inserir pergunta
    $stmt = $conn->prepare("INSERT INTO perguntas (formulario_id, texto, tipo, parent_resposta_id, obrigatoria, ordem) VALUES (?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("issiii", $formulario_id, $texto, $tipo, $parent_resposta_id, $obrigatoria, $ordem);
    $stmt->execute();
    $pergunta_id = $conn->insert_id;
    $stmt->close();

    // Inserir respostas/opções se não for pergunta aberta
    if ($tipo !== 'texto' && !empty($perguntaData['respostas'])) {
        foreach ($perguntaData['respostas'] as $idx => $respostaData) {
            $texto_resposta = trim($respostaData['texto']);
            $pontuacao = isset($respostaData['pontuacao']) ? (float)$respostaData['pontuacao'] : 0.00;

            // Inserir opção de resposta
            $stmt_opcao = $conn->prepare("INSERT INTO opcoes_resposta (pergunta_id, texto, pontuacao, ordem) VALUES (?, ?, ?, ?)");
            $stmt_opcao->bind_param("isdi", $pergunta_id, $texto_resposta, $pontuacao, $idx);
            $stmt_opcao->execute();
            $resposta_id = $conn->insert_id;
            $stmt_opcao->close();

            // Inserir perguntas condicionais se houver
            if (!empty($respostaData['condicionais'])) {
                foreach ($respostaData['condicionais'] as $ordem_cond => $perguntaCondicional) {
                    inserirPergunta($conn, $perguntaCondicional, $formulario_id, $tenant_id, $resposta_id, $ordem_cond);
                }
            }
        }
    }
}
?>