<?php
declare(strict_types=1);

namespace App\Framework\ExceptionHandling;

use App\Framework\ErrorHandling\ErrorHandlerManager;
use App\Framework\ExceptionHandling\Strategy\StrictErrorPolicy;
use Error;

final readonly class ShutdownHandler
{
    private const array FATAL_TYPES = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];

    public function handle(): void
    {
        $last = error_get_last();

        if (!$last || !$this->isFatalError($last['type'])) {
            return;
        }

        $this->cleanOutputBuffer();

        $file = (string)($last['file'] ?? 'unknown');
        $line = (int)($last['line'] ?? 0);

        $error = new Error($last['message'] ?? 'Fatal error',0);



        try {
            $ehm = new ErrorKernel();
            $ehm->handle($error, ['file' => $file, 'line' => $line]);
        } catch (\Throwable) {

        }

        exit(255);
    }

    private function cleanOutputBuffer(): void
    {
        try {
            while (ob_get_level() > 0) {
                @ob_end_clean();
            }
        } catch (\Throwable) {
            // ignore
        }
    }

    private function isFatalError(?int $type = null): bool
    {
        return in_array($type ?? 0, self::FATAL_TYPES, true);
    }
}
