<?php
/**
 * =====================================================================
 * CAE - Endpoint para gravação do cadastro
 * ---------------------------------------------------------------------
 * Recebe POST JSON do formulário SiteCAE.html, valida e grava em:
 *   - participantes
 *   - participante_emocoes (N:N)
 *   - participante_interesses (N:N)
 *   - evento_participante (N:N)
 *
 * Tudo dentro de uma transação. Se algo falhar, faz rollback completo.
 *
 * Resposta:
 *   200  { "ok": true,  "participante_id": N }
 *   400  { "ok": false, "erro": "mensagem" }
 *   409  { "ok": false, "erro": "email já cadastrado" }
 *   500  { "ok": false, "erro": "erro interno" }
 * =====================================================================
 */

declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');
header('X-Content-Type-Options: nosniff');

require_once __DIR__ . '/config/db.php';

// ---------------------------------------------------------------------
// 1. Aceita só POST
// ---------------------------------------------------------------------
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok' => false, 'erro' => 'Método não permitido']);
    exit;
}

// ---------------------------------------------------------------------
// 2. Lê o JSON do body
// ---------------------------------------------------------------------
$raw = file_get_contents('php://input');
$dados = json_decode($raw, true);

if (!is_array($dados)) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'erro' => 'JSON inválido']);
    exit;
}

// ---------------------------------------------------------------------
// 3. Validações básicas
// ---------------------------------------------------------------------
$nome     = trim((string)($dados['nome']     ?? ''));
$email    = trim((string)($dados['email']    ?? ''));
$telefone = trim((string)($dados['telefone'] ?? ''));
$evento   = (int)($dados['evento_id'] ?? 0);

if ($nome === '' || mb_strlen($nome) < 2) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'erro' => 'Nome é obrigatório']);
    exit;
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'erro' => 'E-mail inválido']);
    exit;
}

if ($telefone === '') {
    http_response_code(400);
    echo json_encode(['ok' => false, 'erro' => 'Telefone é obrigatório']);
    exit;
}

if ($evento < 1) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'erro' => 'Evento não informado']);
    exit;
}

// ---------------------------------------------------------------------
// 4. Conecta ao banco
// ---------------------------------------------------------------------
try {
    $pdo = cae_db();
} catch (Throwable $e) {
    error_log('[CAE] Falha na conexão: ' . $e->getMessage());
    http_response_code(500);
    echo json_encode(['ok' => false, 'erro' => 'Erro interno (conexão)']);
    exit;
}

// ---------------------------------------------------------------------
// 5. Confirma que o evento existe (evita FK error mais à frente)
// ---------------------------------------------------------------------
try {
    $stmt = $pdo->prepare('SELECT id FROM eventos WHERE id = ?');
    $stmt->execute([$evento]);
    if (!$stmt->fetchColumn()) {
        http_response_code(400);
        echo json_encode(['ok' => false, 'erro' => 'Evento inexistente']);
        exit;
    }
} catch (Throwable $e) {
    error_log('[CAE] Falha ao validar evento: ' . $e->getMessage());
    http_response_code(500);
    echo json_encode(['ok' => false, 'erro' => 'Erro interno (validação)']);
    exit;
}

// ---------------------------------------------------------------------
// 6. Verifica duplicidade de e-mail ANTES de iniciar a transação
//    Regra: "1 cadastro por pessoa" — email já existe → bloqueia.
// ---------------------------------------------------------------------
try {
    $stmt = $pdo->prepare('SELECT id FROM participantes WHERE email = ?');
    $stmt->execute([$email]);
    if ($stmt->fetchColumn()) {
        http_response_code(409);
        echo json_encode([
            'ok'   => false,
            'erro' => 'E-mail já cadastrado'
        ]);
        exit;
    }
} catch (Throwable $e) {
    error_log('[CAE] Falha ao checar duplicidade: ' . $e->getMessage());
    http_response_code(500);
    echo json_encode(['ok' => false, 'erro' => 'Erro interno']);
    exit;
}

// ---------------------------------------------------------------------
// 7. Sanitiza/normaliza demais campos (todos opcionais)
// ---------------------------------------------------------------------
$idade = isset($dados['idade']) && $dados['idade'] !== ''
    ? (int)$dados['idade']
    : null;

