<?php

namespace App\Helpers;

class MiscHelper
{
    public static function capitaliseWord($word)
    {
        $word = strtolower($word);

        $wordLetters = [];
        preg_match_all('/\b[a-z]/i', $word, $wordLetters, PREG_OFFSET_CAPTURE);

        foreach ($wordLetters[0] as $wordLetter)
        {
            $word = substr_replace($word, strtoupper($wordLetter[0]), $wordLetter[1], 1);
        }

        return $word;
    }

    public static function convertToBytes($val)
    {
        if(empty($val))return 0;

        $val = trim($val);

        preg_match('#([0-9]+)[\s]*([a-z]+)#i', $val, $matches);

        $last = '';
        if(isset($matches[2])){
            $last = $matches[2];
        }

        if(isset($matches[1])){
            $val = (int) $matches[1];
        }

        switch (strtolower($last))
        {
            case 'g':
            case 'gb':
                $val *= 1024;
            case 'm':
            case 'mb':
                $val *= 1024;
            case 'k':
            case 'kb':
                $val *= 1024;
        }

        return (int) $val;
    }

    /**
     * Convert a decimal (e.g. 3.5) to a fraction (e.g. 7/2).
     * Adapted from: http://jonisalonen.com/2012/converting-decimal-numbers-to-ratios/
     *
     * @param float $decimal the decimal number.
     *
     * @return array|bool a 1/2 would be [1, 2] array (this can be imploded with '/' to form a string)
     */
    public static function decimalToFraction($decimal)
    {
        if ($decimal < 0 || !is_numeric($decimal)) {
            // Negative digits need to be passed in as positive numbers
            // and prefixed as negative once the response is imploded.
            return false;
        }
        if ($decimal == 0) {
            return [0, 0];
        }

        $tolerance = 1.e-4;

        $numerator = 1;
        $h2 = 0;
        $denominator = 0;
        $k2 = 1;
        $b = 1 / $decimal;
        do {
            $b = 1 / $b;
            $a = floor($b);
            $aux = $numerator;
            $numerator = $a * $numerator + $h2;
            $h2 = $aux;
            $aux = $denominator;
            $denominator = $a * $denominator + $k2;
            $k2 = $aux;
            $b = $b - $a;
        } while (abs($decimal - $numerator / $denominator) > $decimal * $tolerance);

        return [
            $numerator,
            $denominator
        ];
    }

    public static function ensureHasTrailingSlash($string)
    {
        if (strlen($string) > 0 && substr($string, strlen($string) - 1, 1) != '/')
        {
            $string .= '/';
        }

        return $string;
    }

    public static function getEnvironmentFilePath()
    {
        return sprintf('%s/.env', dirname(dirname(__DIR__)));
    }

    public static function getEnvironmentSetting($settingName)
    {
        $envFile = MiscHelper::getEnvironmentFilePath();

        if (!file_exists($envFile))
        {
            return null;
        }

        $matches = null;
        if (preg_match(sprintf('/^\s*%s\s*=\s*(.+)$/im', preg_quote($settingName)), file_get_contents($envFile), $matches))
        {
            return trim($matches[1]);
        }

        return null;
    }

    public static function isAppInstalled()
    {
        return MiscHelper::getEnvironmentSetting('APP_INSTALLED');
    }

    public static function isExecEnabled()
    {
        $disabled = explode(',', ini_get('disable_functions'));
        return !in_array('exec', $disabled);
    }

    /**
     * Tests whether the provided URL belongs to the current application (i.e. both scheme and hostname match.)
     * @param $url
     * @return bool
     */
    public static function isSafeUrl($url)
    {
        $parts = parse_url($url);
        $validParts = parse_url(url('/'));

        return ($parts['scheme'] == $validParts['scheme'] && $parts['host'] == $validParts['host']);
    }

    public static function randomString($length = 10)
    {
        $seed = 'abcdefghijklmnopqrstuvwxyz01234567890';
        $string = '';

        while (strlen($string) < $length)
        {
            $string .= substr($seed, rand(0, strlen($seed) - 1), 1);
        }

        return $string;
    }

    public static function setEnvironmentSetting($settingName, $value)
    {
        if (is_null(MiscHelper::getEnvironmentSetting($settingName)))
        {
            return file_put_contents(MiscHelper::getEnvironmentFilePath(), sprintf('%s=%s', $settingName, $value) . PHP_EOL, FILE_APPEND);
        }

        return false;
    }
}