<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Carbon\Carbon;

class Income extends Model
{
    use HasFactory, SoftDeletes;

    /**
     * টেবিলের নাম নির্ধারণ (যদি টেবিলের নাম 'incomes' না হয়)
     */
    protected $table = 'incomes';

    /**
     * ম্যাস অ্যাসাইনমেন্টের জন্য অনুমোদিত কলাম
     */
    protected $fillable = [
        'income_number',
        'income_date',
        'category',
        'source',
        'amount',
        'payment_method',
        'transaction_id',
        'received_by',
        'description',
        'remarks',
        'attachment',
        'created_by',
        'member_id',
        'status'
    ];

    /**
     * ডাটা টাইপ কাস্টিং
     */
    protected $casts = [
        'income_date' => 'date',
        'amount' => 'decimal:2',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
        'deleted_at' => 'datetime',
    ];

    /**
     * ডিফল্ট অ্যাট্রিবিউট ভ্যালু
     */
    protected $attributes = [
        'status' => 'completed',
    ];

    /**
     * Date attribute for DashboardController
     */
    public function getDateAttribute()
    {
        return $this->income_date;
    }

    /**
     * স্বয়ংক্রিয় আয় নম্বর জেনারেটর
     */
    public static function generateIncomeNumber()
    {
        $prefix = 'INC';
        $date = date('Ymd');
        
        // আজকের তারিখে কতটি ইনকাম আছে
        $count = self::whereDate('created_at', Carbon::today())->count();
        $nextNumber = str_pad($count + 1, 3, '0', STR_PAD_LEFT);
        
        return $prefix . '-' . $date . '-' . $nextNumber;
    }

    /**
     * Alternative: সহজ মেথড
     */
    public static function createIncomeNumber()
    {
        $latest = self::latest()->first();
        if ($latest && $latest->income_number) {
            // লাস্ট নম্বর থেকে 3 ডিজিট বের করুন
            $parts = explode('-', $latest->income_number);
            $lastNumber = (int)end($parts);
            $newNumber = $lastNumber + 1;
        } else {
            $newNumber = 1;
        }
        
        return 'INC-' . date('Ymd') . '-' . str_pad($newNumber, 3, '0', STR_PAD_LEFT);
    }

    /**
     * বুট মেথড - creating ইভেন্ট
     */
    protected static function boot()
    {
        parent::boot();
        
        static::creating(function ($income) {
            // ইনকাম নম্বর জেনারেট
            if (empty($income->income_number)) {
                $income->income_number = self::generateIncomeNumber();
            }
            
            // ইনকাম তারিখ সেট (যদি না থাকে)
            if (empty($income->income_date)) {
                $income->income_date = now();
            }
            
            // created_by অটো সেট করুন
            if (empty($income->created_by) && auth()->check()) {
                $income->created_by = auth()->id();
            }
            
            // received_by অটো সেট করুন (যদি না থাকে)
            if (empty($income->received_by) && auth()->check()) {
                $income->received_by = auth()->id();
            }
            
            // স্ট্যাটাস সেট (যদি না থাকে)
            if (empty($income->status)) {
                $income->status = 'completed';
            }
        });

        static::updating(function ($income) {
            // আপডেটের সময় কোনো লজিক থাকলে এখানে যোগ করুন
        });

        static::deleting(function ($income) {
            // ডিলিটের আগে অ্যাটাচমেন্ট ডিলিট করুন
            if ($income->attachment && \Storage::disk('public')->exists($income->attachment)) {
                \Storage::disk('public')->delete($income->attachment);
            }
        });
    }

    /**
     * রিলেশনশিপ: প্রাপক (User)
     */
    public function receiver()
    {
        return $this->belongsTo(User::class, 'received_by')->withDefault([
            'name' => 'N/A',
            'name_bn' => 'N/A'
        ]);
    }

