<?php

namespace Give\Helpers;

class ArrayDataSet
{
    /**
     * This function will return array with renamed keys.
     *
     * This function only support one dimensional array.
     * You can pass a multi dimensional array but only zero level array keys will be renamed.
     *
     * @since 2.7.0
     * @since 4.1.0 Add is_array check
     *
     * @param array $renameTo Pass array of existing key name as key and new key name as value.
     *
     * @param array $array
     *
     * @return array
     */
    public static function renameKeys($array, $renameTo)
    {
        if ( ! is_array($array)) {
            return [];
        }

        // Rename key if property name exist for them.
        foreach ($renameTo as $oldKey => $newKey) {
            if (array_key_exists($oldKey, $array)) {
                $array[$newKey] = $array[$oldKey];
                unset($array[$oldKey]);
            }
        }

        return $array;
    }

    /**
     * Return whether or not array contains required keys.
     *
     * This function only support one dimensional array.
     *
     * @since 2.7.0
     *
     * @param array $array
     * @param array $requiredKeys Array of required keys.
     *
     * @return bool
     */
    public static function hasRequiredKeys($array, $requiredKeys)
    {
        return (bool)array_intersect_key($array, array_flip($requiredKeys));
    }

    /**
     *  Return array with grouped under specific key.
     *
     * @param array  $array
     * @param array  $itemsToMove
     * @param string $arrayKey
     *
     * @return mixed
     */
    public static function moveArrayItemsUnderArrayKey($array, $itemsToMove, $arrayKey)
    {
        foreach ($itemsToMove as $key) {
            if (array_key_exists($key, $array)) {
                $array[$arrayKey][$key] = $array[$key];
                unset($array[$key]);
            }
        }

        return $array;
    }

    /**
     * Creates a new array from the old one with all of the index keys converted to camel case.
     * This is only intended for associative arrays.
     *
     * @since 2.8.0
     *
     * @param $array
     *
     * @return array
     */
    public static function camelCaseKeys($array)
    {
        $newArray = [];

        foreach ($array as $key => $value) {
            $studlyKey = ucwords(str_replace(['-', '_'], ' ', $key));
            $studlyKey = lcfirst(str_replace(' ', '', $studlyKey));

            $newArray[$studlyKey] = $value;
        }

        return $newArray;
    }

    /**
     * Creates a comma separated string and each value enclosed with single quote from array.
     *
     * @since 2.10.0
     *
     * @param array $array
     *
     * @return string
     */
    public static function getStringSeparatedByCommaEnclosedWithSingleQuote($array)
    {
        return sprintf(
            '\'%s\'',
            implode('\',\'', $array)
        );
    }
}
