<?php

/**
 * FusionInventory
 *
 * Copyright (C) 2010-2016 by the FusionInventory Development Team.
 *
 * http://www.fusioninventory.org/
 * https://github.com/fusioninventory/fusioninventory-for-glpi
 * http://forge.fusioninventory.org/
 *
 * ------------------------------------------------------------------------
 *
 * LICENSE
 *
 * This file is part of FusionInventory project.
 *
 * FusionInventory is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * FusionInventory is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with FusionInventory. If not, see <http://www.gnu.org/licenses/>.
 *
 * ------------------------------------------------------------------------
 *
 * This file is used to manage the network discovery state.
 *
 * ------------------------------------------------------------------------
 *
 * @package   FusionInventory
 * @author    David Durieux
 * @copyright Copyright (c) 2010-2016 FusionInventory team
 * @license   AGPL License 3.0 or (at your option) any later version
 *            http://www.gnu.org/licenses/agpl-3.0-standalone.html
 * @link      http://www.fusioninventory.org/
 * @link      https://github.com/fusioninventory/fusioninventory-for-glpi
 *
 */

if (!defined('GLPI_ROOT')) {
   die("Sorry. You can't access this file directly");
}

/**
 * Manage the network discovery state.
 */
class PluginFusioninventoryStateDiscovery extends CommonDBTM {

   /**
    * The right name for this class
    *
    * @var string
    */
   static $rightname = 'plugin_fusioninventory_task';


   /**
    * Update state of discovery
    *
    * @param integer $p_number
    * @param array $a_input
    * @param integer $agent_id
    */
   function updateState($p_number, $a_input, $agent_id) {
      $data = $this->find(
            ['plugin_fusioninventory_taskjob_id' => $p_number,
             'plugin_fusioninventory_agents_id'  => $agent_id]);
      if (count($data) == "0") {
         $input = [];
         $input['plugin_fusioninventory_taskjob_id'] = $p_number;
         $input['plugin_fusioninventory_agents_id'] = $agent_id;
         $id = $this->add($input);
         $this->getFromDB($id);
         $data[$id] = $this->fields;
      }

      foreach ($data as $process_id=>$input) {
         foreach ($a_input as $field=>$value) {
            if ($field == 'nb_ip'
                    || $field == 'nb_found'
                    || $field == 'nb_error'
                    || $field == 'nb_exists'
                    || $field == 'nb_import') {

                $input[$field] = $data[$process_id][$field] + $value;
            } else {
               $input[$field] = $value;
            }
         }
         $this->update($input);
      }
      // If discovery and query are finished, we will end Process
      $this->getFromDB($process_id);
      $doEnd = 1;
      if (($this->fields['threads'] != '0')
              && ($this->fields['end_time'] == '')) {
         $doEnd = 0;
      }

      if ($doEnd == '1') {
         $this->endState($p_number, date("Y-m-d H:i:s"), $agent_id);
      }
   }


   /**
    * End the state process
    *
    * @param integer $p_number
    * @param string $date_end
    * @param integer $agent_id
    */
   function endState($p_number, $date_end, $agent_id) {
      $data = $this->find(
            ['plugin_fusioninventory_taskjob_id' => $p_number,
             'plugin_fusioninventory_agents_id'  => $agent_id]);
      foreach ($data as $input) {
         $input['end_time'] = $date_end;
         $this->update($input);
      }
   }


