<?php
declare(strict_types=1);
require_once __DIR__.'/auth.php';require_once __DIR__.'/permissoes_ti.php';
if(!tiPermEhRenan()){http_response_code(403);exit('Somente Renan pode executar esta instalação.');}
$mysqli->set_charset('utf8mb4');$erro='';$ok=[];$csrf=bin2hex(random_bytes(16));if(empty($_SESSION['csrf_inst_governanca']))$_SESSION['csrf_inst_governanca']=$csrf;else$csrf=$_SESSION['csrf_inst_governanca'];
function instExecutarSql(mysqli $mysqli,string $arquivo):void{$sql=file_get_contents($arquivo);if($sql===false)throw new RuntimeException('Arquivo SQL não encontrado: '.$arquivo);$comandos=array_filter(array_map('trim',preg_split('/;\s*(?:\r?\n|$)/',$sql)?:[]));foreach($comandos as $cmd){$cmd=preg_replace('/^--.*$/m','',$cmd);$cmd=trim((string)$cmd);if($cmd!==''&&!$mysqli->query($cmd))throw new RuntimeException('Erro SQL: '.$mysqli->error.' | '.substr($cmd,0,180));}}
if($_SERVER['REQUEST_METHOD']==='POST'){
 try{if(!hash_equals((string)$_SESSION['csrf_inst_governanca'],(string)($_POST['csrf_token']??'')))throw new RuntimeException('Sessão expirada.');
  if(!tiPermTabelaExiste($mysqli,'ti_ativos')){instExecutarSql($mysqli,__DIR__.'/central_ativos/SQL_CENTRAL_ATIVOS.sql');$ok[]='Estrutura da Central de Ativos criada.';}
  instExecutarSql($mysqli,__DIR__.'/SQL_GOVERNANCA_TI.sql');$ok[]='Tabelas de usuários, permissões, auditoria e inventário criadas.';
  $mods=[
   ['dashboard','Dashboard','Indicadores gerais do sistema','bi-grid-1x2-fill',10],['os','Ordens de Serviço','Abertura, atendimento, finalização e termos','bi-tools',20],['almoxarifado','Almoxarifado','Estoque e movimentações','bi-box-seam-fill',30],['toner','Toner','Estoque e inventário de toner','bi-printer-fill',40],['computadores','Computadores','Computadores, notebooks e mapa','bi-pc-display',50],['impressoras','Impressoras','Cadastro e manutenção de impressoras','bi-printer',60],['chips','Chips','Linhas e chips corporativos','bi-sim-fill',70],['smartphones','Smartphones','Aparelhos corporativos','bi-phone-fill',80],['central_ativos','Central de Ativos','Ficha única dos ativos','bi-boxes',90],['inventario_geral','Inventário Geral','Campanhas de conferência física','bi-clipboard2-check-fill',100],['rastreador','Rastreador','Pesquisa integrada de equipamentos','bi-radar',110],['inteligencia','Indicadores e Inteligência','Painéis analíticos','bi-bar-chart-line-fill',120],['relatorios','Relatórios','Exportações e relatórios gerenciais','bi-file-earmark-bar-graph-fill',130],['alertas','Alertas','Alertas internos do sistema','bi-bell-fill',140],['painel_cynthia','Painel Cynthia','Painel exclusivo de telecom e toner','bi-person-badge-fill',150],['usuarios_permissoes','Usuários e Permissões','Administração de contas e acessos','bi-person-lock',999]
  ];
  $stmt=$mysqli->prepare('INSERT INTO ti_modulos(slug,nome,descricao,icone,ordem,ativo) VALUES(?,?,?,?,?,1) ON DUPLICATE KEY UPDATE nome=VALUES(nome),descricao=VALUES(descricao),icone=VALUES(icone),ordem=VALUES(ordem),ativo=1');foreach($mods as $m){$stmt->bind_param('ssssi',$m[0],$m[1],$m[2],$m[3],$m[4]);$stmt->execute();}$stmt->close();$ok[]='Catálogo de módulos atualizado.';
  $users=[];$r=$mysqli->query('SELECT id,usuario FROM usuarios');while($u=$r->fetch_assoc())$users[]=$u;$admin=tiPermUsuario();
  foreach($users as $u){$uid=(int)$u['id'];$norm=tiPermNormalizar($u['usuario']);$isRenan=$norm==='renan'?1:0;$home=$norm==='cynthia'?'dashboard_cynthia.php':null;$stmt=$mysqli->prepare('INSERT INTO ti_usuarios_config(user_id,nome_exibicao,ativo,admin_global,pagina_inicial,atualizado_por) VALUES(?,?,1,?,?,?) ON DUPLICATE KEY UPDATE admin_global=IF(VALUES(admin_global)=1,1,admin_global),atualizado_por=VALUES(atualizado_por)');$stmt->bind_param('isiss',$uid,$u['usuario'],$isRenan,$home,$admin);$stmt->execute();$stmt->close();
   $tem=$mysqli->prepare('SELECT COUNT(*) total FROM ti_usuario_permissoes WHERE user_id=?');$tem->bind_param('i',$uid);$tem->execute();$ja=(int)($tem->get_result()->fetch_assoc()['total']??0)>0;$tem->close();if($ja)continue;
   foreach($mods as $m){$slug=$m[0];$nivel='sem';if($norm==='renan')$nivel='total';elseif($norm==='cynthia'&&in_array($slug,['painel_cynthia','toner','chips','smartphones'],true))$nivel='total';elseif($norm==='marcelo'){$nivel=match($slug){'impressoras'=>'total','os','inventario_geral'=>'operador','computadores','toner','central_ativos','rastreador'=>'consulta',default=>'sem'};}else{$nivel=in_array($slug,['dashboard','os','almoxarifado','toner','computadores','rastreador','inteligencia','relatorios','alertas'],true)?'operador':'sem';}
    $f=match($nivel){'consulta'=>[1,0,0,0,0,0,1,0],'operador'=>[1,1,1,0,1,1,1,0],'total'=>[1,1,1,1,1,1,1,1],default=>[0,0,0,0,0,0,0,0]};$stmt=$mysqli->prepare('INSERT INTO ti_usuario_permissoes(user_id,modulo_slug,pode_visualizar,pode_cadastrar,pode_editar,pode_excluir,pode_transferir,pode_finalizar,pode_exportar,pode_administrar,atualizado_por) VALUES(?,?,?,?,?,?,?,?,?,?,?)');$stmt->bind_param('isiiiiiiiis',$uid,$slug,$f[0],$f[1],$f[2],$f[3],$f[4],$f[5],$f[6],$f[7],$admin);$stmt->execute();$stmt->close();
   }
  }
  $ok[]='Usuários existentes preservados e matriz inicial criada.';
  require_once __DIR__.'/central_ativos/ativos_helpers.php';try{$sync=atiSincronizarTodos($mysqli);$ok[]=$sync['criados'].' ativos integrados e '.$sync['atualizados'].' atualizados.';}catch(Throwable $e){$ok[]='Estrutura instalada; sincronização poderá ser executada depois: '.$e->getMessage();}
  tiPermRegistrarAuditoria($mysqli,'GOVERNANCA_INSTALADA','usuarios_permissoes',null,'Instalação e matriz inicial concluídas.');
 }catch(Throwable $e){$erro=$e->getMessage();}
}
?>
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Instalar Governança 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-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet"><link href="governanca_style.css" rel="stylesheet"></head><body><div class="top"></div><div class="grid-bg"></div><div class="app"><header class="header"><div class="header-inner"><div class="brand"><div class="logo"><img src="assets/logo_pref.jpg"></div><div><span class="eyebrow"><i class="bi bi-database-gear"></i>Instalação administrativa</span><h1>Governança, Inventário e Permissões</h1><p>Cria novas tabelas e aplica uma camada central de autorização sem apagar dados existentes.</p></div></div><a class="head-btn primary" href="governanca_ti.php">Abrir Governança</a></div></header><main class="main"><?php if($erro):?><div class="flash error"><?=tiPermE($erro)?></div><?php endif;?><?php foreach($ok as $m):?><div class="flash success"><i class="bi bi-check-circle-fill"></i><?=tiPermE($m)?></div><?php endforeach;?><section class="form-card"><div class="alert info"><strong>O instalador não apaga usuários, ativos, OS ou estoques.</strong> Ele cria as tabelas de governança, gera a matriz inicial e preserva a proteção fixa da Cynthia.</div><?php if(!$ok):?><form method="post" style="margin-top:15px"><input type="hidden" name="csrf_token" value="<?=tiPermE($csrf)?>"><button class="button green"><i class="bi bi-database-check"></i>Instalar e configurar</button></form><?php else:?><div class="actions" style="justify-content:flex-start"><a class="button primary" href="usuarios_permissoes.php">Administrar usuários</a><a class="button green" href="inventario_geral.php">Abrir inventário</a></div><div class="alert danger" style="margin-top:14px"><strong>Segurança:</strong> apague instalar_governanca_ti.php após confirmar a instalação.</div><?php endif;?></section></main></div></body></html>
