#!/usr/bin/env php
<?php

declare(strict_types=1);

/*
 * Generates the SDK code from the API specifications: `composer sdk:generate`.
 * With --check it only reports generated files that are out of date and exits with 1.
 */

use Loyal\SdkGenerator\GenerationFailed;
use Loyal\SdkGenerator\Generator;

$root = dirname(__DIR__, 3);

require $root.'/vendor/autoload.php';

$generator = Generator::fromConfig($root);

try {
    if (in_array('--check', $argv, true)) {
        $diff = $generator->compare();
        $stale = array_merge(
            array_map(static fn (string $path): string => "changed: {$path}", $diff['changed']),
            array_map(static fn (string $path): string => "missing: {$path}", $diff['missing']),
            array_map(static fn (string $path): string => "extra: {$path}", $diff['extra']),
        );

        if ($stale !== []) {
            fwrite(STDERR, "The generated SDK code is out of date; run `composer sdk:generate`:\n  ".implode("\n  ", $stale)."\n");

            exit(1);
        }

        fwrite(STDOUT, "The generated SDK code is up to date.\n");

        exit(0);
    }

    $changed = $generator->write();
    fwrite(STDOUT, "{$changed} generated file(s) changed.\n");
} catch (GenerationFailed $failure) {
    fwrite(STDERR, $failure->getMessage()."\n");

    exit(1);
}
