<?php

if (! defined('ABSPATH')) {
    exit;
}

use PluginsNameSpaces\App;
use PluginsNameSpaces\Framework\Support\Config;
use PluginsNameSpaces\Framework\Foundation\Application;
use PluginsNameSpaces\Database\DBMigrator;
use PluginsNameSpaces\Hooks\Handlers\ActivationHandler;
use PluginsNameSpaces\Hooks\Handlers\DeactivationHandler;

/**
 * Application bootstrap pipeline.
 *
 * Builds the container, registers plugin bindings, wires
 * activation / deactivation, and boots the App once WordPress
 * has loaded all plugins.
 *
 * @return \Closure
 */
return function ($file) {

    $app = new Application($file);

    // Load configuration from config/*.php into the container.
    $app->instance('config', Config::loadFrom(__DIR__ . '/../config'));

    // Register plugin-specific container bindings.
    (require __DIR__ . '/bindings.php')($app);

    // Activation / deactivation lifecycle.
    register_activation_hook($file, function () use ($app) {
        $app->make(ActivationHandler::class)->handle();
    });

    register_deactivation_hook($file, function () use ($app) {
        $app->make(DeactivationHandler::class)->handle();
    });

    // Boot the plugin after all plugins are loaded.
    add_action('plugins_loaded', function () use ($app) {

        do_action(App::config('app.hook_prefix') . 'loaded', $app);

        add_action('init', function () use ($app) {
            // Apply any pending database changes on upgrade.
            DBMigrator::maybeMigrate();

            $app->make(App::class)->boot();

            do_action(App::config('app.hook_prefix') . 'init', $app);
        });
    });

    return $app;
};
