<?php
declare(strict_types=1);
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/conexao.php';
require_once __DIR__ . '/computadores_helpers.php';

date_default_timezone_set('America/Sao_Paulo');
if (compEhCynthia()) { compRedirecionar('dashboard_cynthia.php?acesso_restrito=1'); }
if (!$mysqli instanceof mysqli) { http_response_code(500); exit('Conexão com o banco indisponível.'); }
$mysqli->set_charset('utf8mb4');
compGarantirEstrutura($mysqli);
$csrf=compCsrf();
$usuario=compUsuarioAtual()?:'Técnico autenticado';

function pcStatusValido(string $status): string
{
    $status=strtoupper(trim($status));
    $permitidos=['CADASTRO_INICIAL','DISPONIVEL','EM_USO','MANUTENCAO','RESERVA','EXTRAVIADO','AGUARDANDO_BAIXA','BAIXADO'];
    return in_array($status,$permitidos,true)?$status:'CADASTRO_INICIAL';
}

function pcCondicaoValida(string $condicao): string
{
    $condicao=strtoupper(trim($condicao));
    return in_array($condicao,['NAO_AVALIADO','NOVO','BOM','REGULAR','DANIFICADO'],true)?$condicao:'NAO_AVALIADO';
}

function pcTipoValido(string $tipo): string
{
    $tipo=strtoupper(trim($tipo));
    return in_array($tipo,['DESKTOP','NOTEBOOK','ALL_IN_ONE','MINI_PC','WORKSTATION','THIN_CLIENT'],true)?$tipo:'DESKTOP';
}

function pcSalvarRegistro(mysqli $mysqli, array $dados, int $id=0): int
{
    $campos=array_keys($dados);
    $tipos='';$valores=[];
    foreach($dados as $campo=>$valor){
        $tipos.=in_array($campo,['setor_id','ambiente_id'],true)?'i':'s';
        $valores[]=$valor;
    }
    if($id>0){
        $partes=array_map(static fn($campo)=>$campo.' = ?', $campos);
        $sql='UPDATE ti_computadores SET '.implode(', ',$partes).' WHERE id = ?';
        $tipos.='i';$valores[]=$id;
    }else{
        $sql='INSERT INTO ti_computadores ('.implode(',',$campos).') VALUES ('.implode(',',array_fill(0,count($campos),'?')).')';
    }
    $stmt=$mysqli->prepare($sql);
    if(!$stmt) throw new RuntimeException('Não foi possível preparar o cadastro: '.$mysqli->error);
    compBind($stmt,$tipos,$valores);
    if(!$stmt->execute()){ $erro=$stmt->error;$stmt->close();throw new RuntimeException('Não foi possível salvar o equipamento: '.$erro); }
    $novoId=$id>0?$id:(int)$stmt->insert_id;$stmt->close();return $novoId;
}

if(isset($_GET['export']) && $_GET['export']==='csv'){
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="computadores_'.date('Y-m-d_H-i').'.csv"');
    echo "\xEF\xBB\xBF";$arq=fopen('php://output','wb');
    fputcsv($arq,['Código','Tipo','Patrimônio','Série','Nome da máquina','Fabricante','Modelo','Processador','RAM GB','Armazenamento','Sistema','Status','Condição','Responsável','Matrícula','Cargo','Setor','Prédio','Andar','Ambiente','Posição','Entrega','Atualizado por','Atualizado em'],';');
    $res=$mysqli->query("SELECT c.*,s.nome setor_nome,s.predio,s.andar,a.nome ambiente_nome FROM ti_computadores c LEFT JOIN ti_setores s ON s.id=c.setor_id LEFT JOIN ti_ambientes a ON a.id=c.ambiente_id ORDER BY c.id DESC");
    while($res && $r=$res->fetch_assoc()){
        fputcsv($arq,[$r['codigo_interno'],$r['tipo'],$r['patrimonio'],$r['numero_serie'],$r['nome_maquina'],$r['fabricante'],$r['modelo'],$r['processador'],$r['memoria_ram_gb'],trim(($r['armazenamento_tipo']??'').' '.($r['armazenamento_gb']??'').' GB'),$r['sistema_operacional'],$r['status'],$r['condicao'],$r['responsavel_nome'],$r['responsavel_matricula'],$r['responsavel_cargo'],$r['setor_nome'],$r['predio'],$r['andar'],$r['ambiente_nome'],$r['localizacao_texto'],$r['data_entrega'],$r['atualizado_por'],$r['atualizado_em']],';');
    }
    fclose($arq);exit;
}

