<?php

namespace App\Support;

class Utf8Cleaner
{
    /**
     * Рекурсивно проходит по массиву/объекту и приводит все строковые значения к валидному UTF-8.
     */
    public static function clean($value)
    {
        if (is_array($value)) {
            foreach ($value as $key => $item) {
                $value[$key] = self::clean($item);
            }

            return $value;
        }

        if (is_object($value)) {
            foreach (get_object_vars($value) as $property => $item) {
                $value->{$property} = self::clean($item);
            }

            return $value;
        }

        if (is_string($value)) {
            // Попробовать нормализовать строку в UTF-8, подменяя невалидные последовательности.
            $converted = @mb_convert_encoding($value, 'UTF-8', 'UTF-8');

            if ($converted === false) {
                // Фолбэк: заменить невалидные байты стандартным алгоритмом json_encode.
                $encoded = json_encode($value, JSON_INVALID_UTF8_SUBSTITUTE);

                if ($encoded === false) {
                    return '';
                }

                // Убираем кавычки, которые добавляет json_encode.
                return json_decode($encoded, true) ?? '';
            }

            return $converted;
        }

        return $value;
    }
}
