<?php
/**
 * AURA FARMING — Revisão interna de responsáveis sem serviços terceiros.
 * Nenhuma cópia de documento, selfie, biometria, áudio ou vídeo é armazenada.
 * Para aprovar, o documento original deve ser apenas conferido ao vivo ou presencialmente.
 */
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();

$adminId=afAdminId();
if($_SERVER['REQUEST_METHOD']==='POST'){
    try{
        if(!validarCsrfToken($_POST[CSRF_TOKEN_NAME]??''))throw new RuntimeException('Sessão expirada. Recarregue a página.');
        $reviewId=(int)($_POST['review_id']??0);
        $decision=(string)($_POST['decision']??'');
        $notes=trim((string)($_POST['notes']??''));
        if($reviewId<=0)throw new RuntimeException('Revisão inválida.');
        if(in_array($decision,['reject','needs_info'],true)&&mb_strlen($notes)<10){
            throw new RuntimeException('Informe uma justificativa com pelo menos 10 caracteres.');
        }
        $reviewData=[
            'review_method'=>(string)($_POST['review_method']??''),
            'document_number'=>(string)($_POST['document_number']??''),
        ];
        foreach(array_keys(afGuardianReviewChecklistKeys()) as $key)$reviewData[$key]=!empty($_POST[$key]);
        $status=afGuardianAdminReviewDecision($pdo,$reviewId,$adminId,$decision,$notes,$reviewData);
        afAdminLog($pdo,'guardian_internal_review_'.$decision,'guardian_manual_review',$reviewId,[
            'guardian_user_id'=>(int)($status['row']['usuario_id']??0),
            'notes'=>$notes,
        ]);
        setFlash('success',$decision==='approve'?'Responsável aprovado por revisão interna.':($decision==='reject'?'Verificação rejeitada.':'Informações adicionais solicitadas.'));
    }catch(Throwable $e){setFlash('error',$e->getMessage());}
    $returnStatus=(string)($_POST['return_status']??'pending');
    header('Location: '.SITE_URL.'/pages/admin-verificacoes-responsaveis.php?status='.urlencode($returnStatus));exit;
}

$status=(string)($_GET['status']??'pending');
$allowed=['pending','needs_info','approved','rejected','expired','all'];
if(!in_array($status,$allowed,true))$status='pending';
$reviews=afGuardianAdminReviewList($pdo,$status,200);
$counts=[];
if(afGuardianTableExists($pdo,'af_guardian_manual_reviews')){
    try{
        foreach($pdo->query("SELECT status,COUNT(*) total FROM af_guardian_manual_reviews GROUP BY status")->fetchAll()?:[] as $row){
            $counts[(string)$row['status']]=(int)$row['total'];
        }
    }catch(Throwable $e){}
}
$reviewMethods=afGuardianReviewMethods();
$reviewChecklist=afGuardianReviewChecklistKeys();
$flagLabels=[
    'declaration_missing'=>'Declaração ou data não confirmada',
    'email_not_verified'=>'E-mail não confirmado',
    'family_code_not_confirmed'=>'Código familiar não confirmado',
    'many_dependents'=>'Quantidade elevada de dependentes',
    'new_guardian_account'=>'Conta adulta criada há menos de 24 horas',
    'repeated_family_code_errors'=>'Erros repetidos no código familiar',
    'device_used_by_multiple_guardians'=>'Dispositivo usado por múltiplos responsáveis',
    'same_device_as_minor_invitation'=>'Mesmo dispositivo usado no convite do menor',
    'same_ip_as_minor_invitation'=>'Mesmo IP usado no convite do menor',
];
$pageTitle='Admin • Verificação de responsáveis';$showNav=false;$bodyClass='admin-body';$adminPage='responsaveis';
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>SEGURANÇA DE MENORES</small><h1>Verificação de responsáveis</h1></div><span class="admin-count"><?=count($reviews)?> registros</span></header>
<?=renderFlash()?>
<div class="admin-warning"><b>Revisão humana obrigatória.</b> A aprovação só pode ocorrer após conferência presencial ou ao vivo, sem gravação. O documento original e a prova de responsabilidade devem ser apenas visualizados. O número digitado é transformado em HMAC e descartado; nenhuma foto, vídeo, áudio ou cópia documental fica armazenada.</div>

<nav class="admin-tabs">
<?php foreach(['pending'=>'Pendentes','needs_info'=>'Pediram informação','approved'=>'Aprovados','rejected'=>'Rejeitados','expired'=>'Expirados','all'=>'Todos'] as $key=>$label):?>
<a class="<?=$status===$key?'active':''?>" href="<?=SITE_URL?>/pages/admin-verificacoes-responsaveis.php?status=<?=$key?>"><?=esc($label)?><?php if($key!=='all'):?> <span><?=($counts[$key]??0)?></span><?php endif?></a>
<?php endforeach?>
</nav>

<section class="admin-panel">
<header><div><small>FILA INTERNA</small><h2><?=esc(['pending'=>'Aguardando análise','needs_info'=>'Informações adicionais','approved'=>'Aprovados','rejected'=>'Rejeitados','expired'=>'Validade expirada','all'=>'Todas as revisões'][$status])?></h2></div></header>
<?php if(!$reviews):?><div class="admin-empty"><span>✓</span><b>Nenhuma revisão nesta situação</b><p>Os novos pedidos aparecerão aqui.</p></div><?php endif?>
<div class="admin-cards-list">
<?php foreach($reviews as $review):
    $flags=json_decode((string)($review['risk_flags_json']??'[]'),true);if(!is_array($flags))$flags=[];
    $score=(int)($review['risk_score']??0);
    $statusLabel=['pending'=>'PENDENTE','needs_info'=>'INFORMAÇÃO','approved'=>'APROVADO','rejected'=>'REJEITADO','expired'=>'EXPIRADO','cancelled'=>'CANCELADO'][(string)$review['status']]??strtoupper((string)$review['status']);