    /**
     * রিলেশনশিপ: সৃষ্টিকর্তা (User)
     */
    public function creator()
    {
        return $this->belongsTo(User::class, 'created_by')->withDefault([
            'name' => 'N/A',
            'name_bn' => 'N/A'
        ]);
    }

    /**
     * রিলেশনশিপ: সদস্য (Member)
     */
    public function member()
    {
        return $this->belongsTo(Member::class, 'member_id');
    }

    /**
     * ক্যাটাগরি লিস্ট
     */
    public static function getCategoryList()
    {
        return [
            'membership_fee' => 'সদস্য ফি',
            'monthly_saving' => 'মাসিক সঞ্চয়',
            'loan_interest' => 'ঋণের সুদ',
            'loan_installment' => 'ঋণের কিস্তি',
            'donation' => 'দান',
            'event_fee' => 'অনুষ্ঠান ফি',
            'late_fee' => 'বিলম্ব ফি',
            'other' => 'অন্যান্য'
        ];
    }

    /**
     * ক্যাটাগরি বাংলায়
     */
    public function getCategoryInBanglaAttribute()
    {
        $categories = self::getCategoryList();
        return $categories[$this->category] ?? $this->category;
    }

    /**
     * পেমেন্ট মেথড লিস্ট
     */
    public static function getPaymentMethodList()
    {
        return [
            'cash' => 'নগদ',
            'bank' => 'ব্যাংক',
            'mobile_banking' => 'মোবাইল ব্যাংকিং',
            'check' => 'চেক'
        ];
    }

    /**
     * পেমেন্ট মেথড বাংলায়
     */
    public function getPaymentMethodInBanglaAttribute()
    {
        $methods = self::getPaymentMethodList();
        return $methods[$this->payment_method] ?? $this->payment_method;
    }

    /**
     * স্ট্যাটাস লিস্ট
     */
    public static function getStatusList()
    {
        return [
            'pending' => 'অপেক্ষমাণ',
            'completed' => 'সম্পন্ন',
            'cancelled' => 'বাতিল'
        ];
    }

    /**
     * স্ট্যাটাস বাংলায়
     */
    public function getStatusInBanglaAttribute()
    {
        $statuses = self::getStatusList();
        return $statuses[$this->status] ?? $this->status;
    }

    /**
     * মাস এবং বছর
     */
    public function getMonthYearAttribute()
    {
        if ($this->income_date) {
            return Carbon::parse($this->income_date)->format('F Y');
        }
        return 'N/A';
    }

    /**
     * মাস এবং বছর বাংলায়
     */
    public function getMonthYearBanglaAttribute()
    {
        if (!$this->income_date) {
            return 'N/A';
        }
        
        $date = Carbon::parse($this->income_date);
        $monthEn = $date->format('F');
        $year = $date->format('Y');
        
        $months = [
            'January' => 'জানুয়ারি',
            'February' => 'ফেব্রুয়ারি',
            'March' => 'মার্চ',
            'April' => 'এপ্রিল',
            'May' => 'মে',
            'June' => 'জুন',
            'July' => 'জুলাই',
            'August' => 'আগস্ট',
            'September' => 'সেপ্টেম্বর',
            'October' => 'অক্টোবর',
            'November' => 'নভেম্বর',
            'December' => 'ডিসেম্বর'
        ];
        
        $monthBn = $months[$monthEn] ?? $monthEn;
        $yearBn = $this->convertToBanglaNumber($year);
        
        return $monthBn . ' ' . $yearBn;
    }

    /**
     * অ্যাটাচমেন্ট URL
     */
    public function getAttachmentUrlAttribute()
    {
        if ($this->attachment && \Storage::disk('public')->exists($this->attachment)) {
            return asset('storage/' . $this->attachment);
        }
        return null;
    }

    /**
     * অ্যাটাচমেন্ট ফাইল নাম
     */
    public function getAttachmentNameAttribute()
    {
        if ($this->attachment) {
            return basename($this->attachment);
        }
        return null;
    }

