<?php

namespace App\Providers;

use App\Models\Backoffice\WebsiteObject;
use App\Models\DepartmentLanguage;
use App\Observers\DepartmentLanguageObserver;
use App\Observers\WebsiteObjectObserver;
use App\Services\MagazineService;
use App\Services\PimcoreImportService;
use App\Services\AccountsService;
use App\Services\ArchivesService;
use App\Services\CompanyProfilesService;
use App\Services\CompetitionsService;
use App\Services\CvEntriesService;
use App\Services\FiltersService;
use App\Services\JobOffersService;
use App\Services\LocalizationService;
use App\Services\OfficesServices;
use App\Services\PimcoreCustomerImportService;
use App\Services\ProfilesService;
use App\Services\ProjectsService;
use App\Services\ResultsService;
use App\Services\SubPlansService;
use App\Services\SubscriptionsService;
use App\Services\SearchProfileService;
use App\Services\TedImportService;
use App\Services\JwtService;
use App\Services\UserService;
use App\Services\WatchlistsService;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;

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

        $this->app->singleton('competitions_service', function () {
            return new CompetitionsService();
        });

        $this->app->singleton('results_service', function () {
            return new ResultsService();
        });

        $this->app->singleton('localization_service', function () {
            return new LocalizationService();
        });

        $this->app->singleton('subscriptions_service', function () {
            return new SubscriptionsService();
        });

        $this->app->singleton('user_service', function () {
            return new UserService();
        });

        $this->app->singleton('watchlists_service', function () {
            return new WatchlistsService();
        });

        $this->app->singleton('accounts_service', function () {
            return new AccountsService();
        });

        $this->app->singleton('company_profiles_service', function () {
            return new CompanyProfilesService();
        });

        $this->app->singleton('job_offers_service', function () {
            return new JobOffersService();
        });

        $this->app->singleton('cv_entries_service', function () {
            return new CvEntriesService();
        });

        $this->app->singleton('search_profile_service', function () {
            return new SearchProfileService();
        });

        $this->app->singleton('filters_service', function () {
            return new FiltersService();
        });

        $this->app->singleton('profiles_service', function () {
            return new ProfilesService();
        });

        $this->app->singleton('projects_service', function () {
            return new ProjectsService();
        });

        $this->app->singleton('offices_service', function () {
            return new OfficesServices();
        });

        $this->app->singleton('pimcore_import_service', function () {
            return new PimcoreImportService();
        });

        $this->app->singleton('pimcore_customer_import_service', function () {
            return new PimcoreCustomerImportService();
        });

        $this->app->singleton('magazine_service', function () {
            return new MagazineService();
        });

        $this->app->singleton('archives_service', function () {
            return new ArchivesService();
        });

        $this->app->singleton('sub_plans_service', function () {
            return new SubPlansService();
        });

        $this->app->singleton('jwt_service', function () {
            return new JwtService();
        });
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Validator::extend('strong_password', function ($attribute, $value, $parameters, $validator) {
            return preg_match('/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^\w\d\s])[\w\W]{8,24}$/', $value);
        });

        Validator::replacer('strong_password', function ($message, $attribute, $rule, $parameters) {
            return str_replace(':attribute', $attribute, trans('validation.strong_password'));
        });

        if ($this->app->environment('production')) {
            URL::forceScheme('https');
        }

        DepartmentLanguage::observe(DepartmentLanguageObserver::class);
        WebsiteObject::observe(WebsiteObjectObserver::class);
    }
}
