import { numberToWords, numberToPersianWords } from './index'
import { wordsToNumber, persianWordsToNumber, stringToNumber, numberToString } from './index'
import { numberToPersianNumerals, persianNumeralsToNumber } from './index'

describe('numberToWords', () => {
  test('converts single digits', () => {
    expect(numberToWords(0)).toBe('zero')
    expect(numberToWords(1)).toBe('one')
    expect(numberToWords(9)).toBe('nine')
  })

  test('converts teens', () => {
    expect(numberToWords(10)).toBe('ten')
    expect(numberToWords(11)).toBe('eleven')
    expect(numberToWords(15)).toBe('fifteen')
    expect(numberToWords(19)).toBe('nineteen')
  })

  test('converts tens', () => {
    expect(numberToWords(20)).toBe('twenty')
    expect(numberToWords(42)).toBe('forty-two')
    expect(numberToWords(99)).toBe('ninety-nine')
  })

  test('converts hundreds', () => {
    expect(numberToWords(100)).toBe('one hundred')
    expect(numberToWords(101)).toBe('one hundred and one')
    expect(numberToWords(110)).toBe('one hundred and ten')
    expect(numberToWords(999)).toBe('nine hundred and ninety-nine')
  })

  test('converts thousands', () => {
    expect(numberToWords(1000)).toBe('one thousand')
    expect(numberToWords(1234)).toBe('one thousand two hundred and thirty-four')
    expect(numberToWords(999999)).toBe(
      'nine hundred and ninety-nine thousand nine hundred and ninety-nine'
    )
  })

  test('converts negative numbers', () => {
    expect(numberToWords(-1)).toBe('negative one')
    expect(numberToWords(-100)).toBe('negative one hundred')
  })
})

describe('numberToPersianWords', () => {
  test('converts Persian single digits', () => {
    expect(numberToPersianWords(0)).toBe('صفر')
    expect(numberToPersianWords(2)).toBe('دو')
    expect(numberToPersianWords('۲')).toBe('دو')
    expect(numberToPersianWords(9)).toBe('نه')
    expect(numberToPersianWords('۹')).toBe('نه')
  })

  test('converts Persian teens', () => {
    expect(numberToPersianWords(10)).toBe('ده')
    expect(numberToPersianWords(11)).toBe('یازده')
    expect(numberToPersianWords(15)).toBe('پانزده')
    expect(numberToPersianWords('۱۵')).toBe('پانزده')
  })

  test('converts Persian tens', () => {
    expect(numberToPersianWords(20)).toBe('بیست')
    expect(numberToPersianWords(42)).toBe('چهل و دو')
    expect(numberToPersianWords('۴۲')).toBe('چهل و دو')
    expect(numberToPersianWords(99)).toBe('نود و نه')
  })

  test('converts Persian hundreds', () => {
    expect(numberToPersianWords(100)).toBe('صد')
    expect(numberToPersianWords(101)).toBe('صد و یک')
    expect(numberToPersianWords(110)).toBe('صد و ده')
    expect(numberToPersianWords(345)).toBe('سیصد و چهل و پنج')
    expect(numberToPersianWords('۳۴۵')).toBe('سیصد و چهل و پنج')
  })

  test('converts Persian thousands', () => {
    expect(numberToPersianWords(1000)).toBe('یک هزار')
    expect(numberToPersianWords(1234)).toBe('یک هزار و دویست و سی و چهار')
    expect(numberToPersianWords('۱۲۳۴')).toBe('یک هزار و دویست و سی و چهار')
  })

  test('converts Persian negative numbers', () => {
    expect(numberToPersianWords(-1)).toBe('منفی یک')
    expect(numberToPersianWords(-100)).toBe('منفی صد')
    expect(numberToPersianWords('-۱۰۰')).toBe('منفی صد')
  })
})

