<?php
declare(strict_types=1);
require_once __DIR__.'/common.php';

pcApiMethod('POST');$cfg=pcApiCfg($mysqli);$agent=pcApiAuth($mysqli);$payload=pcApiJson();$id=(int)$agent['id'];
$s=static fn(string $key,int $max=500):string=>pcApiText($payload[$key]??'',$max);
$type=strtoupper($s('tipo',30));if(!in_array($type,['DESKTOP','NOTEBOOK','ALL_IN_ONE','MINI_PC','WORKSTATION','THIN_CLIENT'],true))$type=(string)$agent['tipo'];
$strings=[
 'tipo'=>$type,'hostname'=>$s('hostname',100),'dominio'=>$s('dominio',120),'ultimo_usuario'=>$s('ultimo_usuario',180),
 'fabricante'=>$s('fabricante',120),'modelo'=>$s('modelo',180),'numero_serie'=>$s('numero_serie',120),'bios_version'=>$s('bios_version',120),
 'sistema_operacional'=>$s('sistema_operacional',180),'os_version'=>$s('os_version',80),'os_build'=>$s('os_build',80),'arquitetura'=>$s('arquitetura',30),
 'processador'=>$s('processador',220),'armazenamento_tipo'=>$s('armazenamento_tipo',100),'gpu'=>$s('gpu',220),'ipv4'=>$s('ipv4',45),
 'mac_address'=>$s('mac_address',30),'rede_tipo'=>$s('rede_tipo',60),'bitlocker_status'=>$s('bitlocker_status',80),'antivirus'=>$s('antivirus',220),
 'agent_version'=>$s('agent_version',40)
];
$ints=[
 'uptime_seconds'=>pcApiInt($payload['uptime_seconds']??0,0,2147483647,'uptime_seconds'),'cpu_cores'=>pcApiInt($payload['cpu_cores']??0,0,1024,'cpu_cores'),
 'cpu_logical'=>pcApiInt($payload['cpu_logical']??0,0,2048,'cpu_logical'),'ram_total_mb'=>pcApiInt($payload['ram_total_mb']??0,0,4194304,'ram_total_mb'),
 'ram_livre_mb'=>pcApiInt($payload['ram_livre_mb']??0,0,4194304,'ram_livre_mb'),'armazenamento_total_mb'=>pcApiInt($payload['armazenamento_total_mb']??0,0,2147483647,'armazenamento_total_mb'),
 'armazenamento_livre_mb'=>pcApiInt($payload['armazenamento_livre_mb']??0,0,2147483647,'armazenamento_livre_mb'),'agent_version_code'=>pcApiInt($payload['agent_version_code']??0,0,1000000000,'agent_version_code')
];
$date=static function(string $value):?string{return $value!==''&&strtotime($value)!==false?date('Y-m-d H:i:s',strtotime($value)):null;};
$installed=$date($s('instalado_em',40));$boot=$date($s('ultimo_boot',40));$collected=$date($s('coletado_em',40))??date('Y-m-d H:i:s');
$watched=['hostname'=>'Nome da maquina','fabricante'=>'Fabricante','modelo'=>'Modelo','numero_serie'=>'Numero de serie','sistema_operacional'=>'Sistema operacional','os_build'=>'Build do Windows','processador'=>'Processador','ram_total_mb'=>'Memoria RAM','armazenamento_total_mb'=>'Armazenamento','ipv4'=>'Endereco IP'];
foreach($watched as $key=>$label){$new=array_key_exists($key,$strings)?$strings[$key]:$ints[$key];$old=$agent[$key]??null;if((string)$new!==''&&(string)$old!==''&&(string)$new!==(string)$old)pcApiEvent($mysqli,$id,'MUDANCA_'.strtoupper($key),'ATENCAO',$label.' alterado',(string)$old,(string)$new,'Alteracao tecnica detectada automaticamente.');}

$updates=$strings+$ints+['instalado_em'=>$installed,'ultimo_boot'=>$boot,'ultima_coleta'=>$collected,'ultimo_ip_remoto'=>pcApiIp(),'ultimo_erro'=>null];$sets=[];$types='';$values=[];
foreach($updates as $column=>$value){$sets[]="{$column}=?";$types.=is_int($value)?'i':'s';$values[]=$value;}$sets[]='ultima_comunicacao=NOW()';$values[]=$id;$types.='i';
$stmt=$mysqli->prepare('UPDATE ti_pc_agentes SET '.implode(',',$sets).' WHERE id=?');pcApiBind($stmt,$types,$values);$stmt->execute();$stmt->close();

