<?php
declare(strict_types=1);

require_once __DIR__ . '/permissoes_ti.php';
require_once __DIR__ . '/central_ativos/ativos_helpers.php';

function invE(mixed $valor): string { return htmlspecialchars((string)$valor, ENT_QUOTES, 'UTF-8'); }
function invTexto(mixed $valor, int $limite=255): string {
    $texto=trim((string)$valor);$texto=preg_replace('/\s+/u',' ',$texto)??$texto;
    return function_exists('mb_substr')?mb_substr($texto,0,$limite,'UTF-8'):substr($texto,0,$limite);
}
function invNulo(mixed $valor,int $limite=255):?string{$v=invTexto($valor,$limite);return $v===''?null:$v;}
function invCsrf():string{if(empty($_SESSION['csrf_inventario_geral']))$_SESSION['csrf_inventario_geral']=bin2hex(random_bytes(24));return (string)$_SESSION['csrf_inventario_geral'];}
function invValidarCsrf():void{$r=(string)($_POST['csrf_token']??'');$e=(string)($_SESSION['csrf_inventario_geral']??'');if($r===''||$e===''||!hash_equals($e,$r))throw new RuntimeException('A sessão do formulário expirou. Atualize a página.');}
function invFlash(string $tipo,string $mensagem):void{$_SESSION['inv_flash']=['tipo'=>$tipo,'mensagem'=>$mensagem];}
function invConsumirFlash():?array{$f=$_SESSION['inv_flash']??null;unset($_SESSION['inv_flash']);return is_array($f)?$f:null;}
function invRedirecionar(string $url):never{header('Location: '.$url);exit;}
function invTabelaExiste(mysqli $mysqli,string $tabela):bool{$n=$mysqli->real_escape_string($tabela);$r=$mysqli->query("SHOW TABLES LIKE '{$n}'");return $r instanceof mysqli_result&&$r->num_rows>0;}

function invConfig(mysqli $mysqli):array{
    $padrao=['total_estimado_ativos'=>1500,'percentual_minimo_inicio'=>50.0,'validade_conferencia_dias'=>365];
    if(!invTabelaExiste($mysqli,'ti_inventario_config'))return $padrao;
    $r=$mysqli->query('SELECT * FROM ti_inventario_config WHERE id=1 LIMIT 1');
    return $r?array_merge($padrao,$r->fetch_assoc()?:[]):$padrao;
}

function invProntidao(mysqli $mysqli):array{
    $cfg=invConfig($mysqli);$cadastrados=0;
    if(invTabelaExiste($mysqli,'ti_ativos')){$r=$mysqli->query("SELECT COUNT(*) total FROM ti_ativos WHERE tipo_ativo IN ('COMPUTADOR','IMPRESSORA','SMARTPHONE','CHIP')");if($r)$cadastrados=(int)($r->fetch_assoc()['total']??0);}
    $estimado=max(1,(int)$cfg['total_estimado_ativos']);$minimo=(float)$cfg['percentual_minimo_inicio'];
    $percentual=min(100,round(($cadastrados/$estimado)*100,2));$necessario=(int)ceil(($estimado*$minimo)/100);$faltam=max(0,$necessario-$cadastrados);
    return ['cadastrados'=>$cadastrados,'estimado'=>$estimado,'percentual'=>$percentual,'minimo'=>$minimo,'necessario'=>$necessario,'faltam'=>$faltam,'liberado'=>$percentual>=$minimo];
}

function invAtivos(mysqli $mysqli):array{
    if(!invTabelaExiste($mysqli,'ti_ativos'))return [];
    $total=0;$r=$mysqli->query('SELECT COUNT(*) total FROM ti_ativos');if($r)$total=(int)($r->fetch_assoc()['total']??0);
    if($total===0){try{atiSincronizarTodos($mysqli);}catch(Throwable){}}
    return atiListarResumos($mysqli,['COMPUTADOR','IMPRESSORA','SMARTPHONE','CHIP']);
}

function invCodigoCampanha(int $id):string{return 'INV-'.date('Y').'-'.str_pad((string)$id,6,'0',STR_PAD_LEFT);}

function invResumoCampanha(mysqli $mysqli,int $id):array{
    $stmt=$mysqli->prepare("SELECT COUNT(*) total,SUM(resultado='PENDENTE') pendentes,SUM(resultado='CORRETO') corretos,SUM(resultado IN ('LOCAL_DIVERGENTE','RESPONSAVEL_DIVERGENTE')) divergentes,SUM(resultado='DANIFICADO') danificados,SUM(resultado='NAO_LOCALIZADO') nao_localizados,SUM(resultado='FORA_LISTA') fora_lista,SUM(regularizado=1) regularizados FROM ti_inventario_itens WHERE campanha_id=?");
    $stmt->bind_param('i',$id);$stmt->execute();$r=$stmt->get_result()->fetch_assoc()?:[];$stmt->close();
    foreach(['total','pendentes','corretos','divergentes','danificados','nao_localizados','fora_lista','regularizados'] as $k)$r[$k]=(int)($r[$k]??0);
    $r['conferidos']=$r['total']-$r['pendentes'];$r['percentual']=$r['total']>0?(int)round(($r['conferidos']/$r['total'])*100):0;
    return $r;
}

