<?php

namespace Helper;

use DateTime;

class Conversion
{
    /** Превращает строку data ('a=1|b=2|c=3') из БД в массив [a=>1, b=>2, c=>3].
     * @param string|null $dataString
     * @return array
     */
    public static function dataStringToArray(?string $dataString): array
    {
        if (empty($dataString)) {
            return [];
        }
        $dataString = str_replace('||', '|', $dataString); // любители забивать руками параметры и задваивать разделители.

        if (mb_substr($dataString, -1) === '|') {
            $dataString = rtrim($dataString, '|');
        }
        $arr = json_decode(str_replace(['=', '|'], ['":', ',"'], '{"' . $dataString . '}'), true);
        return $arr ?: [];
    }

    /** Превращает массив [a=>1, b=>2, c=>3] в строку data ('a=1|b=2|c=3') для БД.
     * @param array $dataArray
     * @return string
     */
    public static function arrayToDataString(array $dataArray): string
    {
        $str = json_encode($dataArray);
        return $str ? str_replace(['":', ',"', '{"', '}'], ['=', '|'], $str) : '';
    }

    /** Превращает количество секунд в человекопонятное Х мес. Х дн. Х ч. Х мин. Х сек.,
     * используемое обычно для отображения игровых таймаутов.
     * @param int|string $seconds
     * @return string
     */
    public static function secondsToTimeout(int|string $seconds): string
    {
        $seconds = (int)$seconds;
        $time = new DateTime();
        $time->setTimestamp($seconds);
        $sec = intval($time->format('s'));
        $min = intval($time->format('i'));
        $hr = intval($time->format('G'));
        $day = intval($time->format('j'));
        $month = intval($time->format('n'));
        $timeout = '';
        if ($month > 1) {
            $timeout .= $month . ' мес. ';
        }
        if ($day > 1) {
            $timeout .= $day . ' дн. ';
        }
        if ($hr) {
            $timeout .= $hr . ' ч. ';
        }
        if ($sec && !$min) {
            $timeout .= $sec . ' сек. ';
        } elseif ($min) {
            $timeout .= $min . ' мин. ';
        }
        return $timeout;
    }
}