/**
  * Get port OID list for the SNMP model && create ports in DB if they don't exists
  *
  * @param $ID_Device : ID of device
  * @param $type : type of device (NETWORKING_TYPE, PRINTER_TYPE ...)
  * @param $oidsModel : oid list from model SNMP
  * @param $oidvalues : list of values from agent query
  * @param $ArrayPort_LogicalNum_SNMPNum : array logical port number => SNMP port number (ifindex)
  * @param $ArrayPort_LogicalNum_SNMPName : array logical port number => SNMP Port name
  *
  * @return $oidList : array with logic number => portsID from snmp
  *
  **/
 static function getOIDPorts($ID_Device, $type, $oidsModel, $oidvalues, $ArrayPort_LogicalNum_SNMPName, $ArrayPort_LogicalNum_SNMPNum)
 {
     global $DB, $LANG;
     if ($_SESSION['fusioninventory_logs'] == "1") {
         $logs = new PluginFusioninventoryLogs();
     }
     $manufCisco = new PluginFusioninventoryManufacturerCisco();
     $netwire = new Netwire();
     $np = new Netport();
     $ptp = new PluginFusioninventoryPort();
     if ($_SESSION['fusioninventory_logs'] == "1") {
         $logs->write("fusioninventory_fullsync", ">>>>>>>>>> Get OID ports list (SNMP model) and create ports in DB if not exists <<<<<<<<<<", $type, $ID_Device, 1);
     }
     $portcounter = $oidvalues[$oidsModel[1][0][""]][""];
     if ($_SESSION['fusioninventory_logs'] == "1") {
         $logs->write("fusioninventory_fullsync", "oid port counter : " . $oidsModel[1][0][""] . " = " . $portcounter, $type, $ID_Device, 1);
     }
     $oid_ifType = $oidsModel[0][1]['ifType'];
     if ($_SESSION['fusioninventory_logs'] == "1") {
         $logs->write("fusioninventory_fullsync", "type of port : " . $oid_ifType, $type, $ID_Device, 1);
     }
     asort($ArrayPort_LogicalNum_SNMPNum);
     // Reorder ports with good logic number
     $query = "SELECT `last_PID_update`\n             FROM `glpi_plugin_fusioninventory_networking`\n             WHERE `FK_networking`='" . $ID_Device . "'\n                   AND `last_PID_update`='0';";
     $result = $DB->query($query);
     if ($DB->numrows($result) == 1) {
         foreach ($ArrayPort_LogicalNum_SNMPNum as $num => $ifIndex) {
             $query_update = "UPDATE `glpi_networking_ports`\n                          SET `logical_number`='" . $ifIndex . "'\n                          WHERE `on_device`='" . $ID_Device . "'\n                                AND `device_type`='" . $type . "'\n                                AND `name`='" . $ArrayPort_LogicalNum_SNMPName[$num] . "';";
             $DB->query($query_update);
         }
     }
     // Get query SNMP to have number of ports
     if (isset($portcounter) and !empty($portcounter)) {
         // ** Add ports in DataBase if they don't exists
         $logicalnumberlist = "(";
         foreach ($ArrayPort_LogicalNum_SNMPNum as $num => $ifIndex) {
             //$i is the logical number
             $logicalnumberlist .= $ifIndex . ",";
             //for ($i=0 ; $i < $portcounter ; $i++) {
             // Get type of port
             $ifType = $oidvalues[$oid_ifType . "." . $ArrayPort_LogicalNum_SNMPNum[$num]][""];
             $oidList[$i] = $ArrayPort_LogicalNum_SNMPNum[$num];
             if (strstr($ifType, "ethernetCsmacd") or $ifType == "6" or $ifType == "ethernet-csmacd(6)" or strstr($ifType, "iso88023Csmacd") or $ifType == "7") {
                 $goodname = 1;
                 if ($manufCisco->ListVirtualPorts($oidvalues[".1.3.6.1.2.1.1.1.0"][""], $ArrayPort_LogicalNum_SNMPName[$num]) == true) {
                     $goodname = 0;
                     $deleteportname[] = $ifIndex;
                     unset($oidList[$ifIndex]);
                 }
                 if ($goodname == 1) {
                     $query = "SELECT `ID`, `name`\n                         FROM `glpi_networking_ports`\n                         WHERE `on_device`='" . $ID_Device . "'\n                               AND `device_type`='" . $type . "'\n                               AND `logical_number`='" . $ifIndex . "';";
                     $result = $DB->query($query);
                     if ($DB->numrows($result) == 0) {
                         unset($array);
                         $array["logical_number"] = $ifIndex;
                         $array["name"] = $ArrayPort_LogicalNum_SNMPName[$num];
                         $array["on_device"] = $ID_Device;
                         $array["device_type"] = $type;
                         $IDport = $np->add($array);
                         Event::log(0, "networking", 5, "inventory", "FusionInventory " . $LANG["log"][70]);
                         if ($_SESSION['fusioninventory_logs'] == "1") {
                             $logs->write("fusioninventory_fullsync", "Add port in DB (glpi_networking_ports) : " . $ArrayPort_LogicalNum_SNMPName[$i], $type, $ID_Device, 1);
                         }
                     } else {
                         $IDport = $DB->result($result, 0, "ID");
                         if ($DB->result($result, 0, "name") != $ArrayPort_LogicalNum_SNMPName[$num]) {
                             unset($array);
                             $array["name"] = $ArrayPort_LogicalNum_SNMPName[$num];
                             $array["ID"] = $DB->result($result, 0, "ID");
                             $np->update($array);
                             if ($_SESSION['fusioninventory_logs'] == "1") {
                                 $logs->write("fusioninventory_fullsync", "Update port in DB (glpi_networking_ports) : ID" . $DB->result($result, 0, "ID") . " & name " . $ArrayPort_LogicalNum_SNMPName[$i], $type, $ID_Device, 1);
                             }
                         }
                     }
                     if ($type == NETWORKING_TYPE) {
                         $queryFusionInventoryPort = "SELECT `ID`\n                                       FROM `glpi_plugin_fusioninventory_networking_ports`\n                                       WHERE `FK_networking_ports`='" . $IDport . "';";
                         $resultFusionInventoryPort = $DB->query($queryFusionInventoryPort);
                         if ($DB->numrows($resultFusionInventoryPort) == 0) {
                             $queryInsert = "INSERT INTO `glpi_plugin_fusioninventory_networking_ports`\n                                                 (`FK_networking_ports`)\n                                     VALUES ('" . $IDport . "');";
                             $DB->query($queryInsert);
                             if ($_SESSION['fusioninventory_logs'] == "1") {
                                 $logs->write("fusioninventory_fullsync", "Add port in DB (glpi_plugin_fusioninventory_networking_ports) : ID " . $IDport, $type, $ID_Device, 1);
                             }
                         }
                     }
                 }
             }
         }
         $logicalnumberlist .= ")";
     }
     // Delete all ports that will be not here
     $nn = new NetworkPort_NetworkPort();
     foreach ($deleteportname as $id => $i) {
         $query = "SELECT *\n                FROM `glpi_networking_ports`\n                WHERE `on_device`='" . $ID_Device . "'\n                      AND `device_type`='" . $type . "'\n                      AND `logical_number`='" . $i . "';";
         $result = $DB->query($query);
         $data = $DB->fetch_assoc($result);
         PluginFusioninventorySnmphistory::addLogConnection("remove", $netwire->getOppositeContact($data['ID']), $FK_process);
         PluginFusioninventorySnmphistory::addLogConnection("remove", $data['ID'], $FK_process);
         if ($nn->getFromDBForNetworkPort($data['ID'])) {
             $nn->delete($data);
         }
         $ptp->deleteFromDB($data["ID"], 1);
         $np->delete($data);
     }
     // Delete ports where logical number in glpi_plugin_fusioninventory_networking_ports
     // not exist on switch : it's ports reorder not well
     $logicalnumberlist = str_replace(",)", ")", $logicalnumberlist);
     $query = "SELECT *\n             FROM `glpi_networking_ports`\n             WHERE `on_device`='" . $ID_Device . "'\n                   AND `device_type`='" . $type . "'\n                   AND `logical_number` NOT IN " . $logicalnumberlist . ";";
     $result = $DB->query($query);
     while ($data = $DB->fetch_array($result)) {
         PluginFusioninventorySnmphistory::addLogConnection("remove", $netwire->getOppositeContact($data['ID']), $FK_process);
         PluginFusioninventorySnmphistory::addLogConnection("remove", $data['ID'], $FK_process);
         if ($nn->getFromDBForNetworkPort($data['ID'])) {
             $nn->delete($data);
         }
         $np->delete($data);
         $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking_ports`\n                       WHERE `FK_networking_ports`='" . $data["ID"] . "';";
         $DB->query($query_delete);
     }
     return $oidList;
 }
function plugin_pre_item_purge_fusioninventory($parm)
{
    global $DB;
    if (isset($parm["_item_type_"])) {
        switch ($parm["_item_type_"]) {
            case NETWORKING_TYPE:
                // Delete all ports
                $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking`\n                             WHERE `FK_networking`='" . $parm["ID"] . "';";
                $DB->query($query_delete);
                $query_select = "SELECT `glpi_plugin_fusioninventory_networking_ports`.`ID`\n                             FROM `glpi_plugin_fusioninventory_networking_ports`\n                                  LEFT JOIN `glpi_networking_ports`\n                                            ON `glpi_networking_ports`.`ID` = `FK_networking_ports`\n                             WHERE `on_device`='" . $parm["ID"] . "'\n                                   AND `device_type`='" . NETWORKING_TYPE . "';";
                $result = $DB->query($query_select);
                while ($data = $DB->fetch_array($result)) {
                    $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking_ports`\n                                WHERE `ID`='" . $data["ID"] . "';";
                    $DB->query($query_delete);
                }
                $query_select = "SELECT `glpi_plugin_fusioninventory_networking_ifaddr`.`ID`\n                             FROM `glpi_plugin_fusioninventory_networking_ifaddr`\n                                  LEFT JOIN `glpi_networking`\n                                            ON `glpi_networking`.`ID` = `FK_networking`\n                             WHERE `FK_networking`='" . $parm["ID"] . "';";
                $result = $DB->query($query_select);
                while ($data = $DB->fetch_array($result)) {
                    $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking_ifaddr`\n                                WHERE `ID`='" . $data["ID"] . "';";
                    $DB->query($query_delete);
                }
                break;
            case PRINTER_TYPE:
                $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_printers`\n                             WHERE `FK_printers`='" . $parm["ID"] . "';";
                $DB->query($query_delete);
                $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_printers_cartridges`\n                             WHERE `FK_printers`='" . $parm["ID"] . "';";
                $DB->query($query_delete);
                $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_printers_history`\n                             WHERE `FK_printers`='" . $parm["ID"] . "';";
                $DB->query($query_delete);
                break;
            case PLUGIN_FUSIONINVENTORY_MAC_UNKNOWN:
                // Delete ports and connections if exists
                $np = new Netport();
                $nn = new NetworkPort_NetworkPort();
                $query = "SELECT `ID`\n                      FROM `glpi_networking_ports`\n                      WHERE `on_device` = '" . $parm["ID"] . "'\n                            AND `device_type` = '" . PLUGIN_FUSIONINVENTORY_MAC_UNKNOWN . "';";
                $result = $DB->query($query);
                while ($data = $DB->fetch_array($result)) {
                    if ($nn->getFromDBForNetworkPort($data['ID'])) {
                        $nn->delete($data);
                    }
                    $np->delete(array("ID" => $data["ID"]));
                }
                break;
        }
    }
    return $parm;
}