<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use App\Providers\ShortcodeProcessor;


class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register()
    {
        $this->app->singleton(ShortcodeProcessor::class, function ($app) {
            return new ShortcodeProcessor();
        });
    }

    /**
     * Bootstrap any application services.
     */
    public function boot()
    {
        Blade::directive('shortcode', function ($expression) {
            list($shortcodeName, $shortcodeAttributes) = explode(',', $expression, 2);
            return "<?php echo view('shortcodes.$shortcodeName', $shortcodeAttributes)->render(); ?>";
        });

        Blade::directive('processshortcodes', function ($expression) {
            return "<?php echo app('App\Providers\ShortcodeProcessor')->process($expression); ?>";
        });

        Blade::directive('customshortcode', function ($expression) {
            return "<?php echo app('App\Providers\ShortcodeProcessor')->processShortcodes($expression); ?>";
        });
    }

    public function processShortcodes($content)
    {
        return preg_replace_callback('/\[([\w_]+)([^\]]*)\]/', function ($matches) {
            $shortcodeName = $matches[1];
            $shortcodeAttributes = str::of($matches[2])->trim()->replace("'", "\"")->__toString();
            return "@shortcode('$shortcodeName', $shortcodeAttributes)";
        }, $content);
    }
}