<?php
defined('BASEPATH') OR exit('No direct script access allowed');

if (!function_exists('numero_a_letras')) {
    function numero_a_letras($numero, $moneda = 'SOLES')
    {
        $numero = number_format((float)$numero, 2, '.', '');
        $partes = explode('.', $numero);

        $entero = (int)$partes[0];
        $decimal = isset($partes[1]) ? str_pad($partes[1], 2, '0') : '00';

        $texto = convertir_numero_letras($entero);

        if ($texto === '') {
            $texto = 'CERO';
        }

        return trim($texto) . ' Y ' . $decimal . '/100 ' . strtoupper($moneda);
    }
}

if (!function_exists('convertir_numero_letras')) {
    function convertir_numero_letras($numero)
    {
        $unidades = array(
            '', 'UNO', 'DOS', 'TRES', 'CUATRO', 'CINCO', 'SEIS', 'SIETE', 'OCHO', 'NUEVE',
            'DIEZ', 'ONCE', 'DOCE', 'TRECE', 'CATORCE', 'QUINCE', 'DIECISEIS', 'DIECISIETE', 'DIECIOCHO', 'DIECINUEVE', 'VEINTE'
        );

        $decenas = array(
            2 => 'VEINTI', 3 => 'TREINTA', 4 => 'CUARENTA', 5 => 'CINCUENTA',
            6 => 'SESENTA', 7 => 'SETENTA', 8 => 'OCHENTA', 9 => 'NOVENTA'
        );

        $centenas = array(
            1 => 'CIENTO', 2 => 'DOSCIENTOS', 3 => 'TRESCIENTOS', 4 => 'CUATROCIENTOS',
            5 => 'QUINIENTOS', 6 => 'SEISCIENTOS', 7 => 'SETECIENTOS', 8 => 'OCHOCIENTOS', 9 => 'NOVECIENTOS'
        );

        if ($numero == 0) {
            return '';
        }

        if ($numero == 100) {
            return 'CIEN';
        }

        if ($numero <= 20) {
            return $unidades[$numero];
        }

        if ($numero < 30) {
            return 'VEINTI' . $unidades[$numero - 20];
        }

        if ($numero < 100) {
            $d = floor($numero / 10);
            $u = $numero % 10;

            if ($u == 0) {
                return $decenas[$d];
            }

            return $decenas[$d] . ' Y ' . $unidades[$u];
        }

        if ($numero < 1000) {
            $c = floor($numero / 100);
            $r = $numero % 100;

            return $centenas[$c] . ($r > 0 ? ' ' . convertir_numero_letras($r) : '');
        }

        if ($numero < 1000000) {
            $m = floor($numero / 1000);
            $r = $numero % 1000;

            $miles = ($m == 1) ? 'MIL' : convertir_numero_letras($m) . ' MIL';
            return $miles . ($r > 0 ? ' ' . convertir_numero_letras($r) : '');
        }

        if ($numero < 1000000000000) {
            $mm = floor($numero / 1000000);
            $r = $numero % 1000000;

            $millones = ($mm == 1) ? 'UN MILLON' : convertir_numero_letras($mm) . ' MILLONES';
            return $millones . ($r > 0 ? ' ' . convertir_numero_letras($r) : '');
        }

        return '';
    }
}