'application/json; charset=utf-8', 'X-Content-Type-Options' => 'nosniff', 'X-Frame-Options' => 'DENY', 'X-XSS-Protection' => '1; mode=block', 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-User-Id, X-Device-Fingerprint, X-Timestamp, X-Nonce, X-Signature', ]; foreach (array_merge($defaultHeaders, $headers) as $name => $val) { header("$name: $val"); } echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } public static function success(mixed $data = null, string $message = 'Success', int $statusCode = 200): void { self::json([ 'success' => true, 'status' => 'success', 'message' => $message, 'data' => $data, 'timestamp' => time(), ], $statusCode); } public static function error(string $message = 'An error occurred', int $statusCode = 400, array $errors = []): void { self::json([ 'success' => false, 'status' => 'error', 'message' => $message, 'errors' => $errors, 'timestamp' => time(), ], $statusCode); } public static function unauthorized(string $message = 'Unauthorized access'): void { self::error($message, 401); } public static function forbidden(string $message = 'Forbidden'): void { self::error($message, 403); } public static function notFound(string $message = 'Resource not found'): void { self::error($message, 404); } }