<?php

namespace App\Providers;

use App\Album;
use App\Helpers\ConfigHelper;
use App\Helpers\ImageHelper;
use App\Helpers\MiscHelper;
use App\Helpers\ThemeHelper;
use App\Helpers\ValidationHelper;
use App\Label;
use App\ModelObservers\AlbumObserver;
use App\ModelObservers\LabelObserver;
use Illuminate\Database\QueryException;
use Illuminate\Mail\Mailer;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $themeHelper = new ThemeHelper();

        $this->app->singleton('image', function ($app)
        {
            return new ImageHelper();
        });
        $this->app->singleton('theme', function ($app) use ($themeHelper)
        {
            return $themeHelper;
        });
        $this->app->singleton('misc', function ($app)
        {
            return new MiscHelper();
        });
        $this->app->singleton('user_config', function ($app)
        {
            return new ConfigHelper();
        });

        Validator::extend('is_dir', (ValidationHelper::class . '@directoryExists'));
        Validator::extend('dir_empty', (ValidationHelper::class . '@isDirectoryEmpty'));
        Validator::extend('is_writeable', (ValidationHelper::class . '@isPathWriteable'));
        Validator::extend('album_path_unique', (ValidationHelper::class . '@albumPathUnique'));

        // Model observers
        Album::observe(AlbumObserver::class);
        Label::observe(LabelObserver::class);

        // Configure our default pager
        if (MiscHelper::isAppInstalled())
        {
            LengthAwarePaginator::defaultView($themeHelper->viewName('partials.pager_links'));
        }

        // Set base URL variable (used in both the main app and the installer)
        $baseUrl = url('/');
        if (!substr($baseUrl, strlen($baseUrl) - 1, 1) != '/')
        {
            $baseUrl .= '/';
        }

        View::share('appBaseUrl', $baseUrl);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