describe('wordsToNumber', () => {
  test('converts basic numbers', () => {
    expect(wordsToNumber('zero')).toBe(0)
    expect(wordsToNumber('one')).toBe(1)
    expect(wordsToNumber('twenty')).toBe(20)
    expect(wordsToNumber('twenty-one')).toBe(21)
  })

  test('converts complex numbers', () => {
    expect(wordsToNumber('one hundred')).toBe(100)
    expect(wordsToNumber('one hundred and one')).toBe(101)
    expect(wordsToNumber('one thousand two hundred and thirty-four')).toBe(1234)
  })

  test('converts large numbers', () => {
    expect(wordsToNumber('one million')).toBe(1000000)
    expect(wordsToNumber('one billion')).toBe(1000000000)
  })

  test('converts negative numbers', () => {
    expect(wordsToNumber('negative one')).toBe(-1)
    expect(wordsToNumber('negative twenty')).toBe(-20)
  })
})

describe('persianWordsToNumber', () => {
  test('converts basic Persian numbers', () => {
    expect(persianWordsToNumber('صفر')).toBe(0)
    expect(persianWordsToNumber('یک')).toBe(1)
    expect(persianWordsToNumber('بیست')).toBe(20)
    expect(persianWordsToNumber('بیست و یک')).toBe(21)
  })

  test('converts complex Persian numbers', () => {
    expect(persianWordsToNumber('صد')).toBe(100)
    expect(persianWordsToNumber('صد و یک')).toBe(101)
    expect(persianWordsToNumber('یک هزار و دویست و سی و چهار')).toBe(1234)
  })

  test('converts large Persian numbers', () => {
    expect(persianWordsToNumber('یک میلیون')).toBe(1000000)
    expect(persianWordsToNumber('یک میلیارد')).toBe(1000000000)
  })

  test('converts negative Persian numbers', () => {
    expect(persianWordsToNumber('منفی یک')).toBe(-1)
    expect(persianWordsToNumber('منفی بیست')).toBe(-20)
  })
})

describe('stringToNumber', () => {
  test('converts regular numbers', () => {
    expect(stringToNumber('123')).toBe(123)
    expect(stringToNumber('-456')).toBe(-456)
  })

  test('converts Persian numerals', () => {
    expect(stringToNumber('۱۲۳')).toBe(123)
    expect(stringToNumber('۴۵۶')).toBe(456)
  })

  test('converts English words', () => {
    expect(stringToNumber('one hundred and twenty-three')).toBe(123)
    expect(stringToNumber('negative four hundred and fifty-six')).toBe(-456)
  })

  test('converts Persian words', () => {
    expect(stringToNumber('صد و بیست و سه')).toBe(123)
    expect(stringToNumber('منفی چهارصد و پنجاه و شش')).toBe(-456)
  })
})

describe('numberToString', () => {
  test('converts to English words', () => {
    expect(numberToString(123)).toBe('one hundred and twenty-three')
    expect(numberToString(456, 'english')).toBe('four hundred and fifty-six')
  })

  test('converts to Persian words', () => {
    expect(numberToString(123, 'persian')).toBe('صد و بیست و سه')
    expect(numberToString(456, 'persian')).toBe('چهارصد و پنجاه و شش')
  })
})

describe('numberToPersianNumerals', () => {
  test('converts regular numbers to Persian numerals', () => {
    expect(numberToPersianNumerals(0)).toBe('۰')
    expect(numberToPersianNumerals(123)).toBe('۱۲۳')
    expect(numberToPersianNumerals(220)).toBe('۲۲۰')
    expect(numberToPersianNumerals(9876)).toBe('۹۸۷۶')
    expect(numberToPersianNumerals(1234567)).toBe('۱۲۳۴۵۶۷')
  })

  test('handles negative numbers', () => {
    expect(numberToPersianNumerals(-123)).toBe('-۱۲۳')
    expect(numberToPersianNumerals(-456)).toBe('-۴۵۶')
  })
})

describe('persianNumeralsToNumber', () => {
  test('converts Persian numerals to regular numbers', () => {
    expect(persianNumeralsToNumber('۰')).toBe(0)
    expect(persianNumeralsToNumber('۱۲۳')).toBe(123)
    expect(persianNumeralsToNumber('۲۲۰')).toBe(220)
    expect(persianNumeralsToNumber('۹۸۷۶')).toBe(9876)
    expect(persianNumeralsToNumber('۱۲۳۴۵۶۷')).toBe(1234567)
  })

  test('handles mixed numerals', () => {
    expect(persianNumeralsToNumber('۱2۳')).toBe(123)
    expect(persianNumeralsToNumber('4۵6')).toBe(456)
  })
})
