
import re
from .dictionary import floor_mapping, roman_numerals
import re

# Floor mapping
floor_mapping = {
    0: [
        "parter", "ground floor", "groundfloor", "0", "floor 0", "floor0",
        "f0", "lvl 0", "level 0", "level0", "piętro 0", "0 piętro",
        "na parterze", "parterze", "parterowy"
    ],
}

roman_numerals = [
    "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X",
    "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX",
    "XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII", "XXVIII", "XXIX", "XXX",
    "XXXI", "XXXII", "XXXIII", "XXXIV", "XXXV", "XXXVI", "XXXVII", "XXXVIII", "XXXIX", "XL",
    "XLI", "XLII", "XLIII", "XLIV", "XLV", "XLVI", "XLVII", "XLVIII", "XLIX", "L"
]

ordinal_polish = [
    "", "pierwsze", "drugie", "trzecie", "czwarte", "piąte", "szóste", "siódme", "ósme", "dziewiąte", "dziesiąte",
    "jedenaste", "dwunaste", "trzynaste", "czternaste", "piętnaste", "szesnaste", "siedemnaste", "osiemnaste", "dziewiętnaste", "dwudzieste",
    "dwudzieste pierwsze", "dwudzieste drugie", "dwudzieste trzecie", "dwudzieste czwarte", "dwudzieste piąte",
    "dwudzieste szóste", "dwudzieste siódme", "dwudzieste ósme", "dwudzieste dziewiąte", "trzydzieste",
    "trzydzieste pierwsze", "trzydzieste drugie", "trzydzieste trzecie", "trzydzieste czwarte", "trzydzieste piąte",
    "trzydzieste szóste", "trzydzieste siódme", "trzydzieste ósme", "trzydzieste dziewiąte", "czterdzieste",
    "czterdzieste pierwsze", "czterdzieste drugie", "czterdzieste trzecie", "czterdzieste czwarte", "czterdzieste piąte",
    "czterdzieste szóste", "czterdzieste siódme", "czterdzieste ósme", "czterdzieste dziewiąte", "pięćdziesiąte"
]

ordinal_english = [
    "", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth",
    "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth",
    "twenty first", "twenty second", "twenty third", "twenty fourth", "twenty fifth",
    "twenty sixth", "twenty seventh", "twenty eighth", "twenty ninth", "thirtieth",
    "thirty first", "thirty second", "thirty third", "thirty fourth", "thirty fifth",
    "thirty sixth", "thirty seventh", "thirty eighth", "thirty ninth", "fortieth",
    "forty first", "forty second", "forty third", "forty fourth", "forty fifth",
    "forty sixth", "forty seventh", "forty eighth", "forty ninth", "fiftieth"
]

# Update floor mapping with all variants
floor_mapping.update({
    i: list(filter(None, [
        str(i),
        f"{ordinal_english[i]} floor",
        f"floor {i}",
        f"{i}th floor",
        f"{ordinal_english[i]}",
        f"floor{i}",
        f"f{i}",
        f"lvl {i}",
        f"level {i}",
        f"level{i}",
        f"piętro {i}",
        f"{i} piętro",
        f"{roman_numerals[i]} piętro" if roman_numerals[i] else None,
        roman_numerals[i] if roman_numerals[i] else None,
        f"piętro {ordinal_polish[i]}" if ordinal_polish[i] else None,
        f"{ordinal_polish[i]} piętro" if ordinal_polish[i] else None,
        f"na {ordinal_polish[i]} piętrze" if ordinal_polish[i] else None
    ]))
    for i in range(1, 51)
})

# Dodajemy specjalne wartości np. powyżej 10
floor_mapping[11] = ["higher floor", "floor higher 10", "floor above 10", "higher than 10", "floor_higher_10"]

# Normalizacja tekstu
def normalize_text(text):
    text = text.lower().replace('_', ' ').strip()
    text = re.sub(r'\s+', ' ', text)
    return text

# Normalizacja piętra
def normalize_floor(floor_string):
    if not floor_string:
        return None
    floor_string = normalize_text(floor_string)

    # Sprawdzanie z mapy
    for floor_number, keywords in floor_mapping.items():
        if any(keyword in floor_string for keyword in keywords):
            return floor_number

    # Ekstrakcja liczby z tekstu (np. "piętro 7/9")
    numbers = re.findall(r'\b\d+\b', floor_string)
    if numbers:
        num = int(numbers[0])
        if num > 50:
            return 50
        return num

    return None