    /**
     * তারিখ বাংলায় ফরম্যাট
     */
    public function getIncomeDateBanglaAttribute()
    {
        if (!$this->income_date) {
            return 'তারিখ নেই';
        }
        
        try {
            $date = Carbon::parse($this->income_date);
            $day = $date->format('d');
            $month = $date->format('m');
            $year = $date->format('Y');
            
            $banglaMonths = [
                '01' => 'জানুয়ারি', '02' => 'ফেব্রুয়ারি', '03' => 'মার্চ',
                '04' => 'এপ্রিল', '05' => 'মে', '06' => 'জুন',
                '07' => 'জুলাই', '08' => 'আগস্ট', '09' => 'সেপ্টেম্বর',
                '10' => 'অক্টোবর', '11' => 'নভেম্বর', '12' => 'ডিসেম্বর'
            ];
            
            $dayBn = $this->convertToBanglaNumber($day);
            $yearBn = $this->convertToBanglaNumber($year);
            
            return $dayBn . ' ' . ($banglaMonths[$month] ?? $month) . ' ' . $yearBn;
        } catch (\Exception $e) {
            return 'তারিখ নেই';
        }
    }

    /**
     * ইংরেজি সংখ্যা থেকে বাংলা সংখ্যায় রূপান্তর
     */
    public function convertToBanglaNumber($number)
    {
        $banglaDigits = ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'];
        $englishDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
        
        return str_replace($englishDigits, $banglaDigits, (string)$number);
    }

    /**
     * পরিমাণ বাংলায় (সংখ্যায়)
     */
    public function getAmountInBanglaAttribute()
    {
        try {
            $amount = number_format($this->amount, 2);
            return $this->convertToBanglaNumber($amount);
        } catch (\Exception $e) {
            return '০.০০';
        }
    }

    /**
     * পরিমাণ কথায়
     */
    public function getAmountInWordsAttribute()
    {
        return $this->convertNumberToWords($this->amount);
    }

    /**
     * স্কোপ: মাস অনুযায়ী
     */
    public function scopeCurrentMonth($query)
    {
        return $query->whereMonth('income_date', Carbon::now()->month)
                    ->whereYear('income_date', Carbon::now()->year);
    }

    /**
     * স্কোপ: আজকের
     */
    public function scopeToday($query)
    {
        return $query->whereDate('income_date', Carbon::today());
    }

    /**
     * স্কোপ: এই সপ্তাহের
     */
    public function scopeThisWeek($query)
    {
        return $query->whereBetween('income_date', [
            Carbon::now()->startOfWeek(),
            Carbon::now()->endOfWeek()
        ]);
    }

    /**
     * স্কোপ: ক্যাটাগরি অনুযায়ী
     */
    public function scopeByCategory($query, $category)
    {
        return $query->where('category', $category);
    }

    /**
     * স্কোপ: তারিখ অনুযায়ী
     */
    public function scopeDateRange($query, $startDate, $endDate)
    {
        return $query->whereBetween('income_date', [$startDate, $endDate]);
    }

    /**
     * স্কোপ: স্ট্যাটাস অনুযায়ী
     */
    public function scopeByStatus($query, $status)
    {
        return $query->where('status', $status);
    }

    /**
     * স্কোপ: সদস্য অনুযায়ী
     */
    public function scopeByMember($query, $memberId)
    {
        return $query->where('member_id', $memberId);
    }

    /**
     * টোটাল অ্যামাউন্ট স্কোপ
     */
    public function scopeTotalAmount($query)
    {
        return $query->sum('amount');
    }