if($_SERVER['REQUEST_METHOD']==='POST'){
    try{
        compValidarCsrf();
        $acao=compTexto($_POST['acao']??'',40);
        if($acao==='salvar'){
            $id=(int)($_POST['id']??0);
            $antigo=$id>0?compCarregarComputador($mysqli,$id,true):null;
            if($id>0 && !$antigo) throw new RuntimeException('Equipamento não encontrado.');
            $tipo=pcTipoValido((string)($_POST['tipo']??''));
            $patrimonio=compNulo($_POST['patrimonio']??'',50);
            $serie=compNulo($_POST['numero_serie']??'',100);
            $hostname=compNulo($_POST['nome_maquina']??'',100);
            if($patrimonio===null && $serie===null && $hostname===null) throw new RuntimeException('Informe ao menos patrimônio, número de série ou nome da máquina.');
            $fabricante=compTexto($_POST['fabricante']??'',100);$modelo=compTexto($_POST['modelo']??'',150);
            if($fabricante===''||$modelo==='') throw new RuntimeException('Informe fabricante e modelo.');
            $responsavel=compNulo($_POST['responsavel_nome']??'',150);$setorNome=compTexto($_POST['setor_nome']??'',150);
            if($setorNome==='') throw new RuntimeException('Informe o setor físico do equipamento.');
            $matricula=compNulo($_POST['responsavel_matricula']??'',50);$cargo=compNulo($_POST['responsavel_cargo']??'',120);
            $secretaria=compNulo($_POST['secretaria']??'',150);$predio=compNulo($_POST['predio']??'',150);$andar=compNulo($_POST['andar']??'',80);
            $ambienteNome=compNulo($_POST['ambiente_nome']??'',150);$local=compNulo($_POST['localizacao_texto']??'',180);
            $setorId=compObterOuCriarSetor($mysqli,$setorNome,$secretaria,$predio,$andar);$ambienteId=compObterOuCriarAmbiente($mysqli,$setorId,$ambienteNome);
            $status=pcStatusValido((string)($_POST['status']??''));
            if($responsavel!==null && in_array($status,['CADASTRO_INICIAL','DISPONIVEL','EM_USO'],true))$status='EM_USO';
            if($responsavel===null && $status==='EM_USO')$status='DISPONIVEL';
            $condicao=pcCondicaoValida((string)($_POST['condicao']??''));
            $ram=compNulo($_POST['memoria_ram_gb']??'',20);$storageGb=compNulo($_POST['armazenamento_gb']??'',20);
            $agora=date('Y-m-d H:i:s');
            $dataEntrega=$responsavel!==null?($antigo['data_entrega']??$agora):null;
            $dados=[
                'tipo'=>$tipo,'patrimonio'=>$patrimonio,'numero_serie'=>$serie,'nome_maquina'=>$hostname,
                'fabricante'=>$fabricante,'modelo'=>$modelo,'processador'=>compNulo($_POST['processador']??'',180),
                'memoria_ram_gb'=>$ram,'armazenamento_tipo'=>compNulo($_POST['armazenamento_tipo']??'',30),
                'armazenamento_gb'=>$storageGb,'sistema_operacional'=>compNulo($_POST['sistema_operacional']??'',120),
                'arquitetura'=>compNulo($_POST['arquitetura']??'',20),'mac_rede'=>compNulo($_POST['mac_rede']??'',30),
                'mac_wifi'=>compNulo($_POST['mac_wifi']??'',30),'ip_fixo'=>compNulo($_POST['ip_fixo']??'',45),
                'dominio'=>compNulo($_POST['dominio']??'',120),'data_aquisicao'=>compNulo($_POST['data_aquisicao']??'',10),
                'garantia_ate'=>compNulo($_POST['garantia_ate']??'',10),'condicao'=>$condicao,'status'=>$status,
                'responsavel_nome'=>$responsavel,'responsavel_matricula'=>$matricula,'responsavel_cargo'=>$cargo,
                'setor_id'=>$setorId,'ambiente_id'=>$ambienteId,'localizacao_texto'=>$local,
                'acessorios'=>compNulo($_POST['acessorios']??'',4000),'observacoes'=>compNulo($_POST['observacoes']??'',6000),
                'data_entrega'=>$dataEntrega,'data_devolucao'=>$responsavel===null && !empty($antigo['responsavel_nome'])?$agora:($antigo['data_devolucao']??null),
                'tecnico_ultima_entrega'=>$responsavel!==null?$usuario:($antigo['tecnico_ultima_entrega']??null),
                'atualizado_por'=>$usuario
            ];
            if($id===0){$dados=['codigo_interno'=>compCodigo('PC')]+$dados+['criado_por'=>$usuario];}
            $mysqli->begin_transaction();
            $id=pcSalvarRegistro($mysqli,$dados,$id);
            $novo=compCarregarComputador($mysqli,$id,false);
            if(!$novo) throw new RuntimeException('Não foi possível reler o equipamento salvo.');
            $mudouResponsavel=compNormalizar((string)($antigo['responsavel_nome']??''))!==compNormalizar((string)($novo['responsavel_nome']??''));
            $mudouLocal=(int)($antigo['setor_id']??0)!==(int)($novo['setor_id']??0)||(int)($antigo['ambiente_id']??0)!==(int)($novo['ambiente_id']??0);
            $acaoMov=$id && !$antigo?'CADASTRADO':($mudouResponsavel?(!empty($antigo['responsavel_nome'])?'TRANSFERIDO':'ENTREGUE'):($mudouLocal?'LOCALIZACAO_ALTERADA':'CADASTRO_ATUALIZADO'));
            $movId=compRegistrarMovimentacao($mysqli,$id,$acaoMov,$antigo['status']??null,$novo['status'],$antigo['responsavel_nome']??null,$novo['responsavel_nome'],$antigo['setor_nome']??null,$novo['setor_nome'],$antigo['ambiente_nome']??null,$novo['ambiente_nome'],compNulo($_POST['motivo']??'',500));
            $termoId=null;
            if(!empty($_POST['gerar_termo']) && !empty($novo['responsavel_nome']))$termoId=compCriarTermo($mysqli,$novo,$movId,$mudouResponsavel?'TRANSFERENCIA':'REGULARIZACAO');
            $mysqli->commit();
            if($termoId) compRedirecionar('termo_responsabilidade_computador.php?termo_id='.$termoId.'&print=1');
            compFlash('sucesso',$antigo?'Equipamento atualizado com histórico preservado.':'Equipamento cadastrado com sucesso.');compRedirecionar('computadores.php');
        }
        if($acao==='transferir'){
            $id=(int)($_POST['id']??0);$responsavel=compTexto($_POST['responsavel_nome']??'',150);$setorNome=compTexto($_POST['setor_nome']??'',150);
            if($id<=0||$responsavel===''||$setorNome==='')throw new RuntimeException('Informe o equipamento, a pessoa e o setor.');
            $mysqli->begin_transaction();$antigo=compCarregarComputador($mysqli,$id,true);if(!$antigo)throw new RuntimeException('Equipamento não encontrado.');
            $setorId=compObterOuCriarSetor($mysqli,$setorNome,compNulo($_POST['secretaria']??'',150),compNulo($_POST['predio']??'',150),compNulo($_POST['andar']??'',80));
            $ambienteId=compObterOuCriarAmbiente($mysqli,$setorId,compNulo($_POST['ambiente_nome']??'',150));
            $matricula=compNulo($_POST['responsavel_matricula']??'',50);$cargo=compNulo($_POST['responsavel_cargo']??'',120);$local=compNulo($_POST['localizacao_texto']??'',180);$acessorios=compNulo($_POST['acessorios']??'',4000);$condicao=pcCondicaoValida((string)($_POST['condicao']??$antigo['condicao']));
            $stmt=$mysqli->prepare("UPDATE ti_computadores SET responsavel_nome=?,responsavel_matricula=?,responsavel_cargo=?,setor_id=?,ambiente_id=?,localizacao_texto=?,acessorios=?,condicao=?,status='EM_USO',data_entrega=NOW(),data_devolucao=NULL,tecnico_ultima_entrega=?,atualizado_por=? WHERE id=?");
            $stmt->bind_param('sssiisssssi',$responsavel,$matricula,$cargo,$setorId,$ambienteId,$local,$acessorios,$condicao,$usuario,$usuario,$id);
            if(!$stmt->execute()){ $erro=$stmt->error;$stmt->close();throw new RuntimeException('Não foi possível transferir: '.$erro);}$stmt->close();
            $novo=compCarregarComputador($mysqli,$id,false);$movId=compRegistrarMovimentacao($mysqli,$id,!empty($antigo['responsavel_nome'])?'TRANSFERIDO':'ENTREGUE',$antigo['status'],'EM_USO',$antigo['responsavel_nome'],$responsavel,$antigo['setor_nome'],$novo['setor_nome'],$antigo['ambiente_nome'],$novo['ambiente_nome'],compNulo($_POST['motivo']??'',500));
            $termoId=compCriarTermo($mysqli,$novo,$movId,!empty($antigo['responsavel_nome'])?'TRANSFERENCIA':'ENTREGA');$mysqli->commit();compRedirecionar('termo_responsabilidade_computador.php?termo_id='.$termoId.'&print=1');
        }
        if($acao==='devolver'){
            $id=(int)($_POST['id']??0);$mysqli->begin_transaction();$antigo=compCarregarComputador($mysqli,$id,true);if(!$antigo)throw new RuntimeException('Equipamento não encontrado.');
            $stmt=$mysqli->prepare("UPDATE ti_computadores SET responsavel_nome=NULL,responsavel_matricula=NULL,responsavel_cargo=NULL,status='DISPONIVEL',data_devolucao=NOW(),atualizado_por=? WHERE id=?");$stmt->bind_param('si',$usuario,$id);$stmt->execute();$stmt->close();
            compRegistrarMovimentacao($mysqli,$id,'DEVOLVIDO',$antigo['status'],'DISPONIVEL',$antigo['responsavel_nome'],null,$antigo['setor_nome'],$antigo['setor_nome'],$antigo['ambiente_nome'],$antigo['ambiente_nome'],compNulo($_POST['motivo']??'',500));$mysqli->commit();compFlash('sucesso','Devolução registrada. O equipamento ficou disponível no local atual.');compRedirecionar('computadores.php');
        }
        if($acao==='status'){
            $id=(int)($_POST['id']??0);$novoStatus=pcStatusValido((string)($_POST['novo_status']??''));$mysqli->begin_transaction();$antigo=compCarregarComputador($mysqli,$id,true);if(!$antigo)throw new RuntimeException('Equipamento não encontrado.');
            $stmt=$mysqli->prepare("UPDATE ti_computadores SET status=?,atualizado_por=? WHERE id=?");$stmt->bind_param('ssi',$novoStatus,$usuario,$id);$stmt->execute();$stmt->close();compRegistrarMovimentacao($mysqli,$id,'STATUS_ALTERADO',$antigo['status'],$novoStatus,$antigo['responsavel_nome'],$antigo['responsavel_nome'],$antigo['setor_nome'],$antigo['setor_nome'],$antigo['ambiente_nome'],$antigo['ambiente_nome'],compNulo($_POST['motivo']??'',500));$mysqli->commit();compFlash('sucesso','Situação atualizada.');compRedirecionar('computadores.php');
        }
        if($acao==='gerar_termo'){
            $id=(int)($_POST['id']??0);$computador=compCarregarComputador($mysqli,$id,false);if(!$computador)throw new RuntimeException('Equipamento não encontrado.');$termoId=compCriarTermo($mysqli,$computador,null,'REGULARIZACAO');compRedirecionar('termo_responsabilidade_computador.php?termo_id='.$termoId.'&print=1');
        }
        throw new RuntimeException('Ação inválida.');
    }catch(Throwable $e){try{$mysqli->rollback();}catch(Throwable){}compFlash('erro',$e->getMessage());compRedirecionar('computadores.php');}
}

