<?php

// 使用 $Lin->PN 来获取数据
$PostData = $Lin->PN("data","0","1","data");

// 解码数据（使用LinKey进行解密）
$DecodeData = $LinKey->Decode($PostData);

// 使用LinJson->NewJson解析JSON，添加第四个参数 isJsonString 为 true

// 检查是否获取到有效数据
if (empty($DecodeData)) {
    die($LinJson->err("Decode解密失败"));
}else{
    if (is_string($DecodeData) && is_array(json_decode($DecodeData, true))) {
        $GetData = $LinJson->NewJson($DecodeData, null, true, true);
    } else {
        die($LinJson->err("Json无效的数据格式"));
    }
}
//echo $DecodeData;
// 使用 LinJson->Get 方法从 JSON 中提取设备信息
$BoxId    = $GetData["boxid"] ?? "";
$DevId    = $GetData["devid"] ?? "";
$Mac      = $GetData["mac"] ?? "";
$SN       = $GetData["sn"] ?? "";
$uuid     = $GetData["uuid"] ?? "";
$OS       = $GetData["os"] ?? "";
$arch     = $GetData["arch"] ?? "";
$version  = $GetData["version"] ?? "";
$softver  = $GetData["softver"] ?? "";

// 设备基本信息
$name     = $GetData['name'] ?? "";
$model    = $GetData['model'] ?? "";
$brand    = $GetData['brand'] ?? "";
$Client   = $GetData['client'] ?? "";
$Desktop  = $GetData['desktop'] ?? "";
$Board    = $GetData['board'] ?? "";
$Maker    = $GetData['maker'] ?? "";
$locale   = $GetData['locale'] ?? "";
$SeLinux  = $GetData['selinux'] ?? "";
$adbport  = $GetData['adbport'] ?? "";
$adbstate = $GetData['adbstate'] ?? "";
$sdk      = $GetData['sdk'] ?? "";
$cpudtb   = $GetData['dtb'] ?? "";
$release  = $GetData['release'] ?? "";
// 系统信息
$HostName = $GetData['hostname'] ?? "";
$runTime  = $GetData['runtime'] ?? "";
$openTime = $GetData['opentime'] ?? "";

// 检查必要的参数
if (empty($BoxId)) {
    die($LinJson->err("BoxId 不能为空"));
}

// 网络信息处理 - 智能检测可用的网络接口

$ipv4 = $ipv6 = $netmac = $netname = $netipv4 = $netipv6 = $netinfo = $netisp = $NetData = "";
$CPUData = $cpumhz = $cpucores = $cputhreads = $cpuvendorId = $cpumodelName = $cpuUsedPercent = "";
$MemoryData = $memtotal = $memused = $memavailable = $memUsedPercent = $memData = "";

// 磁盘信息
$diskfolder = "";
$disktotal = 0;
$diskfree = 0;
$diskused = 0;
$diskUsedPercent = 0;
$diskName = "";
$diskSize = "";
$diskSerial = "";
$diskData = "";
$DiskDataJson = "";

// 检查设备中的网络数据
if (isset($GetData['device'])) {
    //处理网络
    if (isset($GetData['device']['network']) && is_array($GetData['device']['network'])) {
        $FirstNetWork = null;
        $NetWorkData = $GetData['device']['network'];
        // 处理网络数据
        if (!empty($NetWorkData)) {
            foreach ($NetWorkData as $ifName => $ifData) {
                //找到活跃接口  $ifName
                if (isset($ifData['status']) && strtoupper($ifData['status']) === 'UP') {
                    $FirstNetWork = $ifData;
                    $netname = $ifName;
                    break;
                }
            }
            //未找到活跃接口，使用第一个接口
            if (!$FirstNetWork && !empty($NetWorkData)) {
                reset($NetWorkData);
                $netname = key($NetWorkData);
                $FirstNetWork = $NetWorkData[$netname];
            }
            // 提取网络信息
            if ($FirstNetWork) {
                $ipv4   = isset($FirstNetWork['ipv4']) ? (is_array($FirstNetWork['ipv4']) ? ($FirstNetWork['ipv4'][0] ?? "") : (string)$FirstNetWork['ipv4']) : "";
                $ipv6   = isset($FirstNetWork['ipv6']) ? (is_array($FirstNetWork['ipv6']) ? ($FirstNetWork['ipv6'][0] ?? "") : (string)$FirstNetWork['ipv6']) : "";
                $netmac = isset($FirstNetWork['mac']) ? $FirstNetWork['mac'] : "";
                $NetData = $LinJson->Encode($NetWorkData);
            }
        }
    }
    //CPU
    if (isset($GetData['device']['cpu'])) {
        $CPUData        = $GetData['device']['cpu'];
        $cpumhz         = $CPUData['mhz'];
        $cpucores       = $CPUData['physical_cores'];
        $cputhreads     = $CPUData['logical_cores'];
        $cpuvendorId    = $CPUData['vendor'];
        $cpumodelName   = $CPUData['model'];
        $cpuUsedPercent = $CPUData['use'];
    }
    //内存
    if (isset($GetData['device']['memory'])) {
        $MemoryData     = $GetData['device']['memory'];
        $mentotal       = $MemoryData['total'] ?? "0";
        $menused        = $MemoryData['used'] ?? "0";
        $menavailable   = $MemoryData['available'] ?? "0";
        $menUsedPercent = $MemoryData['use'] ?? "0";

    }
    //磁盘
    if (isset($GetData['device']['disk']) && is_array($GetData['device']['disk'])) {
        $DiskDataJson = $GetData['device']['disk'];
       
        // 查找第一个有use字段的磁盘
        $foundUsableDisk = false;
        foreach ($DiskDataJson as $devicename => $data) {
            if (isset($data['use'])) {
                $diskfolder = isset($data['partitions']) ? "" : ""; // 不需要partitions信息
                $diskName = $data['device'];
                $diskSize = $data['size'] ?? "";
                $diskSerial = $data['serial'] ?? "";
                $disktotal = $data['total'] ?? 0;
                $diskfree = $data['free'] ?? 0;
                $diskused = $data['used'] ?? 0;
                $diskUsedPercent = $data['use'] ?? 0;
                $foundUsableDisk = true;
                break;
            }
        }
        // 如果没有找到有use字段的磁盘，取第一个磁盘
        if (!$foundUsableDisk && !empty($GetData['device']['disk'])) {
            reset($GetData['device']['disk']);
            $diskName = key($GetData['device']['disk']);
            $diskData = $GetData['device']['disk'][$diskName];
            $diskSize = $diskData['size'] ?? "";
            $diskSerial = $diskData['serial'] ?? "";
            $disktotal = $diskData['total'] ?? 0;
            $diskfree = $diskData['free'] ?? 0;
            $diskused = $diskData['used'] ?? 0;
            $diskUsedPercent = $diskData['use'] ?? 0;
        }
        //$DiskDataJson = ($LinJson->Encode($GetData['device']['disk']) == "[]") ? "" : $LinJson->Encode($GetData['device']['disk']);
        $DiskDataJson = $LinJson->Encode($DiskDataJson);
    }
} 

