import tkinter as tk
from tkinter import scrolledtext, messagebox, filedialog
import feedparser
import re
import csv

# Функция для парсинга RSS ленты
def parse_rss(feed_url, parse_title, parse_content):
    feed = feedparser.parse(feed_url)
    entries = []

    for entry in feed.entries:
        result = ""
        if parse_title:
            result += f"Заголовок: {entry.title}\n" if hasattr(entry, 'title') else "Заголовок не найден\n"
        if parse_content:
            result += f"Содержание: {entry.summary}\n" if hasattr(entry, 'summary') else "Содержание не найдено\n"
        
        # Добавляем дату публикации и ссылку на статью
        if hasattr(entry, 'published'):
            result += f"Дата публикации: {entry.published}\n"
        else:
            result += "Дата публикации не найдена\n"
        if hasattr(entry, 'link'):
            result += f"Ссылка на статью: {entry.link}\n"
        else:
            result += "Ссылка на статью не найдена\n"
        
        entries.append(result + "\n" + "-"*50 + "\n")
    
    return entries

# Функция для проверки валидности URL
def is_valid_url(url):
    # Простая проверка URL
    regex = re.compile(
        r'^(?:http|ftp)s?://'  # http:// или https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  # домен
        r'localhost|'  # localhost
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|'  # IP-адрес
        r'\[?[A-F0-9]*:[A-F0-9:]+\]?)'  # IPv6
        r'(?::\d+)?'  # порт
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)
    return re.match(regex, url) is not None

# Функция для сохранения данных в файл
def save_to_file(data):
    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt"), ("CSV files", "*.csv")])
    if file_path:
        try:
            if file_path.endswith(".csv"):
                # Сохранение в CSV
                with open(file_path, 'w', newline='', encoding='utf-8') as file:
                    writer = csv.writer(file)
                    writer.writerow(["Заголовок", "Содержание", "Дата", "Ссылка"])  # Заголовки столбцов
                    for entry in data:
                        # Обработка каждой записи, разделяем заголовки и данные
                        lines = entry.split("\n")
                        title, content, date, link = "", "", "", ""
                        for line in lines:
                            if line.startswith("Заголовок:"):
                                title = line.replace("Заголовок:", "").strip()
                            elif line.startswith("Содержание:"):
                                content = line.replace("Содержание:", "").strip()
                            elif line.startswith("Дата публикации:"):
                                date = line.replace("Дата публикации:", "").strip()
                            elif line.startswith("Ссылка на статью:"):
                                link = line.replace("Ссылка на статью:", "").strip()
                        writer.writerow([title, content, date, link])  # Запись строки в CSV

            else:
                # Сохранение в текстовый файл
                with open(file_path, 'w', encoding='utf-8') as file:
                    file.write("\n".join(data))
            
            messagebox.showinfo("Сохранение", "Данные успешно сохранены!")
        except Exception as e:
            messagebox.showerror("Ошибка", f"Не удалось сохранить файл: {e}")

# Функция для выполнения парсинга и вывода результатов
def run_parser():
    feed_url = url_entry.get()  # Получение URL RSS ленты
    parse_title = title_var.get()  # Проверка чекбокса для заголовков
    parse_content = content_var.get()  # Проверка чекбокса для содержания

    if not feed_url:
        messagebox.showerror("Ошибка", "Введите адрес RSS ленты")
        return
    
    if not is_valid_url(feed_url):
        messagebox.showerror("Ошибка", "Некорректный URL. Введите правильный URL.")
        return

    try:
        parsed_data = parse_rss(feed_url, parse_title, parse_content)
        
        if not parsed_data:  # Проверка на наличие данных
            messagebox.showinfo("Информация", "По данному запросу не найдено ни одной записи.")
            return
        
        result_text.delete(1.0, tk.END)  # Очистить окно результатов
        result_text.insert(tk.END, "\n".join(parsed_data))  # Вставить результаты парсинга
    except Exception as e:
        messagebox.showerror("Ошибка", f"Не удалось выполнить парсинг: {e}")

# Создание основного окна приложения
window = tk.Tk()
window.title("RSS Парсер")
window.geometry("700x500")

# Поле для ввода URL
tk.Label(window, text="Введите адрес RSS ленты:").pack(pady=5)
url_entry = tk.Entry(window, width=50)
url_entry.pack(pady=5)

# Чекбоксы для выбора заголовка и содержания
title_var = tk.BooleanVar()
content_var = tk.BooleanVar()

tk.Checkbutton(window, text="Парсить заголовки", variable=title_var).pack(pady=2)
tk.Checkbutton(window, text="Парсить содержание", variable=content_var).pack(pady=2)

# Кнопка для выполнения парсинга
parse_button = tk.Button(window, text="Запустить парсер", command=run_parser)
parse_button.pack(pady=10)

# Кнопка для сохранения данных
save_button = tk.Button(window, text="Сохранить результаты", command=lambda: save_to_file(result_text.get(1.0, tk.END).splitlines()))
save_button.pack(pady=5)

# Окно для вывода результатов
tk.Label(window, text="Результаты парсинга:").pack(pady=5)
result_text = scrolledtext.ScrolledText(window, width=80, height=20)
result_text.pack(pady=5)

# Запуск основного цикла приложения
window.mainloop()