<?php

namespace App\Helpers;

class NumberToWords
{
    private static $ones = [
        '',
        'واحد',
        'اثنان',
        'ثلاثة',
        'أربعة',
        'خمسة',
        'ستة',
        'سبعة',
        'ثمانية',
        'تسعة',
        'عشرة',
        'احدى عشر',
        'اثنا عشر',
        'ثلاثة عشر',
        'أربعة عشر',
        'خمسة عشر',
        'ستة عشر',
        'سبعة عشر',
        'ثمانية عشر',
        'تسعة عشر',
    ];

    private static $tens = [
        '',
        '',
        'عشرون',
        'ثلاثون',
        'أربعون',
        'خمسون',
        'ستون',
        'سبعون',
        'ثمانون',
        'تسعون',
    ];

    private static $scales = [
        '',
        'ألف',
        'مليون',
        'مليار',
        'تريليون',
        'كوادريليون',
    ];

    public static function convert($number)
    {
        if ($number == 0) {
            return 'صفر ريال سعودي';
        }

        $whole = floor($number);
        $decimal = round(($number - $whole) * 100);

        $result = self::convertWhole($whole) . ' ريال';

        if ($decimal > 0) {
            $result .= ' و' . self::convertWhole($decimal) . ' هللة';
        } else {
            $result .= ' صحيح';
        }

        return $result;
    }

    private static function convertWhole($number)
    {
        if ($number == 0) {
            return '';
        }

        if ($number < 0) {
            return 'سالب ' . self::convertWhole(-$number);
        }

        $numberString = '';

        $scales = 0;
        while ($number > 0) {
            $hundreds = $number % 1000;

            if ($hundreds != 0) {
                $numberString = self::convertHundreds($hundreds);

                if ($scales > 0) {
                    $numberString .= ' ' . self::$scales[$scales];
                }

                $numberString .= ' ' . $numberString;
            }

            $number = intval($number / 1000);
            $scales++;
        }

        return trim($numberString);
    }

    private static function convertHundreds($number)
    {
        $result = '';

        $hundreds = intval($number / 100);
        $remainder = $number % 100;

        if ($hundreds > 0) {
            if ($hundreds == 1) {
                $result = 'مائة';
            } elseif ($hundreds == 2) {
                $result = 'مائتان';
            } elseif ($hundreds <= 10) {
                $result = self::$ones[$hundreds] . ' مائة';
            } else {
                $result = self::$ones[$hundreds] . ' مائة';
            }
        }

        if ($remainder >= 20) {
            if ($result != '') {
                $result .= ' و';
            }
            $result .= self::$ones[intval($remainder / 10) * 10 / 10];
            $result .= ' ' . self::$tens[intval($remainder / 10)];

            if (($remainder % 10) > 0) {
                $result .= ' و' . self::$ones[$remainder % 10];
            }
        } elseif ($remainder > 0) {
            if ($result != '') {
                $result .= ' و';
            }
            $result .= self::$ones[$remainder];
        }

        return $result;
    }
}