    /**
     * প্রাইভেট হেল্পার: সংখ্যাকে কথায় রূপান্তর
     */
    private function convertNumberToWords($number)
    {
        if ($number == 0) return 'শূন্য';
        
        $words = [];
        $number = round($number, 2);
        $taka = floor($number);
        $paisa = round(($number - $taka) * 100);
        
        if ($taka > 0) {
            $words[] = $this->convertTakaToWords($taka) . ' টাকা';
        }
        
        if ($paisa > 0) {
            $words[] = $this->convertTakaToWords($paisa) . ' পয়সা';
        }
        
        return implode(' ও ', $words) . ' মাত্র';
    }

    /**
     * টাকা কথায় রূপান্তর
     */
    private function convertTakaToWords($number)
    {
        $words = [];
        
        $ones = [
            0 => '', 1 => 'এক', 2 => 'দুই', 3 => 'তিন', 4 => 'চার',
            5 => 'পাঁচ', 6 => 'ছয়', 7 => 'সাত', 8 => 'আট', 9 => 'নয়',
            10 => 'দশ', 11 => 'এগারো', 12 => 'বারো', 13 => 'তেরো',
            14 => 'চৌদ্দ', 15 => 'পনেরো', 16 => 'ষোল', 17 => 'সতেরো',
            18 => 'আঠারো', 19 => 'উনিশ', 20 => 'বিশ', 21 => 'একুশ',
            22 => 'বাইশ', 23 => 'তেইশ', 24 => 'চব্বিশ', 25 => 'পঁচিশ',
            26 => 'ছাব্বিশ', 27 => 'সাতাশ', 28 => 'আঠাশ', 29 => 'ঊনত্রিশ',
            30 => 'ত্রিশ', 31 => 'একত্রিশ', 32 => 'বত্রিশ', 33 => 'তেত্রিশ',
            34 => 'চৌত্রিশ', 35 => 'পঁয়ত্রিশ', 36 => 'ছত্রিশ', 37 => 'সাইত্রিশ',
            38 => 'আটত্রিশ', 39 => 'ঊনচল্লিশ', 40 => 'চল্লিশ', 41 => 'একচল্লিশ',
            42 => 'বিয়াল্লিশ', 43 => 'তেতাল্লিশ', 44 => 'চুয়াল্লিশ', 45 => 'পঁয়তাল্লিশ',
            46 => 'ছেচল্লিশ', 47 => 'সাতচল্লিশ', 48 => 'আটচল্লিশ', 49 => 'ঊনপঞ্চাশ',
            50 => 'পঞ্চাশ', 51 => 'একান্ন', 52 => 'বায়ান্ন', 53 => 'তিপ্পান্ন',
            54 => 'চুয়ান্ন', 55 => 'পঞ্চান্ন', 56 => 'ছাপ্পান্ন', 57 => 'সাতান্ন',
            58 => 'আটান্ন', 59 => 'ঊনষাট', 60 => 'ষাট', 61 => 'একষট্টি',
            62 => 'বাষট্টি', 63 => 'তেষট্টি', 64 => 'চৌষট্টি', 65 => 'পঁয়ষট্টি',
            66 => 'ছেষট্টি', 67 => 'সাতষট্টি', 68 => 'আটষট্টি', 69 => 'ঊনসত্তর',
            70 => 'সত্তর', 71 => 'একাত্তর', 72 => 'বাহাত্তর', 73 => 'তিয়াত্তর',
            74 => 'চুয়াত্তর', 75 => 'পঁচাত্তর', 76 => 'ছিয়াত্তর', 77 => 'সাতাত্তর',
            78 => 'আটাত্তর', 79 => 'ঊনআশি', 80 => 'আশি', 81 => 'একাশি',
            82 => 'বিরাশি', 83 => 'তিরাশি', 84 => 'চুরাশি', 85 => 'পঁচাশি',
            86 => 'ছিয়াশি', 87 => 'সাতাশি', 88 => 'আটাশি', 89 => 'ঊননব্বই',
            90 => 'নব্বই', 91 => 'একানব্বই', 92 => 'বিরানব্বই', 93 => 'তিরানব্বই',
            94 => 'চুরানব্বই', 95 => 'পঁচানব্বই', 96 => 'ছিয়ানব্বই', 97 => 'সাতানব্বই',
            98 => 'আটানব্বই', 99 => 'নিরানব্বই'
        ];
        
        $units = [
            100 => 'শত',
            1000 => 'হাজার',
            100000 => 'লাখ',
            10000000 => 'কোটি'
        ];
        
        if ($number < 100) {
            return $ones[$number];
        }
        
        if ($number < 1000) {
            $hundred = floor($number / 100);
            $remainder = $number % 100;
            $result = $ones[$hundred] . 'শ';
            if ($remainder > 0) {
                $result .= ' ' . $ones[$remainder];
            }
            return $result;
        }
        
        if ($number < 100000) {
            $thousand = floor($number / 1000);
            $remainder = $number % 1000;
            $result = $ones[$thousand] . ' হাজার';
            if ($remainder > 0) {
                $result .= ' ' . $this->convertTakaToWords($remainder);
            }
            return $result;
        }
        
        if ($number < 10000000) {
            $lakh = floor($number / 100000);
            $remainder = $number % 100000;
            $result = $ones[$lakh] . ' লক্ষ';
            if ($remainder > 0) {
                $result .= ' ' . $this->convertTakaToWords($remainder);
            }
            return $result;
        }
        
        $crore = floor($number / 10000000);
        $remainder = $number % 10000000;
        $result = $ones[$crore] . ' কোটি';
        if ($remainder > 0) {
            $result .= ' ' . $this->convertTakaToWords($remainder);
        }
        return $result;
    }
}
class Income extends Model
{
    use HasFactory;

