| 
<?php // bootstrap/app.php
 // Autoload dependencies using Composer's autoloader
 require_once __DIR__ . '/../vendor/autoload.php';
 
 use Dotenv\Dotenv;
 use Config\Database;
 use Config\Session;
 use Monolog\Logger;
 use Monolog\Handler\StreamHandler;
 use Stripe\Stripe;
 
 // Load environment variables from .env file if it exists
 $dotenv = Dotenv::createImmutable(__DIR__ . '/../');
 $dotenv->safeLoad();  // This allows the script to run even if .env file is missing
 
 // Initialize error handling settings
 error_reporting(E_ALL);
 ini_set('display_errors', getenv('APP_DEBUG') === 'true' ? '1' : '0');
 ini_set('log_errors', '1');
 ini_set('error_log', __DIR__ . '/../storage/logs/error.log');
 
 // Set up logging using Monolog
 $log = new Logger('app');
 $log->pushHandler(new StreamHandler(__DIR__ . '/../storage/logs/app.log', Logger::DEBUG));
 
 // Exception and Error Handling
 set_exception_handler(function ($e) use ($log) {
 $log->error($e->getMessage(), ['exception' => (string) $e]);
 http_response_code(500);
 echo json_encode(['error' => 'Internal Server Error']);
 });
 
 set_error_handler(function ($level, $message, $file, $line) use ($log) {
 $log->error($message, ['level' => $level, 'file' => $file, 'line' => $line]);
 });
 
 // Initialize database connection (using Singleton pattern)
 Database::initialize();
 
 // Example: Define global constants (if needed)
 define('BASE_PATH', __DIR__ . '/../');
 define('STORAGE_PATH', BASE_PATH . 'storage/');
 
 // Start session
 Session::start();
 
 $stripeSecretKey = getenv('STRIPE_SECRET_KEY');
 Stripe::setApiKey($stripeSecretKey);
 |