$NowTime = date('Y-m-d H:i:s');

// 确定系统类型
if ($OS == "android") {
    $Sid = 1;
} else {
    $Sid = 2;
}


//die("调试完成");
// 准备数据
$deviceData = [
    "BoxId"      => $BoxId,
    "DevId"      => $DevId,
    "Sid"        => $Sid,
    "SN"         => $SN,
    "Mac"        => $Mac,
    "uuid"       => $uuid,
    "os"         => $OS,
    "arch"       => $arch,
    "HostName"   => $HostName,
    "SoftVer"    => $softver,
    "Local_IPV4" => $ipv4,
    "Local_IPV6" => $ipv6,
    "Net_Name"   => $netname,
    "Net_Mac"    => $netmac,
    "Net_IPV4"   => $netipv4,
    "Net_IPV6"   => $netipv6,
    "Net_InFo"   => $netinfo,
    "Net_ISP"    => $netisp,
    "Net_Data"   => $NetData,
    "name"       => $name,
    "Desktop"    => $Desktop,
    "Maker"      => $Maker,
    "Board"      => $Board,
    "model"      => $model,
    "brand"      => $brand,
    "Client"     => $Client,
    "adb_Port"   => $adbport,
    "adb_State"  => $adbstate,
    "SeLinux"    => $SeLinux,
    "Language"   => $locale,
    "RunTime"    => $runTime,
    "OpenTime"   => $openTime,
    "version_Number"   => $version,
    "version_SDK"      => $sdk,
    "version_release"  => $release,
    
    "CPU_MHz"          => $cpumhz,
    "CPU_DTB"          => $cpudtb,
    "CPU_Cores"        => $cpucores,
    "CPU_Threads"      => $cputhreads,
    "CPU_VendorId"     => $cpuvendorId,
    "CPU_ModelName"    => $cpumodelName,
    "CPU_UsedPercent"  => $cpuUsedPercent,
    "Men_Total"        => $mentotal,
    "Men_Used"         => $menused,
    "Men_Available"    => $menavailable,
    "Men_UsedPercent"  => $menUsedPercent,
    "Disk_Total"       => $disktotal,
    "Disk_Free"        => $diskfree,
    "Disk_Used"        => $diskused,
    "Disk_UsedPercent" => $diskUsedPercent,
    "Disk_Name"        => $diskName,
    "Disk_Serial"      => $diskSerial,
    "Disk_Data"        => $DiskDataJson,
    "EditTime"         => $NowTime
];

$LinDB->OpenConn();
// 查询数据库中是否已存在该设备
$ExistBoxId = $LinDB->Sel("SELECT Id,EditTime FROM tvbox_list WHERE BoxId = ? LIMIT 1", [$BoxId]);
if (!$ExistBoxId) {
    $deviceData["Addtime"] = $NowTime;
    $LinDB->Insert("tvbox_list", $deviceData);
} else {
    $LinDB->Update("tvbox_list", $deviceData, "BoxId = ?", [$BoxId]);
}
$LinDB->CloseConn();

SaveOnLine($BoxId, $openTime, $NowTime);

die($LinJson->ok("设备数据同步成功"));

function SaveOnLine($BoxId, $RunTime, $NowTime) {

    extract($GLOBALS, EXTR_SKIP);

    if (!$LinDate->IsTime($RunTime)) {
        return "";
    }
    $RunTime =$LinDate->ToDateTime($RunTime);
    $MyData = [
        "BoxId"    => $BoxId,
        "Addtime"  => $RunTime,
        "EditTime" => $NowTime,
        "Online"   => $LinDate->ToOnLineTime($RunTime, $NowTime)
    ];

    $OnLineBoxId = $LinDB->Sel("SELECT Id,AddTime FROM tvbox_online WHERE BoxId = ? AND AddTime = ? LIMIT 1", [$BoxId, $RunTime]);

    if (!$OnLineBoxId) { 
        $LinDB->Insert("tvbox_online", $MyData);
    } else {
        $LinDB->Update("tvbox_online", $MyData, "Id = ?", [$OnLineBoxId["Id"]]);
    }
    $LinDB->CloseConn();
}
?>