    protected $fillable = [
        'income_number',
        'income_date',
        'category',
        'source',
        'amount',
        'payment_method',
        'transaction_id',
        'received_by',
        'description',
        'attachment',
        'created_by' // ✅ টেবিলে আছে, তাই রাখুন
    ];

    protected $casts = [
        'income_date' => 'date',
        'amount' => 'decimal:2',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
    ];

    // ✅ Date attribute for DashboardController
    public function getDateAttribute()
    {
        return $this->income_date;
    }

    // ✅ স্বয়ংক্রিয় আয় নম্বর জেনারেটর (সরলীকৃত)
    public static function generateIncomeNumber()
    {
        $prefix = 'INC';
        $date = date('Ymd');
        
        // আজকের তারিখে কতটি ইনকাম আছে
        $count = self::whereDate('created_at', Carbon::today())->count();
        $nextNumber = str_pad($count + 1, 3, '0', STR_PAD_LEFT);
        
        return $prefix . '-' . $date . '-' . $nextNumber;
    }

    // ✅ Alternative: সহজ মেথড
    public static function createIncomeNumber()
    {
        $latest = self::latest()->first();
        if ($latest) {
            // লাস্ট নম্বর থেকে 3 ডিজিট বের করুন
            $parts = explode('-', $latest->income_number);
            $lastNumber = end($parts);
            $newNumber = intval($lastNumber) + 1;
        } else {
            $newNumber = 1;
        }
        
        return 'INC-' . date('Ymd') . '-' . str_pad($newNumber, 3, '0', STR_PAD_LEFT);
    }

    // ✅ বুট মেথড - creating ইভেন্ট
    protected static function boot()
    {
        parent::boot();
        
        static::creating(function ($income) {
            if (empty($income->income_number)) {
                $income->income_number = self::generateIncomeNumber();
            }
            
            // ✅ created_by অটো সেট করুন যদি না থাকে
            if (empty($income->created_by) && auth()->check()) {
                $income->created_by = auth()->id();
            }
            
            // ✅ received_by অটো সেট করুন যদি না থাকে
            if (empty($income->received_by) && auth()->check()) {
                $income->received_by = auth()->id();
            }
        });
    }

    // ✅ রিলেশনশিপ: প্রাপক
    public function receiver()
    {
        return $this->belongsTo(User::class, 'received_by');
    }