   /**
    * Display the discovery state
    *
    * @global object $DB
    * @global array $CFG_GLPI
    * @param array $options
    */
   function display($options = []) {
      global $DB, $CFG_GLPI;

      $pfAgent = new PluginFusioninventoryAgent();
      $pfTaskjobstate = new PluginFusioninventoryTaskjobstate();
      $pfTaskjoblog = new PluginFusioninventoryTaskjoblog();
      $pfStateInventory = new PluginFusioninventoryStateInventory();
      $pfTaskjob = new PluginFusioninventoryTaskjob();

      $start = 0;
      if (isset($_REQUEST["start"])) {
         $start = $_REQUEST["start"];
      }

      // Total Number of events
      $querycount = "SELECT count(*) AS cpt FROM `glpi_plugin_fusioninventory_taskjobstates`
         LEFT JOIN `glpi_plugin_fusioninventory_taskjobs`
            ON `plugin_fusioninventory_taskjobs_id` = `glpi_plugin_fusioninventory_taskjobs`.`id`
         WHERE `method` = 'networkdiscovery'
         GROUP BY `uniqid`
         ORDER BY `uniqid` DESC ";

      $resultcount = $DB->query($querycount);
      $number = $DB->numrows($resultcount);

      // Display the pager
      Html::printPager($start, $number, Plugin::getWebDir('fusioninventory')."/front/statediscovery.php", '');

      echo "<table class='tab_cadre_fixe'>";

      echo "<tr class='tab_bg_1'>";
      echo "<th>".__('Unique id', 'fusioninventory')."</th>";
      echo "<th>".__('Task job', 'fusioninventory')."</th>";
      echo "<th>".__('Agent', 'fusioninventory')."</th>";
      echo "<th>".__('Status')."</th>";
      echo "<th>".__('Starting date', 'fusioninventory')."</th>";
      echo "<th>".__('Ending date', 'fusioninventory')."</th>";
      echo "<th>".__('Total duration')."</th>";
      echo "<th>".__('Threads number', 'fusioninventory')."</th>";
      echo "<th>".__('Total discovery devices', 'fusioninventory')."</th>";
      echo "<th>".__('Devices not imported', 'fusioninventory')."</th>";
      echo "<th>".__('Devices linked', 'fusioninventory')."</th>";
      echo "<th>".__('Devices imported', 'fusioninventory')."</th>";
      echo "</tr>";

      $sql = "SELECT `glpi_plugin_fusioninventory_taskjobstates`.*
            FROM `glpi_plugin_fusioninventory_taskjobstates`
         LEFT JOIN `glpi_plugin_fusioninventory_taskjobs`
            ON `plugin_fusioninventory_taskjobs_id` = `glpi_plugin_fusioninventory_taskjobs`.`id`
         WHERE `method` = 'networkdiscovery'
         GROUP BY `uniqid`
         ORDER BY `uniqid` DESC
         LIMIT ".intval($start).", " . intval($_SESSION['glpilist_limit']);

      $result=$DB->query($sql);
      while ($data=$DB->fetchArray($result)) {
         echo "<tr class='tab_bg_1'>";
         echo "<td>".$data['uniqid']."</td>";
         $pfTaskjob->getFromDB($data['plugin_fusioninventory_taskjobs_id']);
         echo "<td>";
         $link = $pfTaskjob->getLink();
         $link = str_replace('.form', '', $link);
         echo $link;
         echo "</td>";
         $pfAgent->getFromDB($data['plugin_fusioninventory_agents_id']);
         echo "<td>".$pfAgent->getLink(1)."</td>";
         $nb_found = 0;
         $nb_threads = 0;
         $start_date = "";
         $end_date = "";
         $notimporteddevices= 0;
         $updateddevices = 0;
         $createddevices = 0;
         $a_taskjobstates = $pfTaskjobstate->find(['uniqid' => $data['uniqid']]);
         foreach ($a_taskjobstates as $datastate) {
            $a_taskjoblog = $pfTaskjoblog->find(['plugin_fusioninventory_taskjobstates_id' => $datastate['id']]);
            foreach ($a_taskjoblog as $taskjoblog) {
               if (strstr($taskjoblog['comment'], " ==devicesfound==")) {
                  $nb_found += str_replace(" ==devicesfound==", "", $taskjoblog['comment']);
               } else if (strstr($taskjoblog['comment'], "==importdenied==")) {
                  $notimporteddevices++;
               } else if (strstr($taskjoblog['comment'], "==updatetheitem==")) {
                  $updateddevices++;
               } else if (strstr($taskjoblog['comment'], "==addtheitem==")) {
                  $createddevices++;
               } else if ($taskjoblog['state'] == "1") {
                  $nb_threads = str_replace(" threads", "", $taskjoblog['comment']);
                  $start_date = $taskjoblog['date'];
               }

               if (($taskjoblog['state'] == "2")
                  OR ($taskjoblog['state'] == "3")
                  OR ($taskjoblog['state'] == "4")
                  OR ($taskjoblog['state'] == "5")) {

                  if (!strstr($taskjoblog['comment'], 'Merged with ')) {
                     $end_date = $taskjoblog['date'];
                  }
               }
            }
         }
         // State
         echo "<td>";
         switch ($data['state']) {

            case 0:
               echo __('Prepared', 'fusioninventory');
               break;

            case 1:
            case 2:
               echo __('Started', 'fusioninventory');
               break;

            case 3:
               echo __('Finished tasks', 'fusioninventory');
               break;

         }
         echo "</td>";

         echo "<td>".Html::convDateTime($start_date)."</td>";
         echo "<td>".Html::convDateTime($end_date)."</td>";

         if ($end_date == '') {
            $end_date = date("Y-m-d H:i:s");
         }
         if ($start_date == '') {
            echo "<td>-</td>";
         } else {
            $interval = '';
            if (phpversion() >= 5.3) {
               $date1 = new DateTime($start_date);
               $date2 = new DateTime($end_date);
               $interval = $date1->diff($date2);
               $display_date = '';
               if ($interval->h > 0) {
                  $display_date .= $interval->h."h ";
               } else if ($interval->i > 0) {
                  $display_date .= $interval->i."min ";
               }
               echo "<td>".$display_date.$interval->s."s</td>";
            } else {
               $interval = $pfStateInventory->dateDiff($start_date, $end_date);
            }
         }
         echo "<td>".$nb_threads."</td>";
         echo "<td>".$nb_found."</td>";
         echo "<td>".$notimporteddevices."</td>";
         echo "<td>".$updateddevices."</td>";
         echo "<td>".$createddevices."</td>";
         echo "</tr>";
      }
      echo "</table>";
   }
}
