package kz.konturai.parser.util;

import lombok.experimental.UtilityClass;

/**
 * Утилита для парсинга диапазонов вида "10 000 – 30 000 человек/день".
 */
@UtilityClass
public class RangeParser {

    /**
     * Извлекает минимальное значение из строки вида "10 000 – 30 000 человек/день".
     * @return минимальное значение или null если парсинг не удался
     */
    public Long extractMin(String rangeStr) {
        if (rangeStr == null || rangeStr.isBlank()) return null;
        long[] parsed = parse(rangeStr);
        return parsed != null ? parsed[0] : null;
    }

    /**
     * Извлекает максимальное значение из строки вида "10 000 – 30 000 человек/день".
     * @return максимальное значение или null если парсинг не удался
     */
    public Long extractMax(String rangeStr) {
        if (rangeStr == null || rangeStr.isBlank()) return null;
        long[] parsed = parse(rangeStr);
        return parsed != null ? parsed[1] : null;
    }

    private long[] parse(String raw) {
        try {
            // Убираем всё кроме цифр, пробелов и разделителей
            String cleaned = raw
                    .replaceAll("[^\\d\\s–—\\-]", "")   // оставляем цифры, пробелы, тире
                    .replaceAll("\\s+", " ")             // нормализуем пробелы
                    .trim();

            // Ищем разделитель диапазона
            String[] parts = cleaned.split("[–—\\-]", 2);
            if (parts.length == 2) {
                long min = parseLong(parts[0]);
                long max = parseLong(parts[1]);
                return new long[]{min, max};
            }

            // Одиночное число
            long val = parseLong(cleaned);
            return new long[]{val, val};

        } catch (Exception e) {
            return null;
        }
    }

    private long parseLong(String s) {
        return Long.parseLong(s.replaceAll("\\s", "").trim());
    }
}