?>
<article class="admin-report-card guardian-review-card">
<header>
<div><span class="admin-pill status-<?=esc((string)$review['status'])?>"><?=esc($statusLabel)?></span><b><?=esc((string)$review['nome'])?></b><small><?=esc((string)$review['email'])?> • <?=esc((string)$review['aura_id'])?></small></div>
<div class="admin-report-priority"><small>RISCO INTERNO</small><strong><?=$score?></strong></div>
</header>
<div class="admin-report-grid">
<div><small>IDADE DECLARADA</small><b><?=(int)($review['idade_declarada']??0)?> anos</b><span><?=!empty($review['data_nascimento'])?date('d/m/Y',strtotime((string)$review['data_nascimento'])):'sem data'?></span></div>
<div><small>CONTA CRIADA</small><b><?=!empty($review['data_cadastro'])?date('d/m/Y',strtotime((string)$review['data_cadastro'])):'—'?></b><span><?=!empty($review['submitted_at'])?'enviado em '.date('d/m/Y H:i',strtotime((string)$review['submitted_at'])):'—'?></span></div>
<div><small>DEPENDENTES</small><b><?=(int)$review['confirmed_count']?> confirmados</b><span><?=(int)$review['dependent_count']?> vínculos no total</span></div>
<div><small>VALIDADE</small><b><?=!empty($review['valid_until'])?date('d/m/Y',strtotime((string)$review['valid_until'])):'—'?></b><span><?=!empty($review['reviewed_at'])?'revisado em '.date('d/m/Y H:i',strtotime((string)$review['reviewed_at'])):'ainda não revisado'?></span></div>
</div>
<div class="admin-report-description"><b>Sinais automáticos</b>
<?php if(!$flags):?><p>Nenhum sinal adicional detectado. Isso não substitui a avaliação humana.</p>
<?php else:?><ul><?php foreach($flags as $flag):?><li><?=esc($flagLabels[(string)$flag]??(string)$flag)?></li><?php endforeach?></ul><?php endif?>
</div>
<?php if(!empty($review['review_method'])||!empty($review['review_protocol'])):?><div class="admin-report-description"><b>Conferência registrada</b><p><?=esc($reviewMethods[(string)$review['review_method']]??(string)$review['review_method'])?><?=!empty($review['review_protocol'])?' • protocolo '.esc((string)$review['review_protocol']):''?></p></div><?php endif?>
<?php if(!empty($review['reviewer_notes'])):?><div class="admin-report-description"><b>Observação da revisão anterior</b><p><?=nl2br(esc((string)$review['reviewer_notes']))?></p></div><?php endif?>
<?php if(in_array((string)$review['status'],['pending','needs_info'],true)):?>
<form method="post" class="admin-form guardian-review-form" autocomplete="off">
<?=camposCsrf()?><input type="hidden" name="review_id" value="<?=(int)$review['id']?>"><input type="hidden" name="return_status" value="<?=esc($status)?>">
<div class="admin-config-grid">
<label><span>Método da conferência</span><select name="review_method"><option value="">Selecione para aprovar</option><?php foreach($reviewMethods as $methodKey=>$methodLabel):?><option value="<?=esc($methodKey)?>"><?=esc($methodLabel)?></option><?php endforeach?></select></label>
<label><span>Número do documento — não será armazenado</span><input type="password" name="document_number" maxlength="40" autocomplete="new-password" placeholder="Usado somente para gerar uma impressão HMAC"></label>
</div>
<div class="admin-report-description"><b>Checklist obrigatório para aprovação</b><p>Faça a conferência com o adulto presente. Não fotografe, não grave e não anexe documentos.</p><div class="guardian-review-checklist"><?php foreach($reviewChecklist as $checkKey=>$checkLabel):?><label class="legal-confirm-check"><input type="checkbox" name="<?=esc($checkKey)?>" value="1"><span><?=esc($checkLabel)?></span></label><?php endforeach?></div></div>
<label><span>Observação da decisão</span><textarea name="notes" rows="4" maxlength="2000" placeholder="Para aprovar, registre método, conferência realizada e conclusão (mínimo 20 caracteres). Para rejeitar ou pedir informação, mínimo 10 caracteres."></textarea></label>
<div class="verification-info">Ao aprovar, o número do documento existe apenas durante esta requisição. O banco recebe somente uma impressão HMAC não reversível para impedir reutilização em outra conta.</div>
<div class="admin-inline-actions">
<button class="admin-primary" type="submit" name="decision" value="approve" onclick="return confirm('Você realizou a conferência presencial ou ao vivo, sem retenção de cópia, e confirma a aprovação?')">APROVAR COM CHECKLIST</button>
<button class="admin-muted" type="submit" name="decision" value="needs_info">PEDIR INFORMAÇÃO</button>
<button class="admin-danger" type="submit" name="decision" value="reject" onclick="return confirm('Rejeitar esta verificação e manter os menores bloqueados?')">REJEITAR</button>
</div>
</form>
<?php endif?>
</article>
<?php endforeach?>
</div>
</section>
</main></div>
<script src="<?=SITE_URL?>/assets/js/admin.js?v=22.1"></script>
<?php require __DIR__.'/../includes/footer.php';?>