$busca=trim((string)($_GET['buscar']??''));$statusFiltro=trim((string)($_GET['status']??''));$tipoFiltro=trim((string)($_GET['tipo']??''));$setorFiltro=(int)($_GET['setor_id']??0);$pagina=max(1,(int)($_GET['pagina']??1));$porPagina=50;$offset=($pagina-1)*$porPagina;
$where=[];$tipos='';$params=[];
if($busca!==''){$like='%'.$busca.'%';$where[]="(c.codigo_interno LIKE ? OR c.patrimonio LIKE ? OR c.numero_serie LIKE ? OR c.nome_maquina LIKE ? OR c.fabricante LIKE ? OR c.modelo LIKE ? OR c.responsavel_nome LIKE ? OR s.nome LIKE ? OR a.nome LIKE ?)";$tipos.='sssssssss';for($i=0;$i<9;$i++)$params[]=$like;}
if($statusFiltro!==''){$where[]='c.status = ?';$tipos.='s';$params[]=$statusFiltro;}
if($tipoFiltro!==''){$where[]='c.tipo = ?';$tipos.='s';$params[]=$tipoFiltro;}
if($setorFiltro>0){$where[]='c.setor_id = ?';$tipos.='i';$params[]=$setorFiltro;}
$whereSql=$where?'WHERE '.implode(' AND ',$where):'';
$countSql="SELECT COUNT(*) total FROM ti_computadores c LEFT JOIN ti_setores s ON s.id=c.setor_id LEFT JOIN ti_ambientes a ON a.id=c.ambiente_id $whereSql";$stmt=$mysqli->prepare($countSql);$paramsCount=$params;compBind($stmt,$tipos,$paramsCount);$stmt->execute();$totalRegistros=(int)($stmt->get_result()->fetch_assoc()['total']??0);$stmt->close();$totalPaginas=max(1,(int)ceil($totalRegistros/$porPagina));if($pagina>$totalPaginas){$pagina=$totalPaginas;$offset=($pagina-1)*$porPagina;}
$listSql="SELECT c.*,s.nome setor_nome,s.secretaria,s.predio,s.andar,a.nome ambiente_nome,t.id termo_id,t.numero_termo,t.status termo_status,t.arquivo_assinado FROM ti_computadores c LEFT JOIN ti_setores s ON s.id=c.setor_id LEFT JOIN ti_ambientes a ON a.id=c.ambiente_id LEFT JOIN ti_computador_termos t ON t.id=(SELECT MAX(tt.id) FROM ti_computador_termos tt WHERE tt.computador_id=c.id) $whereSql ORDER BY c.atualizado_em DESC,c.id DESC LIMIT ? OFFSET ?";$stmt=$mysqli->prepare($listSql);$listParams=$params;$listParams[]=$porPagina;$listParams[]=$offset;compBind($stmt,$tipos.'ii',$listParams);$stmt->execute();$res=$stmt->get_result();$rows=[];while($r=$res->fetch_assoc())$rows[]=$r;$stmt->close();
$kpis=['total'=>0,'em_uso'=>0,'disponiveis'=>0,'manutencao'=>0,'sem_responsavel'=>0,'sem_local'=>0];$res=$mysqli->query("SELECT COUNT(*) total,COALESCE(SUM(status='EM_USO'),0) em_uso,COALESCE(SUM(status='DISPONIVEL'),0) disponiveis,COALESCE(SUM(status='MANUTENCAO'),0) manutencao,COALESCE(SUM(status='EM_USO' AND (responsavel_nome IS NULL OR TRIM(responsavel_nome)='')),0) sem_responsavel,COALESCE(SUM(setor_id IS NULL OR ambiente_id IS NULL),0) sem_local FROM ti_computadores");if($res){$k=$res->fetch_assoc();foreach($kpis as $ch=>$v)$kpis[$ch]=(int)($k[$ch]??0);$res->free();}
$setores=[];$res=$mysqli->query("SELECT s.*,COUNT(c.id) total_equipamentos FROM ti_setores s LEFT JOIN ti_computadores c ON c.setor_id=s.id WHERE s.ativo=1 GROUP BY s.id ORDER BY s.nome");while($res&&$r=$res->fetch_assoc())$setores[]=$r;
$flash=compConsumirFlash();
function pcUrlPagina(int $pag):string{$q=$_GET;$q['pagina']=$pag;return 'computadores.php?'.http_build_query($q);}
?>
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="theme-color" content="#08396f"><title>Computadores e Notebooks | Manutenção TI</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"><link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet"><link href="computadores_style.css?v=1" rel="stylesheet"></head><body><div class="top-strip"></div><div class="bg-grid"></div><div class="app">
<header class="main-header"><div class="header-content"><div class="brand-area"><div class="logo-box"><img src="assets/logo_pref.jpg" alt="Prefeitura de Extrema"></div><div><span class="eyebrow"><i class="bi bi-shield-check"></i>Inventário patrimonial rigoroso</span><h1 class="header-title">Computadores e Notebooks</h1><p class="header-subtitle">Controle de mais de 1.500 equipamentos com responsável, setor, sala, hardware, movimentações, mapa interno e termos assinados.</p></div></div><nav class="header-actions"><a href="mapa_computadores.php" class="header-button primary"><i class="bi bi-diagram-3-fill"></i>Mapa dos equipamentos</a><a href="?export=csv" class="header-button"><i class="bi bi-filetype-csv"></i>Exportar CSV</a><a href="listar_os.php" class="header-button"><i class="bi bi-arrow-left-circle-fill"></i>Ordens de serviço</a><a href="logout.php" class="header-button"><i class="bi bi-box-arrow-right"></i>Sair</a></nav></div></header>
<main class="main"><?php if($flash):?><div class="flash <?=$flash['tipo']==='sucesso'?'success':'error'?>"><i class="bi <?=$flash['tipo']==='sucesso'?'bi-check-circle-fill':'bi-exclamation-triangle-fill'?>"></i><span><?=compE($flash['mensagem'])?><?php if(!empty($flash['url'])):?> <a href="<?=compE($flash['url'])?>" target="_blank">Abrir documento</a><?php endif;?></span></div><?php endif;?>
<section class="hero"><div><h2>Patrimônio, pessoa e localização <span>sempre ligados ao mesmo histórico.</span></h2><p>O cadastro aceita desktops, notebooks, All in One, Mini PCs, workstations e Thin Clients. Transferências geram movimentação e termo de responsabilidade com o técnico logado e a pessoa que recebeu o equipamento.</p><div class="hero-tags"><span class="hero-tag"><i class="bi bi-upc-scan"></i>Patrimônio e série sem duplicidade</span><span class="hero-tag"><i class="bi bi-person-vcard-fill"></i>Responsável e setor</span><span class="hero-tag"><i class="bi bi-map-fill"></i>Mapa interno por sala</span><span class="hero-tag"><i class="bi bi-file-earmark-signature"></i>Termo e documento assinado</span><span class="hero-tag"><i class="bi bi-database-fill-check"></i>Paginação para 1.500+</span></div></div><aside class="hero-side"><small>Técnico conectado</small><strong><?=compE($usuario)?></strong><span>Entregas e transferências são registradas com o usuário autenticado.</span></aside></section>
<section class="kpis"><article class="kpi"><div class="kpi-icon"><i class="bi bi-pc-display"></i></div><strong><?=$kpis['total']?></strong><span>Total cadastrado</span></article><article class="kpi green"><div class="kpi-icon"><i class="bi bi-person-check-fill"></i></div><strong><?=$kpis['em_uso']?></strong><span>Em uso</span></article><article class="kpi"><div class="kpi-icon"><i class="bi bi-check-circle-fill"></i></div><strong><?=$kpis['disponiveis']?></strong><span>Disponíveis</span></article><article class="kpi purple"><div class="kpi-icon"><i class="bi bi-tools"></i></div><strong><?=$kpis['manutencao']?></strong><span>Em manutenção</span></article><article class="kpi red"><div class="kpi-icon"><i class="bi bi-person-exclamation"></i></div><strong><?=$kpis['sem_responsavel']?></strong><span>Em uso sem pessoa</span></article><article class="kpi gold"><div class="kpi-icon"><i class="bi bi-geo-alt-fill"></i></div><strong><?=$kpis['sem_local']?></strong><span>Sem sala definida</span></article></section>
<section class="panel"><div class="panel-head"><div class="panel-title"><span class="panel-title-icon"><i class="bi bi-list-check"></i></span><div><h3>Inventário de computadores</h3><p>50 registros por página, filtros indexados e histórico permanente.</p></div></div><button type="button" class="primary-button" onclick="novoComputador()"><i class="bi bi-plus-circle-fill"></i>Cadastrar equipamento</button></div>
<form class="filters" method="get"><div class="field"><i class="bi bi-search"></i><input class="control" name="buscar" value="<?=compE($busca)?>" placeholder="Patrimônio, série, hostname, pessoa, modelo, setor ou sala..."></div><select class="control" name="status"><option value="">Todos os status</option><?php foreach(['CADASTRO_INICIAL'=>'Cadastro inicial','DISPONIVEL'=>'Disponível','EM_USO'=>'Em uso','MANUTENCAO'=>'Manutenção','RESERVA'=>'Reserva','EXTRAVIADO'=>'Extraviado','AGUARDANDO_BAIXA'=>'Aguardando baixa','BAIXADO'=>'Baixado'] as $v=>$l):?><option value="<?=$v?>" <?=$statusFiltro===$v?'selected':''?>><?=$l?></option><?php endforeach;?></select><select class="control" name="tipo"><option value="">Todos os tipos</option><?php foreach(['DESKTOP'=>'Desktop','NOTEBOOK'=>'Notebook','ALL_IN_ONE'=>'All in One','MINI_PC'=>'Mini PC','WORKSTATION'=>'Workstation','THIN_CLIENT'=>'Thin Client'] as $v=>$l):?><option value="<?=$v?>" <?=$tipoFiltro===$v?'selected':''?>><?=$l?></option><?php endforeach;?></select><select class="control" name="setor_id"><option value="0">Todos os setores</option><?php foreach($setores as $s):?><option value="<?=(int)$s['id']?>" <?=$setorFiltro===(int)$s['id']?'selected':''?>><?=compE($s['nome'])?> (<?=(int)$s['total_equipamentos']?>)</option><?php endforeach;?></select><button class="clear-button" type="submit"><i class="bi bi-funnel-fill"></i>Filtrar</button></form>
<div class="table-wrap">
    <table class="data-table">
        <thead>
            <tr>
                <th>Equipamento</th>
                <th>Identificação</th>
                <th>Responsável</th>
                <th>Destino</th>
                <th>Status</th>
                <th>Termo</th>
                <th style="text-align:right">Ações</th>
            </tr>
        </thead>

        <tbody>
        <?php foreach ($rows as $r): ?>
            <?php
            [$tipoLabel, $tipoIcon] = compTipo($r['tipo']);
            [$statusLabel, $statusClass, $statusIcon] = compStatus($r['status']);

            $json = json_encode(
                $r,
                JSON_HEX_TAG |
                JSON_HEX_APOS |
                JSON_HEX_QUOT |
                JSON_HEX_AMP
            );

            $modeloEquipamento = trim(
                implode(
                    ' ',
                    array_filter([
                        $r['fabricante'] ?? '',
                        $r['modelo'] ?? ''
                    ])
                )
            );

            $destinoDetalhado = trim(
                implode(
                    ' • ',
                    array_filter([
                        $r['ambiente_nome'] ?? '',
                        $r['localizacao_texto'] ?? ''
                    ])
                )
            );
            ?>

            <tr class="data-row">

                <td data-label="Equipamento">
                    <div class="item-main">
                        <span class="item-icon">
                            <i class="bi <?= compE($tipoIcon) ?>"></i>
                        </span>

                        <span>
                            <strong>
                                <?= compE(
                                    $modeloEquipamento !== ''
                                        ? $modeloEquipamento
                                        : $tipoLabel
                                ) ?>
                            </strong>

                            <small>
                                <?= compE($tipoLabel) ?>
                                •
                                <?= compE($r['codigo_interno']) ?>
                            </small>
                        </span>
                    </div>
                </td>

                <td data-label="Identificação">
                    <span class="cell-main">
                        Patrimônio:
                        <?= compE(
                            $r['patrimonio'] ?: 'não informado'
                        ) ?>
                    </span>

                    <span class="cell-sub">
                        Série:
                        <?= compE(
                            $r['numero_serie'] ?: 'não informada'
                        ) ?>
                        • Host:
                        <?= compE(
                            $r['nome_maquina'] ?: 'não informado'
                        ) ?>
                    </span>
                </td>

                <td data-label="Responsável">
                    <span class="cell-main">
                        <?= compE(
                            $r['responsavel_nome'] ?: 'Sem responsável'
                        ) ?>
                    </span>
                </td>

                <td data-label="Destino">
                    <span class="cell-main">
                        <?= compE(
                            $r['setor_nome'] ?: 'Sem setor definido'
                        ) ?>
                    </span>

                    <span class="cell-sub">
                        <?= compE(
                            $destinoDetalhado !== ''
                                ? $destinoDetalhado
                                : 'Local interno não informado'
                        ) ?>
                    </span>
                </td>

                <td data-label="Status">
                    <span class="status status-<?= compE($statusClass) ?>">
                        <i class="bi <?= compE($statusIcon) ?>"></i>
                        <?= compE($statusLabel) ?>
                    </span>
                </td>

                <td data-label="Termo">
                    <?php if ($r['termo_id']): ?>
                        <a
                            class="action <?= $r['arquivo_assinado']
                                ? 'green'
                                : 'purple' ?>"
                            target="_blank"
                            href="termo_responsabilidade_computador.php?termo_id=<?= (int) $r['termo_id'] ?>"
                        >
                            <i class="bi <?= $r['arquivo_assinado']
                                ? 'bi-file-earmark-check-fill'
                                : 'bi-file-earmark-text-fill' ?>"></i>

                            <?= compE($r['numero_termo']) ?>
                        </a>
                    <?php else: ?>
                        <span class="cell-sub">Nenhum termo</span>
                    <?php endif; ?>
                </td>

                <td data-label="Ações">
                    <div class="actions">

                        <button
                            class="action"
                            onclick='editarComputador(<?= $json ?>)'
                        >
                            <i class="bi bi-pencil-fill"></i>
                            Editar
                        </button>

                        <button
                            class="action green"
                            onclick='abrirTransferencia(<?= $json ?>)'
                        >
                            <i class="bi bi-arrow-left-right"></i>
                            <?= empty($r['responsavel_nome'])
                                ? 'Entregar'
                                : 'Transferir' ?>
                        </button>

                        <?php if (!empty($r['responsavel_nome'])): ?>
                            <button
                                class="action gold"
                                onclick="abrirTermo(<?= (int) $r['id'] ?>)"
                            >
                                <i class="bi bi-file-earmark-signature"></i>
                                Gerar termo
                            </button>

                            <button
                                class="action red"
                                onclick="abrirDevolucao(
                                    <?= (int) $r['id'] ?>,
                                    '<?= compE(
                                        $r['patrimonio'] ?:
                                        $r['codigo_interno']
                                    ) ?>'
                                )"
                            >
                                <i class="bi bi-box-arrow-in-left"></i>
                                Devolver
                            </button>
                        <?php endif; ?>

                        <a
                            class="action blue"
                            href="mapa_computadores.php?setor_id=<?= (int) $r['setor_id'] ?>&destacar=<?= (int) $r['id'] ?>"
                        >
                            <i class="bi bi-map-fill"></i>
                            Mapa
                        </a>

                        <button
                            class="action purple"
                            onclick="abrirHistorico(
                                <?= (int) $r['id'] ?>,
                                '<?= compE(
                                    $r['patrimonio'] ?:
                                    $r['codigo_interno']
                                ) ?>'
                            )"
                        >
                            <i class="bi bi-clock-history"></i>
                            Histórico
                        </button>

                        <button
                            class="action"
                            onclick="abrirStatus(
                                <?= (int) $r['id'] ?>,
                                '<?= compE($r['status']) ?>'
                            )"
                        >
                            <i class="bi bi-sliders"></i>
                            Status
                        </button>

                    </div>
                </td>

            </tr>
        <?php endforeach; ?>

        <?php if (!$rows): ?>
            <tr>
                <td colspan="7">
                    <div class="empty">
                        <i class="bi bi-pc-display"></i>
                        <strong>Nenhum equipamento encontrado</strong>
                        <span>
                            Cadastre o primeiro ou ajuste os filtros.
                        </span>
                    </div>
                </td>
            </tr>
        <?php endif; ?>
        </tbody>
    </table>
