<?php

namespace App\Utilities;

use Illuminate\Support\Collection;
use Illuminate\Support\Str as IStr;

class Str
{
    public static function getInitials($value, $length = 2)
    {
        $words = new Collection(explode(' ', $value));

        // if name contains single word, use first N character
        if ($words->count() === 1) {
            $initial = static::getInitialFromOneWord($value, $words, $length);
        } else {
            $initial = static::getInitialFromMultipleWords($words, $length);
        }

        $initial = strtoupper($initial);

        if (language()->direction() == 'rtl') {
            $initial = collect(mb_str_split($initial))->reverse()->implode('');
        }

        return $initial;
    }

    public static function getInitialFromOneWord($value, $words, $length)
    {
        $initial = (string) $words->first();

        if (strlen($value) >= $length) {
            $initial = IStr::substr($value, 0, $length);
        }

        return $initial;
    }

    public static function getInitialFromMultipleWords($words, $length)
    {
        // otherwise, use initial char from each word
        $initials = new Collection();

        $words->each(function ($word) use ($initials) {
            $initials->push(IStr::substr($word, 0, 1));
        });

        return static::selectInitialFromMultipleInitials($initials, $length);
    }

    public static function selectInitialFromMultipleInitials($initials, $length)
    {
        return $initials->slice(0, $length)->implode('');
    }
}