<?php

include_once 'Cluster.php';
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of View
 *
 * @author stubbfel
 */
class View {

    private $viewArray;
    private $clusterCount;
    private $peerCount;
    private $viewId;
    private $peerClusterRatioRef;
    private $peerClusterRatioNormVar;
    private $peerClusterRatioNormStDev;
    private $peerClusterRatioNormMed;
    private $clusterList;

    public function __construct($viewArray = array(), $viewId) {
        $this->viewArray = $viewArray;
        $this->clusterCount = $this->viewArray["cn"];
        $this->peerCount = $this->viewArray["pn"];
        $this->viewId = $viewId;
        $this->createClusterList();
        $this->calcPeerClusterRatio();
    }

    private function createClusterList() {
        $clusterArray = $this->viewArray["clusters"];
        $this->clusterList = array();
        foreach ($clusterArray as $key => $value) {
            $cluster = new Cluster($value, $key);
            array_push($this->clusterList, $cluster);
        }
    }

    private function clusterListToHTML() {
        $result = "<table width=\"100%\">";
        foreach ($this->clusterList as $value) {
            $result .= "<tr><td>";
            $result .= $value->toHTML();
            $result .= "</td></tr>";
        }
        return $result . "</table>";
    }

    private function calcPeerClusterRatio() {
        $this->peerClusterRatioRef = round($this->peerCount / $this->clusterCount, 5);
        $variance = 0.0;
        $medianArray = array();
        foreach ($this->clusterList as $value) {
            $value->calcPeerClusterRatioNorm($this->peerClusterRatioRef);
            $variance += pow($value->clusterSize - $this->peerClusterRatioRef, 2);
            array_push($medianArray, $value->clusterSize);
        }

        $variance /= $this->peerCount;
        $this->peerClusterRatioNormVar = round($variance, 5);
        $this->peerClusterRatioNormStDev = round(sqrt($variance), 5);

        asort($medianArray);

        $medianArraySize = count($medianArray);
        $medianMidIndex = round(($medianArraySize - 1) / 2, 0, PHP_ROUND_HALF_DOWN);
        if ($medianArraySize % 2 == 0) {
            $this->peerClusterRatioNormMed = ($medianArray[$medianMidIndex] + $medianArray[$medianMidIndex + 1]) / 2;
        } else {
            $this->peerClusterRatioNormMed = $medianArray[$medianMidIndex];
        }
    }

    public function toHTML() {
        $table = "<table border=\"1\"><colgroup width=\"100%\" span=\"8\"></colgroup>";
        $table .= "<tr>";
        $table .= "<th colspan=\"4\">ViewId:</th><th colspan=\"4\">$this->viewId</th>";
        $table .= "</tr>";
        $table .= "<tr>";
        $table .= "<td colspan=\"1\">ClusterCount:</td><td colspan=\"3\" align=\"center\" >$this->clusterCount</td>";
        $table .= "<td colspan=\"1\">PeerCount:</td><td colspan=\"3\" align=\"center\" >$this->peerCount</td>";
        $table .= "</tr>";
        $table .= "<tr>";
        $table .= "<td>PeerClusterRatioRef:</td><td align=\"center\" >$this->peerClusterRatioRef </td>";
        $table .= "<td>PeerClusterRatioNormVar:</td><td align=\"center\" >$this->peerClusterRatioNormVar</td>";
        $table .= "<td>PeerClusterRatioNormStDev:</td><td align=\"center\" >$this->peerClusterRatioNormStDev</td>";
        $table .= "<td>PeerClusterRatioNormMed:</td><td align=\"center\" >$this->peerClusterRatioNormMed</td>";
        $table .= "</tr>";
        $table .= "<tr><td>ClusterListe:</td> <td colspan=\"7\">";
        $table .= $this->clusterListToHTML();
        $table .= "</td></tr>";
        $table .= "<tr><td colspan=\"8\">";
        $table .= $this->toSVG();
        $table .= "</td></tr>";
        $table .= "</table>";
        return $table;
    }

    public function toSVG() {
        $svg = '<svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" xmlns:ev = "http://www.w3.org/2001/xml-events" version = "1.1" baseProfile = "full" width="100%" height="350">';
        $svg .= $this->createClusterSVG();
        //$svg .= '<circle cx = "110" cy = "110" r = "10" fill = "full" />';
        //$svg .= '<circle cx = "410" cy = "110" r = "100" stroke = "#4e9a06" stroke-width = "4" fill = "none" />';
        //$svg .= '<circle cx = "410" cy = "110" r = "10" fill = "full" />';
        //$svg .= '<line x1 = "110" y1 = "110" x2 = "410" y2 = "110" style = "stroke:rgb(255,0,0);stroke-width:2"/>';
        $svg .= '</svg >';
        return $svg;
    }

    public function createClusterSVG() {
        $midX = 160;
        $midY = 160;
        $svg = "";
        foreach ($this->clusterList as $value) {
            $clSize = $value->clusterSize;
            $r = $clSize * 15;
            $strokebg = "gray";
            if (strcmp($value->bgColor,"white") != 0) {
                $strokebg = $value->bgColor;
            }
            $svg .= '<circle cx = "' . $midX . '" cy = "' . $midY . '" r = "' . $r . '" stroke = "'.$strokebg.'" stroke-width = "4" fill = "none" />';
            $svg .= $this->fillPoints($midX, $midY, $clSize, $r);
            $midX += 2.5 * $r;
        }

        return $svg;
    }

    public function fillPoints($midX, $midY, $count, $r) {
        $startX = $midX - $r;
        $endX = $midX + $r;
        $startY = $midY - $r;
        $endY = $midY + $r;
        $midXT = $startX + 15;
        $midYT = $midY;
        $svg = "";
        for ($i = 0; $i < $count; $i++) {
            $svg .= '<circle cx = "' . $midXT . '" cy = "' . $midYT . '" r = "10" fill = "full" />';
            $midXT += 30;
        }
        return $svg;
    }

}
?>