    // ✅ রিলেশনশিপ: সৃষ্টিকর্তা
    public function creator()
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    // ✅ ক্যাটাগরি বাংলায়
    public function getCategoryInBanglaAttribute()
    {
        $categories = [
            'membership_fee' => 'সদস্য ফি',
            'monthly_saving' => 'মাসিক সঞ্চয়',
            'loan_interest' => 'ঋণের সুদ',
            'donation' => 'অনুদান',
            'event' => 'অনুষ্ঠান',
            'other' => 'অন্যান্য'
        ];
        
        return $categories[$this->category] ?? $this->category;
    }

    // ✅ পেমেন্ট মেথড বাংলায়
    public function getPaymentMethodInBanglaAttribute()
    {
        $methods = [
            'cash' => 'নগদ',
            'bank' => 'ব্যাংক',
            'mobile_banking' => 'মোবাইল ব্যাংকিং'
        ];
        
        return $methods[$this->payment_method] ?? $this->payment_method;
    }

    // ✅ মাস এবং বছর
    public function getMonthYearAttribute()
    {
        if ($this->income_date) {
            return Carbon::parse($this->income_date)->format('F Y');
        }
        return 'N/A';
    }

    // ✅ মাস এবং বছর বাংলায়
    public function getMonthYearBanglaAttribute()
    {
        if (!$this->income_date) {
            return 'N/A';
        }
        
        $months = [
            'January' => 'জানুয়ারি',
            'February' => 'ফেব্রুয়ারি',
            'March' => 'মার্চ',
            'April' => 'এপ্রিল',
            'May' => 'মে',
            'June' => 'জুন',
            'July' => 'জুলাই',
            'August' => 'আগস্ট',
            'September' => 'সেপ্টেম্বর',
            'October' => 'অক্টোবর',
            'November' => 'নভেম্বর',
            'December' => 'ডিসেম্বর'
        ];
        
        $month = Carbon::parse($this->income_date)->format('F');
        $year = Carbon::parse($this->income_date)->format('Y');
        
        return ($months[$month] ?? $month) . ' ' . $year;
    }

    // ✅ অ্যাটাচমেন্ট URL
    public function getAttachmentUrlAttribute()
    {
        if ($this->attachment) {
            return asset('storage/' . $this->attachment);
        }
        return null;
    }

    // ✅ অ্যাটাচমেন্ট ফাইল নাম
    public function getAttachmentNameAttribute()
    {
        if ($this->attachment) {
            return basename($this->attachment);
        }
        return null;
    }

    // ✅ তারিখ বাংলায় ফরম্যাট
    public function getIncomeDateBanglaAttribute()
    {
        if (!$this->income_date) {
            return 'N/A';
        }
        
        try {
            $date = Carbon::parse($this->income_date);
            $day = $date->format('d');
            $month = $date->format('m');
            $year = $date->format('Y');
            
            $banglaMonths = [
                '01' => 'জানুয়ারি', '02' => 'ফেব্রুয়ারি', '03' => 'মার্চ',
                '04' => 'এপ্রিল', '05' => 'মে', '06' => 'জুন',
                '07' => 'জুলাই', '08' => 'আগস্ট', '09' => 'সেপ্টেম্বর',
                '10' => 'অক্টোবর', '11' => 'নভেম্বর', '12' => 'ডিসেম্বর'
            ];
            
            $banglaDigits = ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'];
            $englishDigits = range(0, 9);
            
            $dayBangla = str_replace($englishDigits, $banglaDigits, $day);
            $yearBangla = str_replace($englishDigits, $banglaDigits, $year);
            
            return $dayBangla . ' ' . ($banglaMonths[$month] ?? $month) . ' ' . $yearBangla;
        } catch (\Exception $e) {
            return 'তারিখ নেই';
        }
    }