function invCampanha(mysqli $mysqli,int $id):?array{$stmt=$mysqli->prepare('SELECT * FROM ti_inventario_campanhas WHERE id=? LIMIT 1');$stmt->bind_param('i',$id);$stmt->execute();$r=$stmt->get_result()->fetch_assoc();$stmt->close();return $r?:null;}
function invItem(mysqli $mysqli,int $id):?array{$stmt=$mysqli->prepare('SELECT i.*,a.codigo_ativo,a.tipo_ativo FROM ti_inventario_itens i JOIN ti_ativos a ON a.id=i.ativo_id WHERE i.id=? LIMIT 1');$stmt->bind_param('i',$id);$stmt->execute();$r=$stmt->get_result()->fetch_assoc();$stmt->close();return $r?:null;}

function invRegistrarEvento(mysqli $mysqli,int $campanhaId,?int $itemId,string $tipo,string $titulo,?string $detalhes=null):void{
    $usuario=tiPermUsuario()?:'Sistema';$item=$itemId??0;$stmt=$mysqli->prepare('INSERT INTO ti_inventario_eventos(campanha_id,item_id,tipo_evento,titulo,detalhes,usuario) VALUES(?,NULLIF(?,0),?,?,?,?)');if(!$stmt)return;$stmt->bind_param('iissss',$campanhaId,$item,$tipo,$titulo,$detalhes,$usuario);$stmt->execute();$stmt->close();
}

function invResultadoRotulo(string $r):string{return match($r){'PENDENTE'=>'Pendente','CORRETO'=>'Localizado e correto','LOCAL_DIVERGENTE'=>'Local divergente','RESPONSAVEL_DIVERGENTE'=>'Responsável divergente','DANIFICADO'=>'Localizado com dano','NAO_LOCALIZADO'=>'Não localizado','FORA_LISTA'=>'Encontrado fora da lista',default=>str_replace('_',' ',$r)};}
function invResultadoClasse(string $r):string{return match($r){'CORRETO'=>'b-green','PENDENTE'=>'b-muted','LOCAL_DIVERGENTE','RESPONSAVEL_DIVERGENTE'=>'b-orange','DANIFICADO','NAO_LOCALIZADO'=>'b-red','FORA_LISTA'=>'b-purple',default=>'b-blue'};}
function invTipoIcone(string $t):string{return match($t){'COMPUTADOR'=>'bi-pc-display','IMPRESSORA'=>'bi-printer-fill','SMARTPHONE'=>'bi-phone-fill','CHIP'=>'bi-sim-fill',default=>'bi-box-seam-fill'};}

function invFiltrarAtivos(array $ativos,array $f):array{
    return array_values(array_filter($ativos,static function(array $a)use($f):bool{
        if(($f['tipo']??'')!==''&&$a['tipo_ativo']!==$f['tipo'])return false;
        foreach(['secretaria','setor','predio','ambiente'] as $campo){$valor=tiPermNormalizar((string)($f[$campo]??''));if($valor==='')continue;$orig=tiPermNormalizar((string)($a[$campo]??''));if(!str_contains($orig,$valor))return false;}
        return true;
    }));
}

function invBuscar(mysqli $mysqli,int $campanhaId,string $busca):array{
    $normal=tiPermNormalizar($busca);if($normal==='')return ['itens'=>[],'externos'=>[]];
    $like='%'.$busca.'%';$itens=[];
    $stmt=$mysqli->prepare("SELECT i.*,a.codigo_ativo FROM ti_inventario_itens i JOIN ti_ativos a ON a.id=i.ativo_id WHERE i.campanha_id=? AND (a.codigo_ativo LIKE ? OR i.codigo_ativo_snapshot LIKE ? OR i.patrimonio_snapshot LIKE ? OR i.serie_snapshot LIKE ? OR i.identificador_snapshot LIKE ? OR i.nome_snapshot LIKE ? OR i.responsavel_esperado LIKE ? OR i.setor_esperado LIKE ?) ORDER BY (UPPER(REPLACE(a.codigo_ativo,'-',''))=UPPER(?)) DESC,i.resultado='PENDENTE' DESC,i.id LIMIT 100");
    $stmt->bind_param('isssssssss',$campanhaId,$like,$like,$like,$like,$like,$like,$like,$like,$normal);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc())$itens[]=$l;$stmt->close();
    $externos=[];$ids=array_map(static fn($i)=>(int)$i['ativo_id'],$itens);
    foreach(invAtivos($mysqli) as $a){$texto=implode(' ',[$a['codigo_ativo'],$a['patrimonio'],$a['serie'],$a['identificador'],$a['nome'],$a['responsavel'],$a['setor']]);if(!str_contains(tiPermNormalizar($texto),$normal))continue;if(in_array((int)$a['id'],$ids,true))continue;$check=$mysqli->prepare('SELECT id FROM ti_inventario_itens WHERE campanha_id=? AND ativo_id=? LIMIT 1');$aid=(int)$a['id'];$check->bind_param('ii',$campanhaId,$aid);$check->execute();$ja=$check->get_result()->fetch_assoc();$check->close();if(!$ja)$externos[]=$a;if(count($externos)>=20)break;}
    return ['itens'=>$itens,'externos'=>$externos];
}