</div>
<div class="pagination-bar"><span style="font-size:8px;color:var(--muted)">Exibindo <?=count($rows)?> de <?=$totalRegistros?> registros • página <?=$pagina?> de <?=$totalPaginas?></span><div class="pagination-links"><?php if($pagina>1):?><a class="page-link-custom" href="<?=compE(pcUrlPagina($pagina-1))?>"><i class="bi bi-chevron-left"></i></a><?php endif;?><?php for($p=max(1,$pagina-2);$p<=min($totalPaginas,$pagina+2);$p++):?><a class="page-link-custom <?=$p===$pagina?'active':''?>" href="<?=compE(pcUrlPagina($p))?>"><?=$p?></a><?php endfor;?><?php if($pagina<$totalPaginas):?><a class="page-link-custom" href="<?=compE(pcUrlPagina($pagina+1))?>"><i class="bi bi-chevron-right"></i></a><?php endif;?></div></div></section><footer class="page-footer"><span>Prefeitura de Extrema • Gerência de Tecnologia<br>Inventário rigoroso de computadores e notebooks.</span><span><i class="bi bi-database-fill-check"></i> Estrutura preparada para mais de 1.500 equipamentos</span></footer></main></div>

<div class="modal fade" id="modalCadastro" tabindex="-1"><div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable"><form method="post" class="modal-content"><div class="modal-header"><h5 class="modal-title" id="cadastroTitulo"><i class="bi bi-pc-display me-2"></i>Cadastrar equipamento</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal"></button></div><div class="modal-body"><input type="hidden" name="acao" value="salvar"><input type="hidden" name="id" id="cadId"><input type="hidden" name="csrf_token" value="<?=compE($csrf)?>">
<section class="form-section"><h6 class="form-section-title"><i class="bi bi-upc-scan"></i>Identificação patrimonial</h6><div class="form-grid"><div class="form-group"><label>Tipo</label><select name="tipo" id="cadTipo" class="control"><option value="DESKTOP">Desktop</option><option value="NOTEBOOK">Notebook</option><option value="ALL_IN_ONE">All in One</option><option value="MINI_PC">Mini PC</option><option value="WORKSTATION">Workstation</option><option value="THIN_CLIENT">Thin Client</option></select></div><div class="form-group"><label>Patrimônio</label><input name="patrimonio" id="cadPatrimonio" class="control" maxlength="50" autocomplete="off"><span class="form-help">Ao digitar, o sistema consulta automaticamente o histórico das ordens de serviço.</span></div><div class="form-group"><label>Número de série</label><input name="numero_serie" id="cadSerie" class="control" maxlength="100"></div><div class="form-group"><label>Nome da máquina</label><input name="nome_maquina" id="cadHostname" class="control" maxlength="100" placeholder="Ex.: EXT-SA-001"></div><div class="form-group"><label>HOST</label><input name="fabricante" id="cadFabricante" class="control" maxlength="100" required></div><div class="form-group"><label>VNC</label><input name="modelo" id="cadModelo" class="control" maxlength="150" required></div></div><div id="patrimonioLookup" class="patrimonio-lookup" aria-live="polite"><div class="patrimonio-lookup-empty"><i class="bi bi-search"></i><span>Digite o patrimônio para consultar automaticamente as OS anteriores.</span></div></div></section>
<section class="form-section"><h6 class="form-section-title"><i class="bi bi-cpu-fill"></i>Configuração técnica</h6><div class="form-grid"><div class="form-group span2"><label>Processador</label><input name="processador" id="cadProcessador" class="control" maxlength="180"></div><div class="form-group"><label>Memória RAM (GB)</label><input name="memoria_ram_gb" id="cadRam" class="control" type="number" step="0.01" min="0"></div><div class="form-group"><label>Tipo de armazenamento</label><select name="armazenamento_tipo" id="cadStorageTipo" class="control"><option value="">Não informado</option><option value="SSD SATA">SSD SATA</option><option value="SSD NVMe">SSD NVMe</option><option value="HD">HD</option><option value="eMMC">eMMC</option><option value="HÍBRIDO">Híbrido</option></select></div><div class="form-group"><label>Capacidade (GB)</label><input name="armazenamento_gb" id="cadStorageGb" class="control" type="number" min="0"></div><div class="form-group"><label>Sistema operacional</label><input name="sistema_operacional" id="cadSO" class="control" maxlength="120"></div><div class="form-group"><label>Arquitetura</label><select name="arquitetura" id="cadArch" class="control"><option value="">Não informada</option><option value="x64">64 bits</option><option value="x86">32 bits</option><option value="ARM64">ARM64</option></select></div><div class="form-group"><label>MAC de rede</label><input name="mac_rede" id="cadMac" class="control" maxlength="30"></div><div class="form-group"><label>MAC Wi-Fi</label><input name="mac_wifi" id="cadMacWifi" class="control" maxlength="30"></div><div class="form-group"><label>IP fixo</label><input name="ip_fixo" id="cadIp" class="control" maxlength="45"></div><div class="form-group"><label>Domínio</label><input name="dominio" id="cadDominio" class="control" maxlength="120"></div><div class="form-group"><label>Data de aquisição</label><input name="data_aquisicao" id="cadAquisicao" class="control" type="date"></div><div class="form-group"><label>Garantia até</label><input name="garantia_ate" id="cadGarantia" class="control" type="date"></div></div></section>
<section class="form-section"><h6 class="form-section-title"><i class="bi bi-person-vcard-fill"></i>Responsável e localização física</h6><div class="form-grid"><div class="form-group"><label>Nome da pessoa</label><input name="responsavel_nome" id="cadResponsavel" class="control" maxlength="150"></div><div class="form-group"><label>Matrícula</label><input name="responsavel_matricula" id="cadMatricula" class="control" maxlength="50"></div><div class="form-group"><label>Cargo / função</label><input name="responsavel_cargo" id="cadCargo" class="control" maxlength="120"></div><div class="form-group"><label>Setor *</label><input name="setor_nome" id="cadSetor" class="control" list="listaSetores" maxlength="150" required></div><div class="form-group"><label>Secretaria</label><input name="secretaria" id="cadSecretaria" class="control" maxlength="150"></div><div class="form-group"><label>Prédio / unidade</label><input name="predio" id="cadPredio" class="control" maxlength="150"></div><div class="form-group"><label>Andar / bloco</label><input name="andar" id="cadAndar" class="control" maxlength="80"></div><div class="form-group"><label>Sala / ambiente</label><input name="ambiente_nome" id="cadAmbiente" class="control" maxlength="150" placeholder="Ex.: Sala 02, Recepção, Gabinete"></div><div class="form-group"><label>Posição exata</label><input name="localizacao_texto" id="cadLocal" class="control" maxlength="180" placeholder="Ex.: Mesa 04, lado da janela"></div><div class="form-group"><label>Condição</label><select name="condicao" id="cadCondicao" class="control"><option value="NAO_AVALIADO">Não avaliado</option><option value="NOVO">Novo</option><option value="BOM">Bom</option><option value="REGULAR">Regular</option><option value="DANIFICADO">Danificado</option></select></div><div class="form-group"><label>Status</label><select name="status" id="cadStatus" class="control"><option value="CADASTRO_INICIAL">Cadastro inicial</option><option value="DISPONIVEL">Disponível</option><option value="EM_USO">Em uso</option><option value="MANUTENCAO">Manutenção</option><option value="RESERVA">Reserva técnica</option><option value="EXTRAVIADO">Extraviado</option><option value="AGUARDANDO_BAIXA">Aguardando baixa</option><option value="BAIXADO">Baixado</option></select></div><div class="form-group"><label>Motivo da alteração</label><input name="motivo" id="cadMotivo" class="control" maxlength="500"></div><div class="form-group full"><label>Acessórios vinculados</label><textarea name="acessorios" id="cadAcessorios" class="control" placeholder="Carregador, mouse, teclado, mochila, dock, fonte..."></textarea></div><div class="form-group full"><label>Observações técnicas</label><textarea name="observacoes" id="cadObservacoes" class="control"></textarea></div><div class="form-group full"><label style="display:flex;align-items:center;gap:8px;text-transform:none;font-size:8px"><input type="checkbox" name="gerar_termo" id="cadGerarTermo" value="1"> Gerar termo de responsabilidade após salvar quando houver pessoa responsável</label></div></div></section><datalist id="listaSetores"><?php foreach($setores as $s):?><option value="<?=compE($s['nome'])?>"><?php endforeach;?></datalist></div><div class="modal-footer"><button type="button" class="modal-button" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="modal-button primary"><i class="bi bi-check-circle-fill"></i>Salvar equipamento</button></div></form></div></div>