    // ✅ পরিমাণ বাংলায় (সংখ্যায়)
    public function getAmountInBanglaAttribute()
    {
        try {
            $amount = $this->amount;
            $banglaDigits = ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'];
            $englishDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
            
            return str_replace($englishDigits, $banglaDigits, number_format($amount, 2));
        } catch (\Exception $e) {
            return '০.০০';
        }
    }

    // ✅ পরিমাণ কথায়
    public function getAmountInWordsAttribute()
    {
        return $this->convertNumberToWords($this->amount);
    }

    // ✅ স্কোপ: মাস অনুযায়ী
    public function scopeCurrentMonth($query)
    {
        return $query->whereMonth('income_date', Carbon::now()->month)
                    ->whereYear('income_date', Carbon::now()->year);
    }

    // ✅ স্কোপ: ক্যাটাগরি অনুযায়ী
    public function scopeByCategory($query, $category)
    {
        return $query->where('category', $category);
    }

    // ✅ স্কোপ: তারিখ অনুযায়ী
    public function scopeDateRange($query, $startDate, $endDate)
    {
        return $query->whereBetween('income_date', [$startDate, $endDate]);
    }

    // ✅ টোটাল অ্যামাউন্ট স্কোপ
    public function scopeTotalAmount($query)
    {
        return $query->sum('amount');
    }

    // ✅ প্রাইভেট হেল্পার: সংখ্যাকে কথায় রূপান্তর
    private function convertNumberToWords($number)
    {
        $decimal = round($number - floor($number), 2);
        $number = floor($number);
        
        $words = array();
        $ones = array(
            0 => 'শূন্য',
            1 => 'এক',
            2 => 'দুই',
            3 => 'তিন',
            4 => 'চার',
            5 => 'পাঁচ',
            6 => 'ছয়',
            7 => 'সাত',
            8 => 'আট',
            9 => 'নয়',
            10 => 'দশ',
            11 => 'এগারো',
            12 => 'বারো',
            13 => 'তেরো',
            14 => 'চৌদ্দ',
            15 => 'পনেরো',
            16 => 'ষোল',
            17 => 'সতেরো',
            18 => 'আঠারো',
            19 => 'উনিশ'
        );
        
        $tens = array(
            2 => 'বিশ',
            3 => 'ত্রিশ',
            4 => 'চল্লিশ',
            5 => 'পঞ্চাশ',
            6 => 'ষাট',
            7 => 'সত্তর',
            8 => 'আশি',
            9 => 'নব্বই'
        );
        
        if ($number < 20) {
            return $ones[$number];
        } elseif ($number < 100) {
            $tens_digit = floor($number / 10);
            $unit = $number % 10;
            return $tens[$tens_digit] . ($unit > 0 ? ' ' . $ones[$unit] : '');
        } elseif ($number < 1000) {
            $hundreds_digit = floor($number / 100);
            $remainder = $number % 100;
            $hundreds = array(
                1 => 'একশ',
                2 => 'দুইশ',
                3 => 'তিনশ',
                4 => 'চারশ',
                5 => 'পাঁচশ',
                6 => 'ছয়শ',
                7 => 'সাতশ',
                8 => 'আটশ',
                9 => 'নয়শ'
            );
            return $hundreds[$hundreds_digit] . ($remainder > 0 ? ' ' . $this->convertNumberToWords($remainder) : '');
        } elseif ($number < 100000) {
            $thousands_digit = floor($number / 1000);
            $remainder = $number % 1000;
            return $this->convertNumberToWords($thousands_digit) . ' হাজার' . ($remainder > 0 ? ' ' . $this->convertNumberToWords($remainder) : '');
        } elseif ($number < 10000000) {
            $lakhs_digit = floor($number / 100000);
            $remainder = $number % 100000;
            return $this->convertNumberToWords($lakhs_digit) . ' লক্ষ' . ($remainder > 0 ? ' ' . $this->convertNumberToWords($remainder) : '');
        }
        
        return number_format($number);
    }
}