<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
//Repos
use App\Repositories\PageRepository;
use App\Interfaces\PageRepositoryInterface;
use App\Repositories\MemberRepository;
use App\Interfaces\MemberRepositoryInterface;
//Asset Services
use App\Services\Assets\AssetService;
use App\Services\Assets\DocService;
use App\Services\Assets\FileUploadService;
use App\Services\Assets\RenderService;
//Data Services
use App\Services\Data\SettingsService;
use App\Services\Data\ContentService;
use App\Services\Data\PaginateService;
use App\Services\Data\ThemeService;
use App\Services\Data\SortingService;
//Upkeep Services
use App\Services\Upkeep\MaintenanceService;
use App\Services\Upkeep\InitService;

class FipamoServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
        //services
        $this->app->bind(SettingsService::class, function ($app) {
            return new SettingsService(new DocService(), new ContentService());
        });

        $this->app->bind(ContentService::class, function ($app) {
            return new ContentService();
        });

        $this->app->bind(ThemeService::class, function ($app) {
            return new ThemeService(new SettingsService(new DocService(), new ContentService()));
        });

        $this->app->bind(PaginateService::class, function ($app) {
            return new PaginateService(new ContentService());
        });

        $this->app->bind(DocService::class, function ($app) {
            return new DocService();
        });

        $this->app->bind(FileUploadService::class, function ($app) {
            return new FileUploadService();
        });

        $this->app->bind(RenderService::class, function ($app) {
            return new RenderService(
                new SortingService(
                    new SettingsService(new DocService(), new ContentService()),
                    new ContentService(),
                    new ThemeService(new SettingsService(new DocService(), new ContentService()))
                ),
                new SettingsService(new DocService(), new ContentService()),
                new ContentService(),
            );
        });

        $this->app->bind(SortingService::class, function ($app) {
            return new SortingService(
                new SettingsService(new DocService(), new ContentService()),
                new ContentService(),
                new ThemeService(new SettingsService(new DocService(), new ContentService()))
            );
        });

        $this->app->bind(AssetService::class, function ($app) {
            return new AssetService(
                new ThemeService(
                    new SettingsService(new DocService(), new ContentService())
                )
            );
        });

        $this->app->bind(MaintenanceService::class, function ($app) {
            return new MaintenanceService(
                new SettingsService(new DocService(), new ContentService())
            );
        });

        $this->app->bind(InitService::class, function ($app) {
            return new InitService(new DocService());
        });
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        $this->app->bind(PageRepositoryInterface::class, PageRepository::class);
        $this->app->bind(MemberRepositoryInterface::class, MemberRepository::class);
    }
}