<div class="modal fade" id="modalTransferencia" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable"><form method="post" class="modal-content"><div class="modal-header"><h5 class="modal-title"><i class="bi bi-arrow-left-right me-2"></i>Entregar ou transferir equipamento</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal"></button></div><div class="modal-body"><input type="hidden" name="acao" value="transferir"><input type="hidden" name="id" id="transId"><input type="hidden" name="csrf_token" value="<?=compE($csrf)?>"><div class="flash success"><i class="bi bi-file-earmark-signature"></i><span>A confirmação gera automaticamente o termo para assinatura do técnico logado e de quem está retirando.</span></div><div class="form-grid"><div class="form-group"><label>Nome de quem está retirando</label><input name="responsavel_nome" id="transResponsavel" class="control" required></div><div class="form-group"><label>Matrícula</label><input name="responsavel_matricula" id="transMatricula" class="control"></div><div class="form-group"><label>Cargo / função</label><input name="responsavel_cargo" id="transCargo" class="control"></div><div class="form-group"><label>Setor</label><input name="setor_nome" id="transSetor" class="control" list="listaSetores" required></div><div class="form-group"><label>Secretaria</label><input name="secretaria" id="transSecretaria" class="control"></div><div class="form-group"><label>Prédio</label><input name="predio" id="transPredio" class="control"></div><div class="form-group"><label>Andar / bloco</label><input name="andar" id="transAndar" class="control"></div><div class="form-group"><label>Sala / ambiente</label><input name="ambiente_nome" id="transAmbiente" class="control" required></div><div class="form-group"><label>Posição exata</label><input name="localizacao_texto" id="transLocal" class="control"></div><div class="form-group"><label>Condição na entrega</label><select name="condicao" id="transCondicao" class="control"><option value="NOVO">Novo</option><option value="BOM">Bom</option><option value="REGULAR">Regular</option><option value="DANIFICADO">Danificado</option><option value="NAO_AVALIADO">Não avaliado</option></select></div><div class="form-group span2"><label>Motivo / autorização</label><input name="motivo" id="transMotivo" class="control" maxlength="500" placeholder="Ex.: entrega inicial, mudança de setor, substituição..."></div><div class="form-group full"><label>Acessórios entregues</label><textarea name="acessorios" id="transAcessorios" class="control"></textarea></div></div></div><div class="modal-footer"><button type="button" class="modal-button" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="modal-button primary"><i class="bi bi-printer-fill"></i>Confirmar e gerar termo</button></div></form></div></div>

