<?php

/**
 * Registers the framework's essential services during application bootstrap.
 * Binds database, schema, migration, discovery, and manager components into the container.
 * Boots listener and policy discovery caching.
 *
 * @package Framework
 * @since   1.0.0
 */
namespace Kirki\Framework;

\defined('ABSPATH') || exit;
use Kirki\Framework\Console\CommandManager;
use Kirki\Framework\Database\Connection\Connection;
use Kirki\Framework\Database\Connection\DatabaseManager;
use Kirki\Framework\Database\Migrations\Migrator;
use Kirki\Framework\Database\Schema\SchemaManager;
use Kirki\Framework\Discovery\ListenerDiscovery;
use Kirki\Framework\Discovery\PolicyDiscovery;
use Kirki\Framework\Contracts\SomoyInterface;
use Kirki\Framework\Managers\CookieManager;
use Kirki\Framework\Managers\EventManager;
use Kirki\Framework\Managers\LogManager;
use Kirki\Framework\Managers\PolicyManager;
use Kirki\Framework\ServiceProvider;
use Kirki\Framework\Http\Response;
use Kirki\Framework\Supports\MessagesBag;
use Kirki\Framework\Supports\Somoy;
use Kirki\Framework\View\TemplateEngine;
use Kirki\Framework\View\ViewContext;
class CoreServiceProvider extends ServiceProvider
{
    /**
     * Register the hooks to the application.
     *
     * @return void
     *
     * @since 1.0.0
     */
    public function register()
    {
        $this->register_database_services();
        $this->register_discoveries();
        $this->register_managers();
        $this->register_migrations();
        $this->register_messages();
        $this->app->singleton(Response::class);
        $this->app->singleton(TemplateEngine::class);
        $this->app->singleton(ViewContext::class);
        if (\class_exists(\Faker\Factory::class)) {
            $this->app->singleton(\Faker\Factory::class, function () {
                return \Faker\Factory::create();
            });
        }
    }
    /**
     * Boot the service provider.
     *
     * @return void
     *
     * @since 1.0.0
     */
    public function boot()
    {
        $this->app->make(PolicyDiscovery::class)->discover()->cache();
        $this->app->make(ListenerDiscovery::class)->discover()->cache();
    }
    /**
     * Register the messages.
     *
     * @return void
     *
     * @since 1.0.0
     */
    protected function register_messages()
    {
        $this->app->singleton(MessagesBag::class, function () {
            return new MessagesBag();
        });
    }
    /**
     * Register the managers.
     *
     * @return void
     *
     * @since 1.0.0
     */
    protected function register_managers()
    {
        $this->app->singleton(DatabaseManager::class);
        $this->app->singleton(SchemaManager::class);
        $this->app->singleton(LogManager::class);
        $this->app->singleton(EventManager::class);
        $this->app->singleton(PolicyManager::class);
        $this->app->singleton(CookieManager::class);
        $this->app->bind(SomoyInterface::class, function () {
            return new Somoy();
        });
        $this->app->singleton(CommandManager::class);
    }
    /**
     * Register the discoveries.
     *
     * @return void
     *
     * @since 1.0.0
     */
    protected function register_discoveries()
    {
        $this->app->singleton(ListenerDiscovery::class);
        $this->app->singleton(PolicyDiscovery::class);
    }
    /**
     * Register the database singletons.
     *
     * @return void
     *
     * @since 1.0.0
     */
    protected function register_database_services()
    {
        $this->app->singleton(Connection::class);
        $this->app->singleton(Migrator::class);
    }
    /**
     * Register the migrations tags.
     *
     * @return void
     *
     * @since 1.0.0
     */
    protected function register_migrations()
    {
        $migrations_path = $this->app->config_path('migrations.php');
        if (!\file_exists($migrations_path)) {
            return;
        }
        $migrations = (include $migrations_path);
        if (empty($migrations)) {
            return;
        }
        $this->app->tag($migrations, 'app.migrations');
    }
}
