<?php

namespace App\Utilities;

use Illuminate\Support\ProcessUtils;
use Symfony\Component\Process\PhpExecutableFinder;
use Symfony\Component\Process\Process;

class Console
{
    public static function run($string, $all_output = false, $timeout = 0)
    {
        $command = static::formatCommandString($string);

        logger('Console command:: ' . $command);

        $process = Process::fromShellCommandline($command, base_path());
        $process->setTimeout($timeout);

        $process->run();

        if ($process->isSuccessful()) {
            return true;
        }

        $output = $all_output ? $process->getOutput() : $process->getErrorOutput();

        logger('Console output:: ' . $output);

        return $output;
    }

    public static function getPhpBinary()
    {
        $bin = ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false));

        return !empty($bin) ? $bin : 'php';
    }

    public static function getArtisanBinary()
    {
        return defined('ARTISAN_BINARY') ? ProcessUtils::escapeArgument(ARTISAN_BINARY) : 'artisan';
    }

    public static function formatCommandString($string)
    {
        return sprintf('%s %s %s', static::getPhpBinary(), static::getArtisanBinary(), $string);
    }
}