<?php

namespace Sibs\Sibs\Utils;

class SibsObjectify
{
    public static function json_mapper($value, $recursive = true)
    {
        if (
            ! empty($value) && is_string($value) &&
            $decoded = json_decode($value, true)
        ) {
            return $decoded;
        } else if (is_array($value) && $recursive) {
            return array_map('\\Sibs\\Sibs\\Utils\\SibsObjectify::json_mapper', $value);
        } else {
            return $value;
        }
    }

    public static function json_mapper_norecursive($value)
    {
        return self::json_mapper($value, true);
    }

    public static function json_to_array($array, $recursive = true)
    {
        if (! is_array($array)) {
            $array = [$array];
        }

        return array_map(
            $recursive ? '\\Sibs\\Sibs\\Utils\\SibsObjectify::json_mapper'
                : '\\Sibs\\Sibs\\Utils\\SibsObjectify::json_mapper_norecursive',
            $array
        );
    }

    /**
     * Verify if a given message is a json string or array
     *
     * @param mixed $message
     * @return bool
     */
    public static function isArrayOrJson($message)
    {
        if (is_array($message)) {
            return true;
        }

        if (! is_string($message)) {
            return false;
        }

        json_decode($message);
        return json_last_error() === JSON_ERROR_NONE;
    }

    /**
     * Verify if a given string is a json string
     *
     * @param string $message
     * @return bool
     */
    public static function isJson(string $message)
    {
        if (! is_string($message)) {
            return false;
        }

        json_decode($message);
        return json_last_error() === JSON_ERROR_NONE;
    }
}