$camposOpcionais = [
    'localidade'       => $dados['localidade']      ?? null,
    'estado_civil'     => $dados['estadoCivil']     ?? null,
    'instagram'        => $dados['instagram']       ?? null,
    'religiao'         => $dados['religiao']        ?? null,
    'igreja'           => $dados['igreja']          ?? null,
    'participa_celula' => $dados['participaCelula'] ?? null,
    'como_conheceu'    => $dados['comoConheceu']    ?? null,
    'conexao_deus'     => $dados['conexaoDeus']     ?? null,
    'proposito'        => $dados['proposito']       ?? null,
    'area_cuidado'     => $dados['areaCuidado']     ?? null,
    'palavra_chave'    => $dados['palavraChave']    ?? null,
];

// Converte strings vazias em NULL para os ENUMs não estourarem
foreach ($camposOpcionais as $k => $v) {
    $camposOpcionais[$k] = ($v === '' || $v === null) ? null : trim((string)$v);
}

$emocoes    = is_array($dados['emocoesEnfrentadas']  ?? null) ? $dados['emocoesEnfrentadas']  : [];
$interesses = is_array($dados['interessesNoProjeto'] ?? null) ? $dados['interessesNoProjeto'] : [];

$ip = $_SERVER['REMOTE_ADDR'] ?? null;

// ---------------------------------------------------------------------
// 8. Transação: insere participante + N:N + ligação com evento
// ---------------------------------------------------------------------
try {
    $pdo->beginTransaction();

    // 8.1 INSERT do participante
    $sql = "INSERT INTO participantes
            (nome, email, telefone, idade, localidade, estado_civil, instagram,
             religiao, igreja, participa_celula, como_conheceu,
             conexao_deus, proposito, area_cuidado, palavra_chave, ip_origem)
            VALUES
            (:nome, :email, :telefone, :idade, :localidade, :estado_civil, :instagram,
             :religiao, :igreja, :participa_celula, :como_conheceu,
             :conexao_deus, :proposito, :area_cuidado, :palavra_chave, :ip_origem)";

    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':nome'             => $nome,
        ':email'            => $email,
        ':telefone'         => $telefone,
        ':idade'            => $idade,
        ':localidade'       => $camposOpcionais['localidade'],
        ':estado_civil'     => $camposOpcionais['estado_civil'],
        ':instagram'        => $camposOpcionais['instagram'],
        ':religiao'         => $camposOpcionais['religiao'],
        ':igreja'           => $camposOpcionais['igreja'],
        ':participa_celula' => $camposOpcionais['participa_celula'],
        ':como_conheceu'    => $camposOpcionais['como_conheceu'],
        ':conexao_deus'     => $camposOpcionais['conexao_deus'],
        ':proposito'        => $camposOpcionais['proposito'],
        ':area_cuidado'     => $camposOpcionais['area_cuidado'],
        ':palavra_chave'    => $camposOpcionais['palavra_chave'],
        ':ip_origem'        => $ip,
    ]);

    $participanteId = (int)$pdo->lastInsertId();

    // 8.2 N:N emoções — busca o id pelo nome no catálogo
    if (!empty($emocoes)) {
        $sel = $pdo->prepare('SELECT id FROM emocoes_catalogo WHERE nome = ?');
        $ins = $pdo->prepare(
            'INSERT IGNORE INTO participante_emocoes (participante_id, emocao_id) VALUES (?, ?)'
        );
        foreach ($emocoes as $nomeEmocao) {
            $sel->execute([trim((string)$nomeEmocao)]);
            $idEmocao = $sel->fetchColumn();
            if ($idEmocao) {
                $ins->execute([$participanteId, (int)$idEmocao]);
            }
        }
    }

    // 8.3 N:N interesses
    if (!empty($interesses)) {
        $sel = $pdo->prepare('SELECT id FROM interesses_catalogo WHERE nome = ?');
        $ins = $pdo->prepare(
            'INSERT IGNORE INTO participante_interesses (participante_id, interesse_id) VALUES (?, ?)'
        );
        foreach ($interesses as $nomeInteresse) {
            $sel->execute([trim((string)$nomeInteresse)]);
            $idInteresse = $sel->fetchColumn();
            if ($idInteresse) {
                $ins->execute([$participanteId, (int)$idInteresse]);
            }
        }
    }

    // 8.4 Ligação evento × participante (INSERT IGNORE para idempotência)
    $stmt = $pdo->prepare(
        'INSERT IGNORE INTO evento_participante (evento_id, participante_id) VALUES (?, ?)'
    );
    $stmt->execute([$evento, $participanteId]);

    $pdo->commit();

    echo json_encode([
        'ok'              => true,
        'participante_id' => $participanteId,
    ]);

} catch (Throwable $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log('[CAE] Falha ao gravar cadastro: ' . $e->getMessage());
    http_response_code(500);
    echo json_encode(['ok' => false, 'erro' => 'Erro ao salvar cadastro']);
}
