<?php

declare(strict_types=1);

require __DIR__ . '/../vendor/autoload.php';

use DI\ContainerBuilder;
use Slim\Factory\AppFactory;
use MdmApi\Routes;
use MdmApi\Database;
use MdmApi\Migration\MigrationRunner;
use MdmApi\Middleware\TrustedProxyMiddleware;
use MdmApi\Middleware\JsonBodyParserMiddleware;

$appConfig = require __DIR__ . '/../config/app.php';
$dbConfig = require __DIR__ . '/../config/database.php';
$securityConfig = require __DIR__ . '/../config/security.php';
$storageConfig = require __DIR__ . '/../config/storage.php';

$containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions([
    'config.app' => $appConfig,
    'config.database' => $dbConfig,
    'config.security' => $securityConfig,
    'config.storage' => $storageConfig,
]);

$container = $containerBuilder->build();
AppFactory::setContainer($container);
$app = AppFactory::create();

$app->addBodyParsingMiddleware();
$app->add(new JsonBodyParserMiddleware());
$app->add(new TrustedProxyMiddleware($appConfig));
$app->addRoutingMiddleware();

$errorMiddleware = $app->addErrorMiddleware(
    $appConfig['debug'] ?? false,
    true,
    true
);
$errorMiddleware->setDefaultErrorHandler(function (
    \Psr\Http\Message\ServerRequestInterface $request,
    \Throwable $exception,
    bool $displayErrorDetails
) use ($app) {
    $status = 500;
    if ($exception instanceof \Slim\Exception\HttpException) {
        $status = $exception->getCode();
    }
    $response = $app->getResponseFactory()->createResponse($status);
    $body = ['error' => true, 'message' => $exception->getMessage()];
    if ($displayErrorDetails) {
        $body['trace'] = $exception->getTraceAsString();
    }
    $response->getBody()->write(json_encode($body));
    return $response->withHeader('Content-Type', 'application/json');
});

if (Database::isConfigured()) {
    try {
        Database::configure($dbConfig);
        $runner = new MigrationRunner();
        $runner->runPending();
    } catch (\Throwable $e) {
        // Migration errors logged but don't block boot
        error_log('Migration error: ' . $e->getMessage());
    }
}

Routes::register($app);

$app->run();
