<?php
/**
 * AURA FARMING — Diamantes — Parte 06
 *
 * Regras de Like e Super Like pagos com Diamantes.
 * Esta etapa NÃO altera Mercado Pago, pacotes ou compras; ela usa a carteira criada nas Partes 01–05.
 */

if (!defined('AURA_DIAMONDS_PART06_VERSION')) {
    define('AURA_DIAMONDS_PART06_VERSION', '6.0.0');
}

function afDiamondReactionConfig(PDO $pdo, string $key, int|float|string|bool $default): int|float|string|bool
{
    static $cache = [];
    if (array_key_exists($key, $cache)) return $cache[$key];

    try {
        $st = $pdo->prepare('SELECT valor,tipo FROM af_configuracoes WHERE chave=? LIMIT 1');
        $st->execute([$key]);
        $row = $st->fetch();
        if (!$row) return $cache[$key] = $default;
        $value = $row['valor'];
        $type = (string)($row['tipo'] ?? 'string');
        return $cache[$key] = match ($type) {
            'int', 'integer' => (int)$value,
            'float', 'decimal' => (float)$value,
            'bool', 'boolean' => in_array(strtolower((string)$value), ['1','true','sim','yes','on'], true),
            default => (string)$value,
        };
    } catch (Throwable $e) {
        return $cache[$key] = $default;
    }
}

function afDiamondReactionNormalizeType(string $tipo): string
{
    $tipo = strtolower(trim($tipo));
    if ($tipo === 'super_like') $tipo = 'superlike';
    if (!in_array($tipo, ['like','superlike'], true)) {
        throw new RuntimeException('Interação inválida.');
    }
    return $tipo;
}

function afDiamondReactionRules(PDO $pdo, string $tipo): array
{
    $tipo = afDiamondReactionNormalizeType($tipo);
    if ($tipo === 'like') {
        return [
            'type' => 'like',
            'label' => 'Like',
            'ledger_type' => 'like_spend',
            'event_type' => 'like',
            'diamonds' => max(1, (int)afDiamondReactionConfig($pdo, 'diamond_like_cost', 2)),
            'aura' => max(0.0, (float)afDiamondReactionConfig($pdo, 'diamond_like_aura_points', 2.0)),
            'xp' => max(0, (int)afDiamondReactionConfig($pdo, 'diamond_like_xp_sender', 5)),
        ];
    }

    return [
        'type' => 'superlike',
        'label' => 'Super Like',
        'ledger_type' => 'super_like_spend',
        'event_type' => 'super_like',
        'diamonds' => max(1, (int)afDiamondReactionConfig($pdo, 'diamond_superlike_cost', 10)),
        'aura' => max(0.0, (float)afDiamondReactionConfig($pdo, 'diamond_superlike_aura_points', 15.0)),
        'xp' => max(0, (int)afDiamondReactionConfig($pdo, 'diamond_superlike_xp_sender', 25)),
    ];
}

function afDiamondReactionCosts(PDO $pdo): array
{
    $like = afDiamondReactionRules($pdo, 'like');
    $super = afDiamondReactionRules($pdo, 'superlike');
    return [
        'like' => [
            'diamonds' => (int)$like['diamonds'],
            'aura' => (float)$like['aura'],
            'xp' => (int)$like['xp'],
        ],
        'superlike' => [
            'diamonds' => (int)$super['diamonds'],
            'aura' => (float)$super['aura'],
            'xp' => (int)$super['xp'],
        ],
    ];
}

function afDiamondReactionsEnabled(PDO $pdo): bool
{
    return (bool)afDiamondReactionConfig($pdo, 'diamond_paid_reactions_enabled', true);
}

function afDiamondReactionAssertReady(PDO $pdo): void
{
    if (!function_exists('afDiamondsAssertInstalled')) {
        throw new RuntimeException('O módulo de Diamantes ainda não está instalado.');
    }
    afDiamondsAssertInstalled($pdo);
    if (!afDiamondReactionsEnabled($pdo)) {
        throw new RuntimeException('Likes pagos com Diamantes estão temporariamente desativados.');
    }
}

