<?php
include_once('Solution.class.php');
class Instance
{
  private $id;
  private $instance_name;
  private $solutions; // HashMap<idCandidate, Solution>
  private $averageScore;
  private $medianScore;
  
  public function __construct($p_id)
  {
    $bdd = BDD::getBDD();
    $this->solutions = array();
    $req = $bdd->prepare('SELECT * FROM InstancesX WHERE id_instance=:i');
    $req->execute(array('i'=>$p_id));
    $result = $req->fetch();
    $this->id = $result['id_instance'];
    $this->instance_name = $result['instance_name'];
    $req = $bdd->prepare('SELECT * FROM Solutions2005 s, Candidates2005 c
WHERE c.id = s.numCandidate AND numInstance=:i');
    $req->execute(array('i'=>$p_id));
    while($result = $req->fetch())
      {
	$candidate = new Candidate($result['id'],$result['candidate_name']);
	$solution = new Solution($result['id_Solution'], $result['HPRC'], $result['LPRC'], $result['PCC'], $result['mark'], $result['rank'],$result['normalized_mark'],$candidate->getIdCandidate());
	$this->solutions[$candidate->getIdCandidate()] = $solution;
      }
    $req = $bdd->prepare('SELECT AVG(mark) as average FROM Solutions2005 WHERE numInstance=:i and hasReturned=true');
    $req->execute(array('i'=>$p_id));
    $result=$req->fetch();
    $this->averageScore = $result['average'];

    $req=$bdd->prepare('SELECT mark FROM InstancesX i, Solutions2005 s where s.numInstance=i.id_instance and numInstance=:i order by mark ASC');
    $req->execute(array('i'=>$this->id));
    $marks = array();
    while($result = $req->fetch())
      {
	array_push($marks, $result['mark']);
      }
    $nbCandidates =  count($marks);
    $this->medianScore=0;
    if(($nbCandidates%2)==1)
      {
	$median=floor($nbCandidates/2);
	$this->medianScore = $marks[$median];
      }
    else
      {
	$median=$nbCandidates/2;
	$this->medianScore = ($marks[$median]+$marks[$median-1])/2;
      }
    $req=$bdd->prepare('UPDATE InstancesX SET medianScore=:m WHERE id_instance=:i');
    $req->execute(array('m'=>$this->medianScore,
			'i'=>$this->id));
    
  }

  public function getId()
  {
    return $this->id;
  }
  public function getInstanceName()
  {
    return $this->instance_name;
  }
  public function getSolutions()
  {
    return $this->solutions;
  }
  public function getAverageScore()
  {
    return $this->averageScore;
  }
  public function getMedianScore()
  {
    return $this->medianScore;
  }
  public function setMedianScore($p_m)
  {
    $this->medianScore=$p_m;
  }
  public function getSolutionByCandidate($p_candidate)
  {
    return $this->solutions[$p_candidate];
  }
  
  public function computeAverage()
  {
    $bdd = BDD::getBDD();
    $req = $bdd->prepare('UPDATE InstancesX SET averageScore=:a where id_instance=:i');    
    $req->execute(array('a'=>$this->averageScore,
			'i'=>$this->id));
  }

}
?>