<?php

/**
 * File: parse_cci.php
 * Author: Ryan Prather
 * Purpose: Script to parse CCI library
 * Created: Jul 28, 2014
 *
 * Portions Copyright (c) 2012-2015, Salient Federal Solutions
 * Portions Copyright (c) 2008-2011, Science Applications International Corporation (SAIC)
 * Released under Modified BSD License
 *
 * See license.txt for details
 *
 * Change Log:
 *  - Jul 28, 2014 - File created
 */
$cmd = getopt("f:", array('debug::', "help::"));

if (!isset($cmd['f']) || isset($cmd['help'])) {
  usage();
  exit;
}

include_once 'config.inc';
include_once 'database.inc';
include_once 'helper.inc';

chdir(DOC_ROOT);

set_time_limit(0);

$base_name = basename($cmd['f']);
$db = new db();
$err = new Sagacity_Error($cmd['f']);
$match = array();

if (!file_exists($cmd['f'])) {
  $err->script_log("File not found", E_ERROR);
}

$xml = new DOMDocument();
if (!$xml->load($cmd['f'])) {
  $err->script_log("There was an issue loading XML document", E_ERROR);
}

$cci_list = getValue($xml, "/root/cci", null, true);

print "Reading $cci_list->length CCIs" . PHP_EOL;

$all_ccis = array();

foreach ($cci_list as $cci_node) {
  $cci = new cci();
  $cci->cci_id = preg_replace("/CCI\-[0]+/", "", $cci_node->getAttribute("id"));

  if ($cci->cci_id > 3391) {
    break;
  }

  $control = getValue($xml, "control", $cci_node);
  $cci->control_id = preg_replace("/ \(\d+\)/", "", $control);
  $cci->definition = getValue($xml, "definition", $cci_node);
  $cci->guidance = getValue($xml, "guidance", $cci_node);
  $cci->procedure = getValue($xml, "procedure", $cci_node);

  if (preg_match("/ \(([\d]+)\)/", getValue($xml, "control", $cci_node), $match)) {
    $cci->enh_id = $match[1];
  }
  else {
    $cci->enh_id = null;
  }

  $all_ccis[] = $cci;

  print "$cci->cci_id" . PHP_EOL;

  if (count($all_ccis) == 100) {
    print "Saving 100 CCI's" . PHP_EOL;
    $db->save_CCI($all_ccis);
    $all_ccis = array();
  }
}
//die;
print "Saving..." . PHP_EOL;
$db->save_CCI($all_ccis);
print "Done saving " . count($all_ccis) . " CCIs" . PHP_EOL;

function usage() {
  print <<<EOO
Purpose: To parse the NIST CCI list

Usage: php parse_cci.php -f={CCI list file} [--debug] [--help]

 -f={CCI file}      The CCI file to parse

 --debug            Debugging output
 --help             This screen

EOO;
}