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

use Avodel\SwaggerCodeGenerator\Generator\ClientGenerator;
use Avodel\SwaggerCodeGenerator\Generator\ClientServiceDefinitionsRegistrar;
use Avodel\SwaggerCodeGenerator\Generator\ControllerGenerator;
use Avodel\SwaggerCodeGenerator\Generator\EnumGenerator;
use Avodel\SwaggerCodeGenerator\Generator\ExceptionGenerator;
use Avodel\SwaggerCodeGenerator\Generator\Generator;
use Avodel\SwaggerCodeGenerator\Generator\ModelGenerator;
use Avodel\SwaggerCodeGenerator\Generator\Options\GeneratorOptions;
use Avodel\SwaggerCodeGenerator\Generator\SwaggerAnnotationsGenerator;
use Avodel\SwaggerCodeGenerator\Generator\Util\FileManager;
use Avodel\SwaggerCodeGenerator\Generator\Util\PropertyTypeResolver;
use Avodel\SwaggerCodeGenerator\Parser\Parser;

require_once 'vendor/autoload.php';

$args = getopt('', ['spec::', 'feature::', 'output-dir::', 'with-server', 'with-client']);

$options = GeneratorOptions::builder();
$outputDir = '.generated';

if (isset($args['spec'])) {
    $options->specPath($args['spec']);
} else {
    throw new \RuntimeException('No specification file provided.');
}

if (isset($args['feature'])) {
    $options->feature($args['feature']);
} else {
    throw new \RuntimeException('No feature provided.');
}

if (isset($args['output-dir'])) {
    $outputDir = $args['output-dir'];
}

if (isset($args['with-client'])) {
    $options->withClient();
}

if (isset($args['with-server'])) {
    $options->withServer();
}

$fileManager = new FileManager();
$propertyTypeResolver = new PropertyTypeResolver();
$exceptionGenerator = new ExceptionGenerator($fileManager);
$annotationsGenerator = new SwaggerAnnotationsGenerator();
$clientDefinitionsRegistrar = new ClientServiceDefinitionsRegistrar();

$generator = new Generator(
    new Parser(),
    new ModelGenerator($propertyTypeResolver, $fileManager),
    new EnumGenerator($fileManager),
    new ClientGenerator($fileManager, $propertyTypeResolver, $exceptionGenerator, new ClientServiceDefinitionsRegistrar()),
    new ControllerGenerator($fileManager, $propertyTypeResolver, $annotationsGenerator, $exceptionGenerator),
    $fileManager,
    $outputDir
);

$generator->generate($options->build());

echo 'The code has been generated successfully.' . PHP_EOL;

exit(0);