<?php
require_once __DIR__.'/../config/config.php';require_once __DIR__.'/../config/database.php';require_once __DIR__.'/../includes/functions.php';require_once __DIR__.'/../includes/admin_functions.php';afAdminRequireAuth();
if($_SERVER['REQUEST_METHOD']==='POST'){
 try{
  if(!validarCsrfToken($_POST[CSRF_TOKEN_NAME]??''))throw new RuntimeException('Sessão expirada.');
  $uid=(int)($_POST['user_id']??0);$decision=(string)($_POST['decision']??'');$notes=trim((string)($_POST['notes']??''));
  if($uid<=0||!in_array($decision,['approve','block'],true))throw new RuntimeException('Decisão inválida.');
  if(mb_strlen($notes)<10)throw new RuntimeException('Registre a justificativa com pelo menos 10 caracteres.');
  $st=$pdo->prepare("SELECT * FROM af_user_age_profiles WHERE usuario_id=? AND status_idade='adult_declared' AND tipo_conta='adult' LIMIT 1");$st->execute([$uid]);$age=$st->fetch();if(!$age)throw new RuntimeException('Declaração adulta pendente não encontrada.');
  $new=$decision==='approve'?'adult_verified':'blocked';
  $pdo->beginTransaction();
  $pdo->prepare('UPDATE af_user_age_profiles SET status_idade=?,verificado_em=IF(?="adult_verified",NOW(),NULL),atualizado_em=NOW() WHERE usuario_id=?')->execute([$new,$new,$uid]);
  $pdo->prepare("INSERT INTO af_age_verifications(usuario_id,metodo,resultado,data_nascimento,pais_residencia,idade_calculada,ip_address,user_agent,device_uuid,dados,criado_em) VALUES (?,'admin_internal_review',?,?,?,?,?,?,?, ?,NOW())")
   ->execute([$uid,$decision==='approve'?'adult':'unknown',$age['data_nascimento'],$age['pais_residencia'],$age['idade_declarada'],clientIp(),substr((string)($_SERVER['HTTP_USER_AGENT']??''),0,1000),substr(deviceUuid(),0,64),json_encode(['admin_id'=>afAdminId(),'decision'=>$decision,'notes'=>$notes,'civil_identity_verified'=>false],JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)]);
  $pdo->prepare('INSERT INTO af_age_status_history(usuario_id,status_anterior,status_novo,motivo,actor_usuario_id,dados,criado_em) VALUES (?,?,?,?,NULL,?,NOW())')
   ->execute([$uid,'adult_declared',$new,'revisão administrativa de sinais etários',json_encode(['admin_id'=>afAdminId(),'notes'=>$notes],JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)]);
  $pdo->commit();
  afAdminLog($pdo,'age_assurance_reviewed','user',$uid,['decision'=>$decision,'notes'=>$notes]);
  criarNotificacao($pdo,$uid,'age_review',$decision==='approve'?'Maioridade confirmada':'Conta bloqueada para revisão',$decision==='approve'?'A revisão interna foi concluída.':'A declaração de idade apresentou inconsistências. Entre em contato com o suporte.');
  setFlash('success','Revisão registrada.');
 }catch(Throwable $e){if($pdo->inTransaction())$pdo->rollBack();setFlash('error',$e->getMessage());}
 header('Location: '.SITE_URL.'/pages/admin-verificacoes-idade.php');exit;
}
$q=trim((string)($_GET['q']??''));$params=[];$where="a.status_idade IN ('adult_declared','blocked')";
if($q!==''){$where.=' AND (u.nome LIKE ? OR u.email LIKE ? OR u.username LIKE ? OR u.aura_id LIKE ?)';for($i=0;$i<4;$i++)$params[]='%'.$q.'%';}
$st=$pdo->prepare("SELECT a.*,u.nome,u.email,u.username,u.aura_id,u.email_verificado_em,u.risco_conta,u.seguranca_status,u.data_cadastro FROM af_user_age_profiles a JOIN af_usuarios u ON u.id=a.usuario_id WHERE {$where} ORDER BY FIELD(a.status_idade,'adult_declared','blocked'),a.atualizado_em DESC LIMIT 200");$st->execute($params);$items=$st->fetchAll()?:[];
$pageTitle='Admin • Verificações de idade';$showNav=false;$bodyClass='admin-body';$adminPage='idades';require __DIR__.'/../includes/header.php';
?>
<div class="admin-shell"><?php require __DIR__.'/../includes/admin_nav.php';?><main class="admin-main"><header class="admin-topbar"><div><small>ETAPA 14 • AFERIÇÃO INTERNA</small><h1>Verificações de idade</h1></div><span class="admin-count"><?=count($items)?> registro(s)</span></header><?=renderFlash()?>
<div class="admin-warning">A confirmação interna combina e-mail, dispositivo, risco e revisão humana. Não declare que houve validação de identidade civil quando isso não ocorreu.</div>
<form class="admin-filters" method="get"><input name="q" value="<?=esc($q)?>" placeholder="Nome, e-mail, usuário ou Aura ID"><button>Filtrar</button></form>
<div class="admin-cards-list"><?php if(!$items):?><div class="admin-empty">Nenhuma declaração pendente.</div><?php endif;?><?php foreach($items as $r):$assurance=afAgeAssuranceStatus($pdo,(int)$r['usuario_id']);?><article class="admin-report-card"><header><div><span class="admin-pill"><?=esc($r['status_idade'])?></span><b><?=esc($r['nome'])?> • <?=esc($r['aura_id'])?></b></div><time><?=date('d/m/Y H:i',strtotime((string)$r['atualizado_em']))?></time></header><div class="admin-report-grid"><p><small>CONTA</small><b>@<?=esc($r['username'])?></b><span><?=esc($r['email'])?></span></p><p><small>IDADE DECLARADA</small><b><?=(int)$r['idade_declarada']?> anos</b><span><?=date('d/m/Y',strtotime((string)$r['data_nascimento']))?></span></p><p><small>SINAIS</small><b>Risco <?=(int)$r['risco_conta']?></b><span>E-mail: <?=!empty($r['email_verificado_em'])?'confirmado':'pendente'?></span></p></div><p class="admin-report-text">Alertas: <?=esc($assurance['flags']?implode(', ',$assurance['flags']):'nenhum alerta automático')?></p>
<?php if($r['status_idade']==='adult_declared'):?><form method="post" class="admin-review-form"><?=camposCsrf()?><input type="hidden" name="user_id" value="<?=(int)$r['usuario_id']?>"><textarea name="notes" rows="3" placeholder="Como a revisão foi realizada e qual foi a conclusão" required></textarea><div class="admin-action-row"><button class="admin-primary" name="decision" value="approve">Confirmar após revisão</button><button class="admin-danger" name="decision" value="block">Bloquear por inconsistência</button></div></form><?php endif;?></article><?php endforeach;?></div>
</main></div><script src="<?=SITE_URL?>/assets/js/admin.js?v=14.1"></script><?php require __DIR__.'/../includes/footer.php';?>
