<?php
declare(strict_types=1);

class Response {
    public static function json(array $data, int $status = 200): void {
        // Nettoyer tout buffer existant
        while (ob_get_level() > 0) {
            ob_end_clean();
        }
        
        // Headers CORS pour permettre les requêtes cross-origin (applications mobiles)
        $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';
        
        // Configurer les headers CORS
        header("Access-Control-Allow-Origin: $origin");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token, Authorization, X-Requested-With, X-App-Identifier, X-Client-Type');
        header('Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision');
        
        // Définir les headers de réponse
        header('Content-Type: application/json; charset=utf-8');
        header('X-Content-Type-Options: nosniff');
        
        // Définir le code de statut
        http_response_code($status);
        
        // Ajouter status et message à la réponse si non présents
        if (!isset($data['status'])) {
            if ($status >= 200 && $status < 300) {
                $data['status'] = 'success';
            } else {
                $data['status'] = 'error';
            }
        }
        
        if (!isset($data['message']) && isset($data['error'])) {
            $data['message'] = $data['error'];
        }
        
        // Sanitize data to ensure valid UTF-8 before encoding
        $sanitizedData = self::sanitizeForJson($data);
        
        // Encoder et envoyer la réponse
        $jsonResponse = json_encode($sanitizedData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        
        // Vérifier si l'encodage a échoué
        if ($jsonResponse === false) {
            error_log('Erreur d\'encodage JSON: ' . json_last_error_msg());
            $jsonResponse = json_encode([
                'status' => 'error',
                'message' => 'Erreur d\'encodage de la réponse',
                'debug_info' => json_last_error_msg()
            ]);
        }
        
        // Log de débogage (désactivé car peut causer des problèmes avec de grandes réponses)
        // error_log('Envoi de la réponse JSON: ' . $jsonResponse);
        
        // Envoyer la réponse
        echo $jsonResponse;
        
        // S'assurer que tout est envoyé
        flush();
        
        // Terminer l'exécution pour éviter d'envoyer du contenu supplémentaire
        exit;
    }
    
    /**
     * Sanitize data recursively to ensure valid UTF-8 encoding for JSON
     * 
     * @param mixed $data The data to sanitize
     * @return mixed The sanitized data
     */
    private static function sanitizeForJson($data) {
        if (is_string($data)) {
            // Replace invalid UTF-8 characters
            if (!mb_check_encoding($data, 'UTF-8')) {
                // Try to convert from other encodings
                $encodings = ['ISO-8859-1', 'Windows-1252'];
                foreach ($encodings as $encoding) {
                    $converted = mb_convert_encoding($data, 'UTF-8', $encoding);
                    if (mb_check_encoding($converted, 'UTF-8')) {
                        return $converted;
                    }
                }
                // If conversion fails, strip invalid characters
                return mb_convert_encoding($data, 'UTF-8', 'UTF-8');
            }
            return $data;
        } else if (is_array($data)) {
            // Recursively sanitize array elements
            foreach ($data as $key => $value) {
                $data[$key] = self::sanitizeForJson($value);
            }
        }
        return $data;
    }
}