import pdfplumber
import re
from .config import UPLOAD_FOLDER


# после изменений надо перезагшружать sudo systemctl restart pdfreport.service
KEYS = {
        'Молочная кислота (лактат, E270)': {'min': 4.081, 'max': 28.79},
        'Пировиноградная кислота (пируват)': {'min': 3.26, 'max': 21.087, 'min_tooltip':'ниже нормы', 'max_tooltip':'а это выше нормы', 'class':'piruvat'},
        'Лимонная кислота (цитрат, Е330)': {'min': 22.64, 'max': 238.79, 'min_tooltip':'ниже нормы', 'max_tooltip':'а это выше нормы', 'class':'lemon'},
        'цис-Аконитовая кислота (пропилентрикарбоновая)': {'min': 10.16, 'max': 45.44},
        'Изолимонная кислота (изоцитрат)': {'min': 13.21, 'max': 58.38, 'min_tooltip':'ниже нормы', 'max_tooltip':'а это выше нормы!', 'class':'izocitrat'},
        '2-Кетоглутаровая кислота (2-оксоглутаровая кислота)': {'min': 0.436, 'max': 2.978},
#         'Янтарная кислота (сукциновая кислота, сукцинат, Е363)': {'min': 0.69, 'max': 5.279, 'min_tooltip':'ниже нормы', 'max_tooltip':'а это выше нормы', 'class':'sukcinat'},
        'Янтарная кислота (сукциновая': {'min': 0.69, 'max': 5.279, 'min_tooltip':'ниже нормы', 'max_tooltip':'а это выше нормы', 'class':'sukcinat'},
        'Фумаровая кислота (болетовая кислота, E297)': {'min': 0.07, 'max': 0.664},
        'Яблочная кислота (малат,': {'min': 0.153, 'max': 1.721, 'min_tooltip':'ниже нормы', 'max_tooltip':'а это выше нормы', 'class':'malat'},
        '2-Метилглутаровая (2-метилпентандиовая кислота)': {'min': 0.237, 'max': 1.415},
        'Ацетоуксусная кислота (3-кетомасляная кислота,': {'min': 0.0016, 'max': 0.0897},
        '3-Гидроксимасляная кислота': {'min': 0.356, 'max': 25.142},
        'Малоновая кислота (пропандиовая кислота)': {'min': 0.107, 'max': 0.864},
        '2-Гидрокси-3-метилбутановая кислота': {'min': 0.071, 'max': 0.46},
        '3-Метилкротонилглицин': {'min': 0.237, 'max': 2.396},
        '3-Метилглутаровая кислота (3-метилпентандиоевая': {'min': 0.238, 'max': 1.424},
        'Изовалерилглицин (N-изопентаноилглицин)': {'min': 0.179, 'max': 1.996},
        'пара-Гидроксифенилмолочная кислота': {'min': 0.0, 'max': 0.87},
        'пара-Гидроксифенилпировиноградная кислота': {'min': 0.258, 'max': 3.395},
        'Гомогентизиновая кислота': {'min': 0.024, 'max': 1.174},
        '3-Фенилмолочная кислота': {'min': 0.015, 'max': 0.159},
        'Фенилглиоксиловая кислота (бензоилмуравьиная),': {'min': 0.0, 'max': 0.018},
        'Миндальная кислота (фенилгликолевая кислота),': {'min': 0.0, 'max': 2.36},
        'Квинолиновая кислота (хинолиновая;': {'min': 0.6, 'max': 1.988},
        'Пиколиновая кислота': {'min': 0.215, 'max': 1.709},
        'Гликолиевая кислота (гидроксиуксусная кислота)': {'min': 7.17, 'max': 28.16},
        'Глицериновая кислота (2,3-дигидроксипропановая': {'min': 0.936, 'max': 4.51},
        'Щавелевая кислота (этандиовая, оксаловая кислота)': {'min': 1.19, 'max': 12.92},
        '2-Кетоизовалериановая кислота': {'min': 0.197, 'max': 0.981},
        '3-Метил-2-оксовалерьяновая кислота': {'min': 0.339, 'max': 2.477},
        '4-Метил-2-оксовалерьяновая кислота': {'min': 0.162, 'max': 1.318},
        'Глутаровая кислота (пентандиовая кислота)': {'min': 0.068, 'max': 0.542},
        'Себациновая кислота (декандиовая кислота)': {'min': 0.009, 'max': 0.126},
        'Адипиновая кислота (гександиовая кислота, Е355)': {'min': 0.525, 'max': 3.743},
        'Субериновая кислота (пробковая, октандиовая кислота)': {'min': 0.363, 'max': 1.914},
        'Этилмалоновая кислота (2-карбоксимасляная кислота)': {'min': 1.52, 'max': 13.73},
        'Метилянтарная кислота (пиротартаровая кислота)': {'min': 0.74, 'max': 3.265},
        'Ксантуреновая кислота (8-гидроксикинуреновая': {'min': 0.1371, 'max': 1.3414},
        'Кинуреновая кислота': {'min': 0.599, 'max': 2.177},
        '3-Гидроксиизовалериановая кислота': {'min': 2.281, 'max': 11.538},
        '3-Гидрокси-3-метилглутаровая кислота (меглутол)': {'min': 3.306, 'max': 8.73},
        'Формиминоглутаминовая кислота': {'min': 0.07, 'max': 0.654},
        'Метилмалоновая кислота': {'min': 0.362, 'max': 2.396},
        '2-Гидроксимасляная кислота (2-гидроксибутановая': {'min': 0.125, 'max': 0.722},
        'Пироглутаминовая кислота (5-оксопролин)': {'min': 4.87, 'max': 25.74},
        'N-Ацетил-L-аспартиковая кислота (N-ацетил-L-аспартат)': {'min': 0.465, 'max': 7.476},
        'Оротовая кислота (пиримидин-4-карбоновая кислота)': {'min': 0.117, 'max': 0.731},
        'Гиппуровая кислота (N-бензоилглицин), ммоль/л': {'min': 0.706, 'max': 7.236},
        'Метилгиппуровые кислоты, сум., ммоль/л': {'min': 0.0, 'max': 10.36},
        'Бензойная кислота (драциловая кислота, E210)': {'min': 0.116, 'max': 0.987},
        'орто-Гидроксифенилуксусная кислота': {'min': 0.46, 'max': 3.1},
        'пара-Гидроксибензойная кислота (пара-карбоксифенол)': {'min': 0.358, 'max': 3.85},
        'Гиппуровая кислота (N-бензоилглицин), ммоль/моль': {'min': 66.14, 'max': 623.96},
        'Метилгиппуровые кислоты, сум., ммоль/моль креат.': {'min': 0.0, 'max': 1.1},
        'орто-Метилгиппуровая кислота': {'min': 0.016, 'max': 0.172},
        'мета-Метилгиппуровая кислота': {'min': 0.015, 'max': 0.167},
        'пара-Метилгиппуровая кислота': {'min': 0.017, 'max': 0.164},
        'Трикарбаллиловая кислота': {'min': 0.053, 'max': 0.698},
        '3-Индолилуксусная кислота (гетероауксин)': {'min': 1.07, 'max': 5.645},
        'Кофейная кислота (3,4-дигидроксикоричная,': {'min': 0.0651, 'max': 0.2841},
        'Винная кислота (диоксиянтарная, тартаровая, Е334)': {'min': 0.493, 'max': 9.66},
        '2-Гидрокси-2-метилбутандиовая кислота': {'min': 0.687, 'max': 7.04},
#         'Креатинин': {'min': None, 'max': None}
}

