#!/usr/bin/env php
<?php declare(strict_types=1);

namespace ShipMonk\PHPStan\Baseline;

use ShipMonk\PHPStan\Baseline\Exception\ErrorException;

$autoloadFiles = [
    __DIR__ . '/../../../autoload.php',
    __DIR__ . '/../vendor/autoload.php',
];

foreach ($autoloadFiles as $autoloadFile) {
    if (file_exists($autoloadFile)) {
        require_once $autoloadFile;
        break;
    }
}

/**
 * @return never
 */
function error(string $message): void
{
    fwrite(STDERR, "\n! $message\n\n");
    exit(1);
}

$providedOptions = getopt('', ['tabs', 'no-error-count'], $restIndex);
$args = array_slice($argv, $restIndex);

$loaderFile = $args[0] ?? null;
$indent = isset($providedOptions['tabs']) || in_array('--tabs', $args, true)
    ? "\t"
    : '    ';
$includeCount = !(isset($providedOptions['no-error-count']) || in_array('--no-error-count', $args, true));

if ($loaderFile === null) {
    error(
        "Missing argument. Usage:\n".
        " vendor/bin/phpstan --generate-baseline=baselines/_loader.neon && vendor/bin/split-phpstan-baseline baselines/_loader.neon"
    );
}

if (!is_file($loaderFile)) {
    error("Invalid argument, '$loaderFile' is not a file");
}

try {
    $splitter = new BaselineSplitter($indent, $includeCount);
    $writtenBaselines = $splitter->split($loaderFile);

    foreach ($writtenBaselines as $writtenBaseline => $errorsCount) {
        echo "Writing baseline file $writtenBaseline" . ($errorsCount !== null ? " with $errorsCount errors\n" : "\n");
    }

} catch (ErrorException $e) {
    error($e->getMessage());
}