function afDiamondReactionAudit(PDO $pdo, string $action, int $fromUserId, int $toUserId, int $matchId, array $data = []): void
{
    try {
        if (function_exists('afDiamondsAudit')) {
            afDiamondsAudit($pdo, $action, 'paid_reaction', $data['paid_reaction_id'] ?? null, [], $data, [
                'subject_user_id' => $fromUserId,
                'target_user_id' => $toUserId,
                'match_id' => $matchId,
                'severity' => $data['severity'] ?? 'info',
                'source' => 'diamonds_part06',
            ]);
        } elseif (function_exists('afStage24AuditLog')) {
            afStage24AuditLog($pdo, $action, 'paid_reaction', $data['paid_reaction_id'] ?? null, [], $data, [
                'subject_user_id' => $fromUserId,
                'target_user_id' => $toUserId,
                'match_id' => $matchId,
                'severity' => $data['severity'] ?? 'info',
                'source' => 'diamonds_part06',
            ]);
        }
    } catch (Throwable $e) {
        if (defined('APP_DEBUG') && APP_DEBUG) error_log('[AURA-DIAMOND-REACTION-AUDIT] ' . $e->getMessage());
    }
}

function afDiamondReactionAwardXp(PDO $pdo, int $usuarioId, int $xp, string $tipo, int $partidaId, int $targetUserId): array
{
    if ($xp <= 0) {
        return ['xp' => 0, 'nivel_antes' => null, 'nivel_novo' => null];
    }

    $st = $pdo->prepare('SELECT xp_total,nivel FROM af_usuarios WHERE id=? FOR UPDATE');
    $st->execute([$usuarioId]);
    $u = $st->fetch();
    if (!$u) throw new RuntimeException('Usuário não encontrado para XP.');

    $xpAntes = (int)($u['xp_total'] ?? 0);
    $nivelAntes = function_exists('calcularNivel') ? calcularNivel($xpAntes) : (int)($u['nivel'] ?? 1);
    $xpNovo = $xpAntes + $xp;
    $nivelNovo = function_exists('calcularNivel') ? calcularNivel($xpNovo) : $nivelAntes;
    $titulo = function_exists('getTitulo') ? getTitulo($nivelNovo) : (string)($u['titulo'] ?? 'Aura Initiate');

    $pdo->prepare('UPDATE af_usuarios SET xp_total=?, nivel=?, titulo=?, atualizado_em=NOW() WHERE id=?')
        ->execute([$xpNovo, $nivelNovo, $titulo, $usuarioId]);

    if (function_exists('afRegistrarXp')) {
        afRegistrarXp($pdo, $usuarioId, $xp, 'diamond_'.$tipo, ($tipo === 'superlike' ? 'Super Like enviado' : 'Like enviado'), $partidaId, null, [
            'target_user_id' => $targetUserId,
            'source' => 'diamonds_part06',
        ]);
    }

    if ($nivelNovo > $nivelAntes && function_exists('criarNotificacao')) {
        criarNotificacao($pdo, $usuarioId, 'level_up', 'Nível '.$nivelNovo.' alcançado!', 'Você ganhou XP usando Diamantes em interações sociais.', ['nivel' => $nivelNovo]);
    }

    if (function_exists('afSincronizarRecompensas')) {
        afSincronizarRecompensas($pdo, $usuarioId, $nivelNovo, $partidaId);
    }

    return ['xp' => $xp, 'nivel_antes' => $nivelAntes, 'nivel_novo' => $nivelNovo, 'xp_total' => $xpNovo];
}

function afDiamondReactionInsufficientMessage(PDO $pdo, string $tipo): string
{
    $r = afDiamondReactionRules($pdo, $tipo);
    return 'Diamantes insuficientes. Você precisa de '.$r['diamonds'].' Diamantes para enviar '.$r['label'].'.';
}