# Регулярное выражение для поиска значений в Helix (значение сразу после ключа)
PATTERN_HELIX = re.compile(r"^(.+?)\s+([\d.,]+)\s+(ммоль/моль креат\.|у\.е\./моль креат\.|ммоль/л)")

# Регулярное выражение для поиска значений в Chromolab (последнее число в строке)
PATTERN_NUMBER_AT_END = re.compile(r"([\d.,]+)\s*$")

def extract_metadata(pdf_path):
    """ Определяет лабораторию по метаданным PDF """
    with pdfplumber.open(pdf_path) as pdf:
        metadata = pdf.metadata
        return metadata.get("Author", "").lower()


def parse_helix(pdf):
    """ Парсинг отчёта Helix """
    for page in pdf.pages:
        text = page.extract_text()
        if not text:
            continue

        lines = text.split("\n")
        for line in lines:
            for key in KEYS:
                if key in line:  # Нашли нужный ключ в строке
                    match = re.search(rf"{re.escape(key)}\s+([\d.,]+)", line)
                    if not match:
                        # Если не нашли — ищем первое число с точкой, окружённое пробелами
                        match = re.search(r"\s([\d]+\.[\d]+)\s", line)
                    if match:
                        value = float(match.group(1).replace(",", "."))
                        KEYS[key]["actual"] = value


def parse_chromolab(pdf):
    """ Парсинг отчёта Chromolab """
    for page in pdf.pages:
        text = page.extract_text()
        if not text:
            continue

        lines = text.split("\n")
        for i, line in enumerate(lines):
            for key in KEYS:
                if key in line:  # Нашли нужный ключ
                    match = PATTERN_NUMBER_AT_END.search(line)
                    if not match and i + 1 < len(lines):
                        match = PATTERN_NUMBER_AT_END.search(lines[i + 1])
                    if not match and i + 2 < len(lines):
                        match = PATTERN_NUMBER_AT_END.search(lines[i + 2])
                    if match:
                        value = float(match.group(1).replace(",", "."))
                        KEYS[key]["actual"] = value


def parse_pdf(pdf_path):
    """ Определяем тип отчета и запускаем нужный парсер """
    report_type = extract_metadata(pdf_path)  # Определяем лабораторию

    with pdfplumber.open(pdf_path) as pdf:
        if "chromolab" in report_type:
            parse_chromolab(pdf)
        else:
            parse_helix(pdf)

    return KEYS


# # Запуск обработки PDF
# acids_data = parse_pdf(pdf_path)

