<?php

class ArrayHelper
{
    /**
     * @param array $array  Source Array
     * @param string $key   Key di item object yg valuenya akan dijadikan sebagai key
     * @param string $value Key di item object yg valuenya akan dijadikan sebagai value, jika diisi kosong, maka seluruh object akan jadi value
     * @return array
     */
    public static function asKeyValue(array $array, string $key, string $value = '')
    {
        $result = [];
        foreach ($array as $item) {
            $result[$item[$key]] = empty($value) ? $item : $item[$value];
        }
        return $result;
    }

    public static function isStringJson($string) {
        $decoded = json_decode($string);
        if ( !is_object($decoded) && !is_array($decoded) ) {
            return false;
        }
        return json_last_error() === JSON_ERROR_NONE;
    }

    public static function sortByKey($array, $key) {
        usort($array, function($a, $b) use ($key) {
            if ($a[$key] > $b[$key]) {
                return 1;
            } elseif ($a[$key] < $b[$key]) {
                return -1;
            }
            return 0;
        });

        return $array;
    }

    public static function maxAttributeInArray($array, $prop) {
        return max(array_column($array, $prop));
    }

    public static function averageByKey($array, $key) {
        $total = $count = 0;
        foreach ($array as $item) {
            $total += $item[$key];
            $count++;
        }
        $average = 0;
        if ($count > 0) $average = $total / $count;

        return $average;
    }

    public static function averageByKeyWithConditions($array, $key, $conditions) {
        $total = $count = 0;
        foreach ($array as $item) {
            $conditionsFulfilled = true;
            foreach ($conditions as $k => $v) {
                if ($item[$k] != $v) {
                    $conditionsFulfilled = false;
                }
            }
            if ($conditionsFulfilled) {
                $total += $item[$key];
                $count++;
            }
        }
        $average = 0;
        if ($count > 0) $average = $total / $count;

        return $average;
    }

    public static function countWithConditions($array, $conditions): int
    {
        $count = 0;
        foreach ($array as $item) {
            $conditionsFulfilled = true;
            foreach ($conditions as $k => $v) {
                if ($item[$k] != $v) {
                    $conditionsFulfilled = false;
                }
            }
            if ($conditionsFulfilled) $count++;
        }

        return $count;
    }

    public static function itemWithConditions($array, $conditions) {
        $result = null;
        foreach ($array as $item) {
            $conditionsFulfilled = true;
            foreach ($conditions as $k => $v) {
                if ($item[$k] != $v) {
                    $conditionsFulfilled = false;
                }
            }
            if ($conditionsFulfilled) $result = $item;
        }

        return $result;
    }

    public static function valueByKeyWithConditions($array, $key, $conditions) {
        $result = null;
        foreach ($array as $item) {
            $conditionsFulfilled = true;
            foreach ($conditions as $k => $v) {
                if ($item[$k] != $v) {
                    $conditionsFulfilled = false;
                }
            }
            if ($conditionsFulfilled) $result = $item[$key];
        }

        return $result;
    }

    public static function valuesByKey($array, $key) {
        $result = [];
        foreach ($array as $item) {
            $result[] = $item[$key];
        }

        return array_unique($result);
    }

    public static function implodeWithQuote($array, $separator = ',')
    {
        return "'" . implode("'".$separator."'", explode($separator, $array)) . "'";
    }
}