<div class="modal fade" id="modalDevolucao" tabindex="-1"><div class="modal-dialog modal-dialog-centered"><form method="post" class="modal-content"><div class="modal-header"><h5 class="modal-title"><i class="bi bi-box-arrow-in-left me-2"></i>Registrar devolução</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal"></button></div><div class="modal-body"><input type="hidden" name="acao" value="devolver"><input type="hidden" name="id" id="devId"><input type="hidden" name="csrf_token" value="<?=compE($csrf)?>"><p style="font-size:10px">O responsável será removido, o equipamento ficará disponível e todo o histórico será preservado.</p><div class="form-group"><label>Motivo / observação</label><textarea name="motivo" class="control" placeholder="Estado na devolução, acessórios devolvidos..."></textarea></div></div><div class="modal-footer"><button type="button" class="modal-button" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="modal-button primary">Confirmar devolução</button></div></form></div></div>
<div class="modal fade" id="modalStatus" tabindex="-1"><div class="modal-dialog modal-dialog-centered"><form method="post" class="modal-content"><div class="modal-header"><h5 class="modal-title"><i class="bi bi-sliders me-2"></i>Alterar situação</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal"></button></div><div class="modal-body"><input type="hidden" name="acao" value="status"><input type="hidden" name="id" id="statusId"><input type="hidden" name="csrf_token" value="<?=compE($csrf)?>"><div class="form-group"><label>Novo status</label><select name="novo_status" id="statusNovo" class="control"><?php foreach(['CADASTRO_INICIAL'=>'Cadastro inicial','DISPONIVEL'=>'Disponível','EM_USO'=>'Em uso','MANUTENCAO'=>'Manutenção','RESERVA'=>'Reserva técnica','EXTRAVIADO'=>'Extraviado','AGUARDANDO_BAIXA'=>'Aguardando baixa','BAIXADO'=>'Baixado'] as $v=>$l):?><option value="<?=$v?>"><?=$l?></option><?php endforeach;?></select></div><div class="form-group" style="margin-top:10px"><label>Justificativa</label><textarea name="motivo" class="control" required></textarea></div></div><div class="modal-footer"><button type="button" class="modal-button" data-bs-dismiss="modal">Cancelar</button><button type="submit" class="modal-button primary">Atualizar</button></div></form></div></div>
<form method="post" id="formTermo" style="display:none"><input type="hidden" name="acao" value="gerar_termo"><input type="hidden" name="id" id="termoId"><input type="hidden" name="csrf_token" value="<?=compE($csrf)?>"></form>
<div class="modal fade" id="modalHistorico" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable"><div class="modal-content"><div class="modal-header"><h5 class="modal-title" id="historicoTitulo"><i class="bi bi-clock-history me-2"></i>Histórico</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal"></button></div><div class="modal-body" id="historicoBody"></div></div></div></div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script><script>
const modalCadastro=bootstrap.Modal.getOrCreateInstance(document.getElementById('modalCadastro'));const modalTransferencia=bootstrap.Modal.getOrCreateInstance(document.getElementById('modalTransferencia'));const modalDevolucao=bootstrap.Modal.getOrCreateInstance(document.getElementById('modalDevolucao'));const modalStatus=bootstrap.Modal.getOrCreateInstance(document.getElementById('modalStatus'));const modalHistorico=bootstrap.Modal.getOrCreateInstance(document.getElementById('modalHistorico'));
const campos={cadTipo:'tipo',cadPatrimonio:'patrimonio',cadSerie:'numero_serie',cadHostname:'nome_maquina',cadFabricante:'fabricante',cadModelo:'modelo',cadProcessador:'processador',cadRam:'memoria_ram_gb',cadStorageTipo:'armazenamento_tipo',cadStorageGb:'armazenamento_gb',cadSO:'sistema_operacional',cadArch:'arquitetura',cadMac:'mac_rede',cadMacWifi:'mac_wifi',cadIp:'ip_fixo',cadDominio:'dominio',cadAquisicao:'data_aquisicao',cadGarantia:'garantia_ate',cadResponsavel:'responsavel_nome',cadMatricula:'responsavel_matricula',cadCargo:'responsavel_cargo',cadSetor:'setor_nome',cadSecretaria:'secretaria',cadPredio:'predio',cadAndar:'andar',cadAmbiente:'ambiente_nome',cadLocal:'localizacao_texto',cadCondicao:'condicao',cadStatus:'status',cadAcessorios:'acessorios',cadObservacoes:'observacoes'};
let patrimonioConsultaTimer=null;
let patrimonioConsultaController=null;
let patrimonioUltimaSugestao=null;
let patrimonioUltimoValor='';
let patrimonioTipoAlterado=false;

