<?php
/*******************************************************************************
 * Copyright (c) 2017 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

require_once(dirname(__FILE__) . '/../classes/Project.class.php');
require_once(dirname(__FILE__) . '/../classes/common.php');
require_once(dirname(__FILE__) . '/../classes/database.inc');

class IPZilla {
 var $cqs = array();

 public static function getInstance() {
  $ipzilla = new IPZilla();
  $ipzilla->load();

  return $ipzilla;
 }

 public function getCq($id) {
  return @$this->cqs[$id];
 }

 public function rootCqsDo($function) {
  foreach($this->cqs as $cq) {
   if ($cq->isRoot()) $function($cq);
  }
 }

 public function asArray() {
  $data = array();
  $this->rootCqsDo(function($cq) use (&$data) {
   $data[$cq->getId()] = $cq->asArray();
  });
  return $data;
 }

 private function load() {
  $sql = "
    select
      cq.id, cq.root, cq.project, cq.name,
      cq.version, cq.description,
      cq.cq_type, cq.dd_type, cq.created,
      cq.status, cq.resolution, cq.state,
      cq.licenses, cq.spdx, cq.keywords,
      group_concat(piggyback.id) as piggybacks
    from CQ as cq
     left join CQ as piggyback on cq.id != piggyback.id and cq.id=piggyback.root
    where cq.state in ('approved', 'license_certified')
     and cq.cq_type in ('thirdparty', 'piggyback')
    group by cq.id
";

  query('dashboard', $sql, array(), function($row) {
   $this->cqs[$row['id']] = new CQ($this, $row);
  });

  $this->initialize();
  $this->loadFilePatterns();
  $this->loadMvnPatterns();
  $this->loadExpressions();
 }

 private function initialize() {
//   foreach($this->cqs as $cq) {
//    if ($cq->isRoot()) continue;
//    $cq->getRoot()->data['piggybacks'][$cq->getId()] = $cq->getProjectId() ;
//   }
 }

 private function loadFilePatterns() {
  query('dashboard', 'select distinct cq, pattern from CQBundleMap', array(), function($row) {
   if ($cq = @$this->cqs[$row['cq']]) {
    $cq->addFilePattern($row['pattern']);
    $cq->data['bundles'][] = $row['pattern'];
   }
  });

  query('dashboard', 'select distinct cq, name, version, file from CQOrbit', array(), function($row) {
   if ($cq = @$this->cqs[$row['cq']]) {
    $cq->addFilePattern($row['file']);
    $cq->data['orbit'][] = $row;
   }
  });
 }

 private function loadMvnPatterns() {
  $sql = "
    select distinct
      mvn.cq,
      mvn.pattern,
      group_concat(distinct r.cq) as related
    from CQMavenMap as mvn
      join CQMavenMap as r
        on mvn.groupid=r.groupid
          and mvn.artifactid=r.artifactid
    group by mvn.cq;
  ";
  query('dashboard', $sql, array(), function($row) use (&$maven) {
   if ($cq = @$this->cqs[$row['cq']]) {
    $cq->addMvnPattern($row['pattern']);
    $cq->data['related'] = explode(',', $row['related']);
   }
  });
 }
 private function loadExpressions() {
 	$sql = "
    select distinct
      cq,
      expression
    from CQExpression;
  ";
 	query('dashboard', $sql, array(), function($row) {
 		if ($cq = @$this->cqs[$row['cq']]) {
 			$cq->data['expressions'][] = $row['expression'];
 		}
 	});
 }
}

class CQ {
 var $ipzilla;
 var $data;
 var $root;
 var $keywords;

 public function __construct($ipzilla, $data) {
  $this->ipzilla = $ipzilla;
  $this->data = $data;

  // Cache information
  $this->keywords = preg_split('/\s*,\s*/',$this->data['keywords']);
 }

 public function getId() {
  return $this->data['id'];
 }

 public function getName() {
  return $this->data['name'];
 }

 public function getVersion() {
  return $this->data['version'];
 }

 public function getDescription() {
  return $this->data['description'];
 }

 public function getLicenses() {
  return $this->data['licenses'];
 }

 public function getSPDX() {
  return $this->data['spdx'];
 }

 public function getProject() {
  return Project::getProject($this->getProjectId());
 }

 public function getProjectId() {
  return $this->data['project'];
 }

 public function getPiggybackIds() {
  if (empty($this->data['piggybacks'])) return array();
  return explode(',', $this->data['piggybacks']);
 }

 public function getPiggybacks() {
  $piggybacks = array();
  foreach($this->getPiggybackIds() as $id) {
   if ($cq = $this->ipzilla->getCq($id)) {
    $piggybacks[] = $cq;
   }
  }
  return $piggybacks;
 }

 public function getState() {
  return $this->data['state'];
 }

 public function getStatus() {
  return $this->data['status'];
 }

 public function getResolution() {
  return $this->data['resolution'];
 }

 public function getKeywords() {
  return $this->data['keywords'];
 }

 public function getFilePatterns() {
  return @$this->data['filePatterns'];
 }

 public function getMvnPatterns() {
  return @$this->data['mvnPatterns'];
 }

 public function getType() {
  return $this->data['cq_type'];
 }

 public function getDueDiligenceType() {
  return $this->data['dd_type'];
 }

 public function isRoot() {
  return $this == $this->getRoot();
 }

 public function getRoot() {
  if ($id = $this->getRootId()) {
   return $this->ipzilla->getCQ($id);
  }
  return $this;
 }

 public function getRootId() {
  return $this->data['root'];
 }

 public function getParent() {
  if ($id = $this->getParentId()) {
   return $this->ipzilla->getCq($id);
  }
  return null;
 }

 private function getParentId() {
  if (preg_match ( '/\W(?:\(ATO|PB|Orbit)[^\d\)]*([0-9]+)/i', $this->getDescription(), $matches)) {
   return $matches [1];
  }
  return null;
 }

 public function isResolved() {
  if (!$this->getStatus()) return false;
  return in_array($this->getStatus(), array('RESOLVED', 'VERIFIED', 'CLOSED'));
 }

 public function isFixed() {
  if (!$this->isResolved()) return false;
  return $this->getResolution() == 'FIXED';
 }

 public function isApproved() {
  if (!$this->isResolved()) return false;
  return $this->getState() == 'approved';
 }

 public function isProjectCode() {
  return in_array('projectcode', $this->keywords);
 }

 public function isThirdParty() {
  return in_array('thirdparty', $this->keywords);
 }

 function asArray() {
  return $this->data;
 }

 function addFilePattern($value) {
  if (preg_match('/(\S*\/)?([\w\.\-]+)[_-]((?:\d+\.){3})(.*\.)?jar/', $value, $matches)) {
   $pattern = $matches[1] . $matches[2] . '_' . $matches[3];
   $regex = $matches[1] . $matches[2] . '[_-]' . $matches[3];
   $regex = str_replace('.', '\.', $regex);
   $regex = str_replace('/', '\/', $regex);
   $regex = $regex . '(.*\.)?jar';
   $pattern = "$pattern*.jar";

   $this->data['filePatterns'][$pattern] = $regex;

   // Only generate a source bundle mapping if this isn't a source bundle.
   if (!preg_match('/\.source$/', $matches[2])) {
    $sourcePattern = $matches[1] . $matches[2]. '.source_' . $matches[3];
    $sourceRegex = $matches[1] . $matches[2] . '.source[_-]' . $matches[3];
    $sourceRegex = str_replace('.', '\.', $sourceRegex);
    $regex = str_replace('/', '\/', $regex);
    $sourceRegex = $sourceRegex . '(.*\.)?jar';
    $sourcePattern = "$sourcePattern*.jar";

    $this->data['filePatterns'][$pattern] = $regex;
   }
  } else {
   $pattern = $value;
   $regex = str_replace('.', '\.', $pattern);
   $regex = str_replace('/', '\/', $regex);

   $this->data['filePatterns'][$pattern] = $regex;
  }
 }

 function addMvnPattern($value) {
  if (isset($this->data['mvnPatterns']) && in_array($value, $this->data['mvnPatterns'])) return;
  $this->data['mvnPatterns'][] = $value;
 }

 function getRelatedCqs() {
  $related = array();
  if (isset($this->data['related'])){
   foreach($this->data['related'] as $id) {
    if ($id == $this->getId()) continue;
    if ($cq = $this->ipzilla->getCQ($id)) {
     $related[] = $cq;
    }
   }
  }
  return $related;
 }
}
?>