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

declare(strict_types=1);

use CliArgs\CliArgs;
use gfaugere\Monolog\Formatter\ColoredLineFormatter;
use League\Container\Container;
use Monolog\Handler\ErrorLogHandler;
use Monolog\Logger;
use Monolog\Processor\PsrLogMessageProcessor;
use Psr\Log\LoggerAwareInterface;
use Swissport\Serverless\Adapter\SlsJsonSchema;

if (file_exists(__DIR__ . '/vendor/autoload.php')) {
    require_once __DIR__ . '/vendor/autoload.php';
} elseif (file_exists(__DIR__ . '/../autoload.php')) {
    /** @noinspection PhpIncludeInspection */
    require_once __DIR__ . '/../autoload.php';
} else {
    /** @noinspection PhpIncludeInspection */
    require_once __DIR__ . '/../../autoload.php';
}

$config = [
    'source' => [
        'alias' => 'i',
        'help' => 'Path(s), comma separated, to source models (required)',
    ],
    'destination' => [
        'alias' => 'o',
        'help' => 'Path to export destination (required)',
    ],
    'model-version' => [
        'help' => 'Version to append to model files',
    ],
    'categories' => [
        'alias' => 'c',
        'help' => 'Category subpaths to place models into',
    ],
    'verbose' => [
        'alias' => 'v',
        'help' => 'Verbose mode',
    ],
    'help' => [
        'alias' => 'h',
        'help' => 'Show help'
    ]
];

$container = new Container();
$container->defaultToShared(true);

$container->add(CliArgs::class)
    ->addArgument($config);

/** @var CliArgs */
$args = $container->get(CliArgs::class);

switch (true) {
    case ($args->isFlagExist('v')):
        $loggerVerbosity = Logger::INFO;
        break;
    default:
        $loggerVerbosity = Logger::NOTICE;
}

$lineFormat = "%color_start%[%datetime%] %message%%color_end% %context%";
$dateFormat = "Y-m-d H:i:s";

$container->add(ColoredLineFormatter::class)
    ->addArguments([$lineFormat, $dateFormat]);
$container->add(ErrorLogHandler::class)
    ->addArguments([ErrorLogHandler::OPERATING_SYSTEM, $loggerVerbosity])
    ->addMethodCall('setFormatter', [ColoredLineFormatter::class]);
$container->add(PsrLogMessageProcessor::class);
$container->add(Logger::class)
    ->addArgument('event-runner')
    ->addMethodCall('pushHandler', [ErrorLogHandler::class])
    ->addMethodCall('pushProcessor', [PsrLogMessageProcessor::class])
    ->setShared(true);

$container->inflector(LoggerAwareInterface::class)
    ->invokeMethod('setLogger', [Logger::class]);

if ($args->isFlagExist('h')) {
    print $args->getHelp();
    exit;
}

if (!($args->getArg('i') && $args->getArg('o'))) {
    print 'Require source and destination paths';
    exit(1);
}

$inputPaths = explode(',', $args->getArg('i'));
$modelVersion = (int)($args->getArg('model-version') ?? 1);
$categories = explode(',', $args->getArg('c'));

$container->add(SlsJsonSchema::class)
    ->addMethodCall('setModelPaths', [$inputPaths]);

$hydrator = $container->get(SlsJsonSchema::class);

$hydrator->export($args->getArg('o'), $modelVersion, 'json', $categories);