#! /usr/bin/php

<?php

$stdin = file_get_contents('php://stdin', 'r');

$lines = explode("\n", $stdin);

$lines = preg_grep('~[a-z]+~', $lines);

$lines = array_map('trim', $lines);

$output = '';
$currentFile = '';
$errorMessages = [];
$lineNumber = null;
foreach ($lines as $line) {
    $file = [];
    $lineNumberError = [];
    $error = [];
    $configError = [];
    $isFileLine = preg_match('~^Line(.+)~', $line, $file);
    $isNumberErrorLine = preg_match('~^(\d+)(.*)~', $line, $lineNumberError);
    $isErrorLine = preg_match('~^([a-zA-Z].+)~', $line, $error);

    if (!$isFileLine && !$isNumberErrorLine && !$isErrorLine) {
        continue;
    }

    if ($isFileLine) {
        flushBuffer($errorMessages, $currentFile, $lineNumber, $output);
        $lineNumber = null;
        $currentFile = trim(array_pop($file));
        continue;
    } else if ($isNumberErrorLine && !$isErrorLine) {
        // flush if not the first error in this file
        flushBuffer($errorMessages, $currentFile, $lineNumber, $output);
        $errorMessages[] = trim(array_pop($lineNumberError));
        $lineNumber = trim(array_pop($lineNumberError));
    } else if ($isErrorLine && !$isNumberErrorLine) {
        $isIgnoredPatternError = preg_match('~Ignored error pattern~', $line, $configError);
        if (!$isIgnoredPatternError) {
            $errorMessages[] = trim(array_pop($error));
            continue;
        }
        // hack to support ignored error pattern failures
        flushBuffer($errorMessages, $currentFile, $lineNumber, $output);
        $currentFile = 'phpstan.neon';
        $lineNumber = 1;
        $errorMessages = [];
        $errorMessages[] = trim(array_pop($error));
    }
}

flushBuffer($errorMessages, $currentFile, $lineNumber, $output);

function flushBuffer(array &$errorMessages, $currentFile, $lineNumber, &$output){
    if (!empty($errorMessages) && $lineNumber > 0) {
        $output .= "File: " . $currentFile . ", line: " . $lineNumber . ", error: " . implode(' ', $errorMessages) . PHP_EOL;
        $errorMessages = [];
    }
}

echo trim($output);