$computerId=(int)($agent['computador_id']??0);
if($computerId>0&&pcApiTable($mysqli,'ti_computadores')){
    $ramGb=$ints['ram_total_mb']>0?round($ints['ram_total_mb']/1024,2):null;$storageGb=$ints['armazenamento_total_mb']>0?(int)round($ints['armazenamento_total_mb']/1024):null;$actor='AGENTE_WINDOWS';
    $stmt=$mysqli->prepare("UPDATE ti_computadores SET tipo=?,nome_maquina=NULLIF(?,''),numero_serie=COALESCE(NULLIF(?,''),numero_serie),fabricante=COALESCE(NULLIF(?,''),fabricante),modelo=COALESCE(NULLIF(?,''),modelo),processador=NULLIF(?,''),memoria_ram_gb=?,armazenamento_tipo=NULLIF(?,''),armazenamento_gb=?,sistema_operacional=NULLIF(?,''),arquitetura=NULLIF(?,''),mac_rede=NULLIF(?,''),ip_fixo=NULLIF(?,''),dominio=NULLIF(?,''),atualizado_por=? WHERE id=?");
    $stmt->bind_param('ssssssdsissssssi',$type,$strings['hostname'],$strings['numero_serie'],$strings['fabricante'],$strings['modelo'],$strings['processador'],$ramGb,$strings['armazenamento_tipo'],$storageGb,$strings['sistema_operacional'],$strings['arquitetura'],$strings['mac_address'],$strings['ipv4'],$strings['dominio'],$actor,$computerId);$stmt->execute();$stmt->close();
}

$safePayload=$payload;unset($safePayload['token'],$safePayload['activation_code']);$json=json_encode($safePayload,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)?:'{}';$hash=hash('sha256',$json);$ip=pcApiIp();
$stmt=$mysqli->prepare('INSERT INTO ti_pc_sincronizacoes(agente_id,resumo_hash,payload_json,coletado_em,ip_remoto) VALUES(?,?,?,?,?)');$stmt->bind_param('issss',$id,$hash,$json,$collected,$ip);$stmt->execute();$stmt->close();

$total=$ints['armazenamento_total_mb'];$free=$ints['armazenamento_livre_mb'];$freePct=$total>0?$free/$total*100:100;$critical=(int)($cfg['storage_critical_percent']??10);
if($freePct<=$critical){$stmt=$mysqli->prepare("SELECT id FROM ti_pc_eventos WHERE agente_id=? AND tipo='ARMAZENAMENTO_CRITICO' AND resolvido=0 LIMIT 1");$stmt->bind_param('i',$id);$stmt->execute();$open=$stmt->get_result()->fetch_assoc();$stmt->close();if(!$open)pcApiEvent($mysqli,$id,'ARMAZENAMENTO_CRITICO','CRITICO','Armazenamento critico',null,round($freePct,1).'%',round($free/1024,1).' GB livres.');}
else{$stmt=$mysqli->prepare("UPDATE ti_pc_eventos SET resolvido=1,status_revisao='RESOLVIDO',resolvido_por='SISTEMA',resolvido_em=NOW() WHERE agente_id=? AND tipo='ARMAZENAMENTO_CRITICO' AND resolvido=0");$stmt->bind_param('i',$id);$stmt->execute();$stmt->close();}
$currentCode=(int)($cfg['current_agent_version_code']??1);if($ints['agent_version_code']<$currentCode){$version=(string)($cfg['current_agent_version']??'');$stmt=$mysqli->prepare("SELECT id FROM ti_pc_eventos WHERE agente_id=? AND tipo='AGENTE_DESATUALIZADO' AND resolvido=0 LIMIT 1");$stmt->bind_param('i',$id);$stmt->execute();$open=$stmt->get_result()->fetch_assoc();$stmt->close();if(!$open)pcApiEvent($mysqli,$id,'AGENTE_DESATUALIZADO','ATENCAO','Agente Windows desatualizado',$strings['agent_version'],$version,'Atualizacao recomendada.');}
pcApiAudit($mysqli,'SINCRONIZACAO',$id,(string)$agent['agent_id'],'Inventario tecnico recebido.');
pcApiOut(200,['ok'=>true,'status'=>'ATIVO','server_time'=>date(DATE_ATOM),'sync_interval_min'=>(int)($cfg['sync_interval_min']??30),'current_agent_version'=>(string)($cfg['current_agent_version']??'1.0.0'),'current_agent_version_code'=>$currentCode]);
