#!/usr/bin/env python3

import json
import os
from datetime import datetime, timedelta
import logging


class HistoryManager:
    def __init__(self, history_file='published_history.json'):
        self.logger = logging.getLogger(__name__)
        self.history_file = history_file
        self.history = self._load_history()
        
    def _load_history(self):
        """Загрузка истории из файла"""
        if os.path.exists(self.history_file):
            try:
                with open(self.history_file, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    self.logger.info(f"Загружена история: {len(data.get('telegram', []))} записей для Telegram")
                    return data
            except Exception as e:
                self.logger.error(f"Ошибка загрузки истории: {e}")
                return self._get_empty_history()
        else:
            self.logger.info("Файл истории не найден, создаём новый")
            return self._get_empty_history()
    
    def _get_empty_history(self):
        """Создание пустой структуры истории"""
        return {
            'telegram': [],
            'vk': [],
            'discord': []
        }
    
    def _save_history(self):
        """Сохранение истории в файл"""
        try:
            with open(self.history_file, 'w', encoding='utf-8') as f:
                json.dump(self.history, f, ensure_ascii=False, indent=2)
            self.logger.debug(f"История сохранена в {self.history_file}")
        except Exception as e:
            self.logger.error(f"Ошибка сохранения истории: {e}")
    
    def is_published(self, platform, title):
        """Проверка, была ли новость опубликована"""
        if platform not in self.history:
            return False
            
        # Проверяем по заголовку
        for entry in self.history[platform]:
            if entry['title'].lower().strip() == title.lower().strip():
                self.logger.debug(f"Новость '{title}' уже была опубликована в {platform}")
                return True
        
        return False
    
    def add_published(self, platform, topic_id, title):
        """Добавление записи об опубликованной новости"""
        if platform not in self.history:
            self.history[platform] = []
        
        entry = {
            'topic_id': topic_id,
            'title': title,
            'published_at': datetime.now().isoformat()
        }
        
        self.history[platform].append(entry)
        self.logger.info(f"Добавлена запись в историю {platform}: {title}")
        self._save_history()
    
    def cleanup_old_entries(self, days=365):
        """Удаление очень старых записей из истории (по умолчанию старше года)
        
        ВНИМАНИЕ: Удаление записей может привести к повторной публикации старых новостей!
        Используйте этот метод только если файл истории стал слишком большим.
        """
        cutoff_date = datetime.now() - timedelta(days=days)
        
        for platform in self.history:
            original_count = len(self.history[platform])
            self.history[platform] = [
                entry for entry in self.history[platform]
                if datetime.fromisoformat(entry['published_at']) > cutoff_date
            ]
            removed = original_count - len(self.history[platform])
            if removed > 0:
                self.logger.info(f"Удалено {removed} старых записей из истории {platform} (старше {days} дней)")
        
        self._save_history()
    
    def get_published_titles(self, platform):
        """Получение списка опубликованных заголовков для платформы"""
        if platform not in self.history:
            return []
        return [entry['title'] for entry in self.history[platform]]