<?php

namespace App\Sensor;

use \App\AbstractSensor;

/**
 * Parse netstat
 *
 * @author tibo
 */
class Netstat extends AbstractSensor
{

    public function report(array $records) : string
    {
        return view("agent.netstat", []);
    }

    public function points(array $records) : array
    {
        if (count($records) == 0) {
            return [];
        }

        $reports = [];
        foreach ($records as $record) {
            $report = $this->parse($record['netstat-statistics']);
            $report->time = $record->time;
            $reports[] = $report;
        }

        $dataset = ["name" => "Retransmitted TCP segments [%]", "points" => []];
        $previous_report = $reports[0];
        foreach ($reports as $report) {
            $sent_segments = $report->tcp_segments_sent - $previous_report->tcp_segments_sent;
            $retransmitted_segments =
                    $report->tcp_segments_retransmitted - $previous_report->tcp_segments_retransmitted;
            $ratio = 0;
            if ($sent_segments != 0) {
                $ratio = $retransmitted_segments / $sent_segments * 100;
            }
            // point time is in miliseconds :-(
            $dataset["points"][] = new Point($report->time * 1000, $ratio);
            $previous_report = $report;
        }

        return [$dataset];
    }

    public function status(array $records) : int
    {
        return \App\Status::OK;
    }

    const TCP_SENT = '/^    (\d+) segments sent out/m';
    const TCP_RETRANSMITTED = '/^    (\d+) segments retransmitted$/m';

    public function parse(string $string) : NetstatReport
    {
        $report = new NetstatReport;
        $report->tcp_segments_retransmitted =
                $this->pregMatchOne(self::TCP_RETRANSMITTED, $string, 0);
        $report->tcp_segments_sent =
                $this->pregMatchOne(self::TCP_SENT, $string, 0);

        return $report;
    }

    public function pregMatchOne($pattern, $string, $default = null)
    {
        $matches = [];
        if (preg_match($pattern, $string, $matches) === 1) {
            return $matches[1];
        }

        return $default;
    }
}