const patrimonioInput=document.getElementById('cadPatrimonio');
const patrimonioLookup=document.getElementById('patrimonioLookup');
const cadastroTipo=document.getElementById('cadTipo');

function patrimonioNormalizar(valor){return String(valor??'').normalize('NFD').replace(/[\u0300-\u036f]/g,'').replace(/[^a-z0-9]+/gi,'').toLowerCase()}
function patrimonioValorValido(valor){const texto=String(valor??'').trim();if(!texto)return false;const n=patrimonioNormalizar(texto);return !['na','naoha','naoinformado','naoinformada','naoidentificado','semregistro','desconhecido','null','0'].includes(n)}
function patrimonioResetarPainel(){patrimonioUltimaSugestao=null;patrimonioUltimoValor='';if(patrimonioConsultaController)patrimonioConsultaController.abort();patrimonioLookup.innerHTML='<div class="patrimonio-lookup-empty"><i class="bi bi-search"></i><span>Digite o patrimônio para consultar automaticamente as OS anteriores.</span></div>';patrimonioLookup.className='patrimonio-lookup'}
function patrimonioPreencherCampo(id,valor,forcar=false){if(!patrimonioValorValido(valor))return false;const el=document.getElementById(id);if(!el)return false;const atual=String(el.value??'').trim();if(forcar||atual===''){el.value=valor;el.dispatchEvent(new Event('change',{bubbles:true}));return true}return false}
function patrimonioAplicarSugestao(forcar=false){const s=patrimonioUltimaSugestao;if(!s)return;let preenchidos=0;if(s.tipo&&(!patrimonioTipoAlterado||forcar)){cadastroTipo.value=s.tipo;preenchidos++}if(patrimonioPreencherCampo('cadSerie',s.numero_serie,forcar))preenchidos++;if(patrimonioPreencherCampo('cadFabricante',s.fabricante,forcar))preenchidos++;if(patrimonioPreencherCampo('cadModelo',s.modelo,forcar))preenchidos++;if(patrimonioPreencherCampo('cadResponsavel',s.responsavel_nome,forcar))preenchidos++;if(patrimonioPreencherCampo('cadSetor',s.setor_nome,forcar))preenchidos++;const status=document.getElementById('cadStatus');if(s.status==='EM_USO'&&['','CADASTRO_INICIAL','DISPONIVEL'].includes(status.value)){status.value='EM_USO'}const motivo=document.getElementById('cadMotivo');if(motivo&&motivo.value.trim()===''&&s.ultima_os_numero)motivo.value='Cadastro auxiliado pelo histórico da OS '+s.ultima_os_numero;const botao=document.getElementById('patrimonioApplyButton');if(botao){const original=botao.innerHTML;botao.innerHTML='<i class="bi bi-check-circle-fill"></i> '+(preenchidos?'Campos preenchidos':'Dados já aplicados');setTimeout(()=>botao.innerHTML=original,1600)}}
function patrimonioResumoHistorico(lista){if(!Array.isArray(lista)||!lista.length)return '';return '<div class="patrimonio-history">'+lista.slice(0,5).map(item=>'<a href="listar_os.php?buscar='+encodeURIComponent(item.numero_os||item.id)+'&abrir_os='+Number(item.id)+'" target="_blank" rel="noopener noreferrer" class="patrimonio-history-item"><span class="patrimonio-history-icon"><i class="bi bi-clipboard2-pulse-fill"></i></span><span><strong>OS #'+esc(item.numero_os||item.id)+' • '+esc(item.data||'Data não informada')+'</strong><span>'+esc([item.solicitante,item.setor,item.equipamento].filter(Boolean).join(' • ')||'Sem detalhes')+'</span>'+(item.problema?'<small>'+esc(item.problema)+'</small>':'')+'</span><i class="bi bi-box-arrow-up-right"></i></a>').join('')+'</div>'}
function patrimonioRenderizar(dados,aplicarAutomaticamente){const existente=dados.computador_existente;if(existente){patrimonioLookup.className='patrimonio-lookup duplicate';patrimonioLookup.innerHTML='<div class="patrimonio-lookup-head"><span class="patrimonio-lookup-icon"><i class="bi bi-exclamation-triangle-fill"></i></span><span><strong>Este patrimônio já está cadastrado</strong><small>'+esc([existente.fabricante,existente.modelo,existente.nome_maquina].filter(Boolean).join(' • ')||existente.codigo_interno)+'</small><small>'+esc([existente.responsavel_nome,existente.setor_nome,existente.ambiente_nome].filter(Boolean).join(' • ')||'Sem responsável ou localização')+'</small></span><a class="patrimonio-lookup-button" href="computadores.php?busca='+encodeURIComponent(existente.patrimonio)+'"><i class="bi bi-eye-fill"></i>Abrir cadastro</a></div>';return}
const total=Number(dados.total_historico||0);const s=dados.sugestao;if(!total||!s){patrimonioLookup.className='patrimonio-lookup not-found';patrimonioLookup.innerHTML='<div class="patrimonio-lookup-head"><span class="patrimonio-lookup-icon"><i class="bi bi-question-circle-fill"></i></span><span><strong>Nenhuma OS anterior encontrada</strong><small>O patrimônio poderá ser cadastrado normalmente.</small></span></div>';return}
patrimonioUltimaSugestao=s;patrimonioLookup.className='patrimonio-lookup found';patrimonioLookup.innerHTML='<div class="patrimonio-lookup-head"><span class="patrimonio-lookup-icon"><i class="bi bi-database-fill-check"></i></span><span><strong>'+total+' ordem(ns) de serviço encontrada(s)</strong><small>Última: OS #'+esc(s.ultima_os_numero||'')+' • '+esc(s.ultima_data||'Data não informada')+'</small><small>'+esc([s.responsavel_nome,s.setor_nome].filter(Boolean).join(' • ')||'Responsável e setor não informados')+'</small></span><button type="button" class="patrimonio-lookup-button" id="patrimonioApplyButton" onclick="patrimonioAplicarSugestao(false)"><i class="bi bi-magic"></i>Preencher campos vazios</button></div>'+(s.ultimo_problema?'<div class="patrimonio-last-problem"><strong>Último problema:</strong> '+esc(s.ultimo_problema)+(s.ultima_solucao?'<br><strong>Última solução:</strong> '+esc(s.ultima_solucao):'')+'</div>':'')+patrimonioResumoHistorico(dados.historico||[]);if(aplicarAutomaticamente)patrimonioAplicarSugestao(false)}
async function consultarPatrimonio(valor,aplicarAutomaticamente=true){const patrimonio=String(valor??'').trim();const compacto=patrimonioNormalizar(patrimonio);if(compacto.length<2){patrimonioResetarPainel();return}if(compacto===patrimonioUltimoValor&&patrimonioUltimaSugestao)return;patrimonioUltimoValor=compacto;if(patrimonioConsultaController)patrimonioConsultaController.abort();patrimonioConsultaController=new AbortController();patrimonioLookup.className='patrimonio-lookup loading';patrimonioLookup.innerHTML='<div class="patrimonio-lookup-head"><span class="patrimonio-lookup-icon"><span class="spinner-border spinner-border-sm"></span></span><span><strong>Consultando o histórico da Manutenção TI...</strong><small>Procurando patrimônio nas ordens de serviço e no inventário atual.</small></span></div>';const ignorar=Number(document.getElementById('cadId').value||0);try{const url='buscar_patrimonio_os.php?patrimonio='+encodeURIComponent(patrimonio)+'&ignorar_computador_id='+ignorar;const response=await fetch(url,{cache:'no-store',credentials:'same-origin',signal:patrimonioConsultaController.signal,headers:{'X-Requested-With':'XMLHttpRequest'}});const dados=await response.json().catch(()=>({}));if(!response.ok||dados.ok===false)throw new Error(dados.message||'Não foi possível consultar o patrimônio.');patrimonioRenderizar(dados,aplicarAutomaticamente)}catch(erro){if(erro.name==='AbortError')return;patrimonioLookup.className='patrimonio-lookup error';patrimonioLookup.innerHTML='<div class="patrimonio-lookup-head"><span class="patrimonio-lookup-icon"><i class="bi bi-wifi-off"></i></span><span><strong>Consulta indisponível</strong><small>'+esc(erro.message)+'</small></span><button type="button" class="patrimonio-lookup-button" onclick="consultarPatrimonio(patrimonioInput.value,true)"><i class="bi bi-arrow-repeat"></i>Tentar novamente</button></div>'}}

