#!/usr/bin/env php
<?php

/**
 * This file is part of the bitrix24-php-sdk package.
 *
 * © Maksim Mesilov <mesilov.maxim@gmail.com>
 *
 * For the full copyright and license information, please view the MIT-LICENSE.txt
 * file that was distributed with this source code.
 */

use Bitrix24\SDK\Attributes\Services\AttributesParser;
use Bitrix24\SDK\Infrastructure\Console\Commands\ShowFieldsDescriptionCommand;
use Bitrix24\SDK\Services\ServiceBuilderFactory;
use Bitrix24\SDK\Tools\Commands\CopyPropertyValues;
use Bitrix24\SDK\Tools\Commands\GenerateContactsCommand;
use Bitrix24\SDK\Infrastructure\Console\Commands;
use Bitrix24\SDK\Tools\Commands\PerformanceBenchmarks\ListCommand;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Monolog\Processor\MemoryUsageProcessor;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Typhoon\Reflection\TyphoonReflector;

if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
    echo 'Warning: The console should be invoked via the CLI version of PHP, not the ' . PHP_SAPI . ' SAPI' . PHP_EOL;
}

set_time_limit(0);

require dirname(__DIR__) . '/vendor/autoload.php';

if (!class_exists(Dotenv::class)) {
    throw new LogicException('You need to add "symfony/dotenv" as Composer dependencies.');
}

$input = new ArgvInput();
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) {
    putenv('APP_ENV=' . $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env);
}

if ($input->hasParameterOption('--no-debug', true)) {
    putenv('APP_DEBUG=' . $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0');
}

(new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');

if ($_SERVER['APP_DEBUG']) {
    umask(0000);

    if (class_exists(
        Debug::class
    )) {
        Debug::enable();
    }
}

$log = new Logger('bitrix24-php-sdk-cli');
$log->pushHandler(new StreamHandler($_ENV['LOGS_FILE'], (int)$_ENV['LOGS_LEVEL']));
$log->pushProcessor(new MemoryUsageProcessor(true, true));

$application = new Application();
$application->add(new GenerateContactsCommand($log));
$application->add(new ListCommand($log));
$application->add(new ShowFieldsDescriptionCommand($log));
$application->add(new CopyPropertyValues($log));
$application->add(new Commands\Documentation\GenerateCoverageDocumentationCommand(
    new AttributesParser(TyphoonReflector::build(), new Symfony\Component\Filesystem\Filesystem()),
    new ServiceBuilderFactory(new EventDispatcher(), $log),
    new Symfony\Component\Finder\Finder(),
    new Symfony\Component\Filesystem\Filesystem(),
    $log));
$application->add(new Commands\Documentation\GenerateExamplesForDocumentationCommand(
    TyphoonReflector::build(),
    new AttributesParser(TyphoonReflector::build(), new Symfony\Component\Filesystem\Filesystem()),
    new Symfony\Component\Filesystem\Filesystem(),
    $log));
$application->run($input);