<?php

namespace Lucent;

use Illuminate\Routing\Router;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use Intervention\Image\ImageManager;
use Lucent\Channel\ChannelService;
use Lucent\Commands\CompileSchemas;
use Lucent\Commands\LiveLink;
use Lucent\Commands\RebuildThumbnails;
use Lucent\Commands\RemoveOrphanEdges;
use Lucent\File\FileService;
use Lucent\File\ImageService;
use Lucent\Query\DatabaseGraph\DatabaseGraph;
use Lucent\Query\DatabaseGraph\PgsqlDatabaseGraph;
use Lucent\Query\DatabaseGraph\SqliteDatabaseGraph;

class LucentServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        $this->app->singleton(ChannelService::class, function () {
            return ChannelService::fromConfig();
        });

        $this->app->bind(ImageManager::class, function () {
            return new ImageManager(['driver' => 'imagick']);
        });

        $this->app->bind(DatabaseGraph::class, function () {
            return match (config("lucent.database")) {
                "sqlite" => new SqliteDatabaseGraph(),
                "pgsql" => new PgsqlDatabaseGraph(),
            };
        });


    }

    /**
     * Bootstrap any package services.
     */
    public function boot(Router $router): void
    {

        $manifestPath = public_path('vendor/lucent/dist/manifest.json');
        $manifest = null;
        if (file_exists($manifestPath)) {
            $manifest = json_decode(file_get_contents(public_path('vendor/lucent/dist/manifest.json')), true);
        }


        $router->aliasMiddleware('lucent.auth', \Lucent\Http\Middleware\AuthMiddleware::class);
        $router->aliasMiddleware('lucent.guest', \Lucent\Http\Middleware\GuestMiddleware::class);

        $this->loadViewsFrom(__DIR__ . '/Views', 'lucent');
        $this->loadRoutesFrom(__DIR__ . '/Http/web.php');
        $this->loadRoutesFrom(__DIR__ . '/Http/api.php');

        $this->loadMigrationsFrom(__DIR__ . '/Database/migrations');

        if ($this->app->runningInConsole()) {
            $this->commands([
                CompileSchemas::class,
                RebuildThumbnails::class,
                LiveLink::class,
                RemoveOrphanEdges::class,
            ]);
        }

        View::share('manifest', $manifest);
        View::share('image', app()->make(ImageService::class));
        View::share('file', app()->make(FileService::class));

        $this->publishes([
            __DIR__ . '/Config/main.php' => config_path('lucent.php'),
        ]);

        $this->publishes([
            __DIR__ . '/../front/dist' => public_path('vendor/lucent/dist'),
        ], 'lucent');
    }
}