patrimonioInput.addEventListener('input',()=>{clearTimeout(patrimonioConsultaTimer);patrimonioConsultaTimer=setTimeout(()=>consultarPatrimonio(patrimonioInput.value,true),650)});
patrimonioInput.addEventListener('blur',()=>{clearTimeout(patrimonioConsultaTimer);consultarPatrimonio(patrimonioInput.value,true)});
cadastroTipo.addEventListener('change',()=>{patrimonioTipoAlterado=true});

function novoComputador(){document.getElementById('cadastroTitulo').innerHTML='<i class="bi bi-pc-display me-2"></i>Cadastrar equipamento';document.getElementById('cadId').value='';Object.keys(campos).forEach(id=>{const el=document.getElementById(id);if(el)el.value=''});document.getElementById('cadTipo').value='DESKTOP';document.getElementById('cadCondicao').value='NAO_AVALIADO';document.getElementById('cadStatus').value='CADASTRO_INICIAL';document.getElementById('cadGerarTermo').checked=false;patrimonioTipoAlterado=false;patrimonioResetarPainel();modalCadastro.show();setTimeout(()=>patrimonioInput.focus(),250)}
function editarComputador(item){document.getElementById('cadastroTitulo').innerHTML='<i class="bi bi-pencil-fill me-2"></i>Editar equipamento';document.getElementById('cadId').value=item.id;Object.entries(campos).forEach(([id,key])=>{const el=document.getElementById(id);if(el)el.value=item[key]??''});document.getElementById('cadGerarTermo').checked=false;patrimonioTipoAlterado=true;patrimonioResetarPainel();modalCadastro.show();if(item.patrimonio)setTimeout(()=>consultarPatrimonio(item.patrimonio,false),300)}
function abrirTransferencia(item){document.getElementById('transId').value=item.id;const map={transResponsavel:'responsavel_nome',transMatricula:'responsavel_matricula',transCargo:'responsavel_cargo',transSetor:'setor_nome',transSecretaria:'secretaria',transPredio:'predio',transAndar:'andar',transAmbiente:'ambiente_nome',transLocal:'localizacao_texto',transCondicao:'condicao',transAcessorios:'acessorios'};Object.entries(map).forEach(([id,key])=>document.getElementById(id).value=item[key]??'');document.getElementById('transMotivo').value='';modalTransferencia.show()}
function abrirDevolucao(id,nome){document.getElementById('devId').value=id;modalDevolucao.show()}
function abrirStatus(id,status){document.getElementById('statusId').value=id;document.getElementById('statusNovo').value=status;modalStatus.show()}
function abrirTermo(id){document.getElementById('termoId').value=id;document.getElementById('formTermo').submit()}
function esc(v){const d=document.createElement('div');d.textContent=String(v??'');return d.innerHTML}
async function abrirHistorico(id,nome){document.getElementById('historicoTitulo').innerHTML='<i class="bi bi-clock-history me-2"></i>Histórico — '+esc(nome);const b=document.getElementById('historicoBody');b.innerHTML='<div class="empty"><div class="spinner-border text-primary"></div><span>Carregando...</span></div>';modalHistorico.show();try{const r=await fetch('computador_historico.php?id='+encodeURIComponent(id),{cache:'no-store'});const d=await r.json();if(!r.ok||!d.ok)throw new Error(d.message||'Falha ao carregar.');if(!d.historico.length){b.innerHTML='<div class="empty"><i class="bi bi-clock-history"></i><strong>Sem movimentações</strong></div>';return}b.innerHTML='<div class="history-list">'+d.historico.map(x=>'<article class="history-item"><span class="history-icon"><i class="bi bi-arrow-left-right"></i></span><span><strong>'+esc(String(x.acao).replaceAll('_',' '))+'</strong><span>'+esc(x.responsavel_anterior||'Sem responsável')+' → '+esc(x.responsavel_novo||'Sem responsável')+'</span><span>'+esc(x.setor_anterior||'Sem setor')+' / '+esc(x.ambiente_anterior||'Sem sala')+' → '+esc(x.setor_novo||'Sem setor')+' / '+esc(x.ambiente_novo||'Sem sala')+'</span>'+(x.motivo?'<span>'+esc(x.motivo)+'</span>':'')+'<span>Registrado por <strong>'+esc(x.usuario)+'</strong></span>'+(x.termo_id?'<span><a target="_blank" href="termo_responsabilidade_computador.php?termo_id='+Number(x.termo_id)+'">Abrir '+esc(x.numero_termo)+'</a></span>':'')+'</span><time class="history-time">'+esc(x.criado_em)+'</time></article>').join('')+'</div>'}catch(e){b.innerHTML='<div class="flash error">'+esc(e.message)+'</div>'}}
</script><script src="alerta_global_cliente.js?v=7"></script></body></html>