import pytest
from .decimals import inflect
from .errors import RangeError

# fmt: off
simple_map = {
    "nom": ("case", "nominative"),
    "gen": ("case", "genitive"),
    "dat": ("case", "dative"),
    "acc": ("case", "accusative"),
    "inst": ("case", "instrumental"),
    "loc": ("case", "locative"),
    "voc": ("case", "vocative"),
    "m": ("gender", "masculine"),
    "f": ("gender", "feminine"),
    "n": ("gender", "neuter"),
    "sg": ("number", "singular"),
    "pl": ("number", "plural"),
    "card": ("type", "cardinal"),
    "ord": ("type", "ordinal"),
    "inan": ("animacy", "inanimate"),
    "anim": ("animacy", "animate"),
}


def fm(s):
    return {simple_map[g][0]: simple_map[g][1] for g in s.split(";")}


def test_gov_agreement():
    assert inflect("", "1", fm("m")) == "одна́ деся́та"
    assert inflect("", "2", fm("m")) == "дві́ деся́тих"
    assert inflect("", "3", fm("m")) == "три́ деся́тих"
    assert inflect("", "5", fm("m")) == "пʼя́ть деся́тих"
    assert inflect("", "0", fm("m")) == "ну́ль деся́тих"

def test_range_fallback():
    assert inflect("", "99999999999999999999999999", fm("m")) == "девʼяно́сто де́вʼять септильйо́нів девʼятсо́т девʼяно́сто де́вʼять секстильйо́нів девʼятсо́т девʼяно́сто де́вʼять квінтильйо́нів девʼятсо́т девʼяно́сто де́вʼять квадрильйо́нів девʼятсо́т девʼяно́сто де́вʼять трильйо́нів девʼятсо́т девʼяно́сто де́вʼять мілья́рдів девʼятсо́т девʼяно́сто де́вʼять мільйо́нів девʼятсо́т девʼяно́сто де́вʼять ти́сяч девʼятсо́т девʼяно́сто де́вʼять стасептильйо́нних"
    assert inflect("", "00000000000000000000000001", fm("m")) == "одна́ стасептильйо́нна"
    assert inflect("", "100000000000000000000000000", fm("m")) == "сто́ септильйо́нів оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль нульови́х"
    assert inflect("", "000000000000000000000000001", fm("m")) == "одна́ оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль нульова́"
    assert inflect("", "1000000000000000000000000000", fm("m")) == "оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль нульова́"
    # assert inflect("", "1000000000000000000000000001", fm("m")) == "оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль оди́н"
    # assert inflect("", "1234567890123456789012345678", fm("m")) == "оди́н два́ три́ чоти́ри пʼя́ть ші́сть сі́м ві́сім де́вʼять ну́ль оди́н два́ три́ чоти́ри пʼя́ть ші́сть сі́м ві́сім де́вʼять ну́ль оди́н два́ три́ чоти́ри пʼя́ть ші́сть сі́м ві́сім"
    # assert inflect("", "999999999999999999999999999", fm("f")) == "девʼятсо́т девʼяно́сто де́вʼять септильйо́нів девʼятсо́т девʼяно́сто де́вʼять секстильйо́нів девʼятсо́т девʼяно́сто де́вʼять квінтильйо́нів девʼятсо́т девʼяно́сто де́вʼять квадрильйо́нів девʼятсо́т девʼяно́сто де́вʼять трильйо́нів девʼятсо́т девʼяно́сто де́вʼять мілья́рдів девʼятсо́т девʼяно́сто де́вʼять мільйо́нів девʼятсо́т девʼяно́сто де́вʼять ти́сяч девʼятсо́т девʼяно́сто де́вʼять"
    # assert inflect("", "1000000000000000000000000000", fm("f")) == "оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль"
    # assert inflect("", "1000000000000000000000000001", fm("f")) == "оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль одна́"
    # assert inflect("", "1234567890123456789012345678", fm("f")) == "оди́н два́ три́ чоти́ри пʼя́ть ші́сть сі́м ві́сім де́вʼять ну́ль оди́н два́ три́ чоти́ри пʼя́ть ші́сть сі́м ві́сім де́вʼять ну́ль оди́н два́ три́ чоти́ри пʼя́ть ші́сть сі́м ві́сім"
    # assert inflect("", "1000000000000000000000000000", fm("gen;f")) == "оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль нуля́"
    # assert inflect("", "1000000000000000000000000001", fm("gen;f")) == "оди́н ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль ну́ль одніє́ї"


def test_strict_range():
    assert inflect("", "99999999999999999999999999", fm("m"), strict_range=True)
    with pytest.raises(RangeError):
        assert inflect("", "100000000000000000000000000", fm("m"), strict_range=True)
