package kz.konturai.parser.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * Утилита для проверки доступности RSS-лент
 */
@Component
public class RssUrlValidator {

    private static final Logger logger = LoggerFactory.getLogger(RssUrlValidator.class);

    /**
     * Проверяет доступность RSS-ленты
     */
    public boolean isRssUrlAccessible(String url) {
        try {
            URL feedUrl = URI.create(url).toURL();
            HttpURLConnection connection = (HttpURLConnection) feedUrl.openConnection();
            connection.setRequestMethod("HEAD");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");

            int responseCode = connection.getResponseCode();
            connection.disconnect();

            return responseCode == 200;
        } catch (Exception e) {
            logger.warn("RSS URL недоступен: {} - {}", url, e.getMessage());
            return false;
        }
    }

    /**
     * Получает альтернативные URL для RSS-лент
     */
    public Map<String, String[]> getAlternativeUrls() {
        Map<String, String[]> alternatives = new HashMap<>();

        // Альтернативные URL для Kapital.kz
        alternatives.put("kapital", new String[] {
                "https://kapital.kz/rss/",
                "https://kapital.kz/feed/",
                "https://kapital.kz/rss.xml"
        });

        // Альтернативные URL для Kursiv
        alternatives.put("kursiv", new String[] {
                "https://kursiv.media/feed/",
                "https://kursiv.media/rss/",
                "https://kursiv.media/rss.xml"
        });

        // Альтернативные URL для LSM.kz
        alternatives.put("lsm", new String[] {
                "https://lsm.kz/rss",
                "https://lsm.kz/feed/",
                "https://lsm.kz/rss.xml"
        });

        // Альтернативные URL для РБК
        alternatives.put("rbc", new String[] {
                "https://static.feed.rbc.ru/rbc/logical/footer/news.rss",
                "https://rbc.ru/rss/",
                "https://rbc.ru/feed/",
                "https://www.rbc.ru/rss/",
                "https://www.rbc.ru/feed/"
        });

        // Альтернативные URL для Ведомости
        alternatives.put("vedomosti", new String[] {
                "https://www.vedomosti.ru/rss/rubric/technology/internet",
                "https://www.vedomosti.ru/rss/",
                "https://www.vedomosti.ru/feed/",
                "https://vedomosti.ru/rss/"
        });

        return alternatives;
    }

    /**
     * Находит первый доступный URL из списка альтернатив
     */
    public String findWorkingUrl(String sourceName) {
        Map<String, String[]> alternatives = getAlternativeUrls();
        String[] urls = alternatives.get(sourceName);

        if (urls == null) {
            return null;
        }

        for (String url : urls) {
            if (isRssUrlAccessible(url)) {
                logger.info("Найден рабочий URL для {}: {}", sourceName, url);
                return url;
            }
        }

        logger.warn("Не найдено рабочих URL для источника: {}", sourceName);
        return null;
    }

    /**
     * Проверяет все RSS-ленты и возвращает отчет
     */
    public Map<String, Boolean> checkAllRssUrls(Map<String, String> rssUrls) {
        Map<String, Boolean> results = new HashMap<>();

        for (Map.Entry<String, String> entry : rssUrls.entrySet()) {
            String source = entry.getKey();
            String url = entry.getValue();

            boolean isAccessible = isRssUrlAccessible(url);
            results.put(source, isAccessible);

            if (!isAccessible) {
                logger.warn("RSS URL недоступен: {} - {}", source, url);
                String alternativeUrl = findWorkingUrl(source);
                if (alternativeUrl != null) {
                    logger.info("Рекомендуется использовать альтернативный URL для {}: {}", source, alternativeUrl);
                }
            }
        }

        return results;
    }
}
