#!/usr/bin/env python3
"""
Скрипт для обновления памяти OpenClaw на основе собранных данных из Telegram
"""

import os
import sys
import glob
import re
from datetime import datetime
import logging

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("update_memory.log"),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

# Пути к файлам
KNOWLEDGE_BASE = "knowledge_base.md"
MEMORY_FILE = "/home/node/.openclaw/workspace/MEMORY.md"
DAILY_MEMORY_DIR = "/home/node/.openclaw/workspace/memory"
TOPICS_DIR = "data/topics"

def create_daily_memory_file():
    """Создает файл ежедневной памяти с информацией о собранных данных из Telegram"""
    try:
        today = datetime.now().strftime("%Y-%m-%d")
        memory_file = f"{DAILY_MEMORY_DIR}/{today}.md"
        
        # Проверяем, существует ли директория, если нет - создаем
        os.makedirs(DAILY_MEMORY_DIR, exist_ok=True)
        
        # Если файл уже существует, добавляем к нему, иначе создаем новый
        mode = 'a' if os.path.exists(memory_file) else 'w'
        
        with open(memory_file, mode, encoding='utf-8') as f:
            if mode == 'w':
                f.write(f"# Дневная память {today}\n\n")
            
            f.write(f"## Обновление данных из Telegram ({datetime.now().strftime('%H:%M:%S')})\n\n")
            
            # Проверяем, существует ли база знаний
            if os.path.exists(KNOWLEDGE_BASE):
                f.write("Собраны новые данные из Telegram-каналов и обновлена база знаний.\n\n")
                
                # Считаем количество обновленных тем
                topics_count = 0
                for topic_dir in glob.glob(f"{TOPICS_DIR}/*"):
                    if os.path.isdir(topic_dir) and os.path.basename(topic_dir) != "unclassified":
                        topics_count += 1
                
                f.write(f"Обновлено тем: {topics_count}\n")
                
                # Подсчитываем файлы за сегодня
                today_files = glob.glob(f"{TOPICS_DIR}/*/{today}.md")
                if today_files:
                    f.write(f"Сегодня обновлено {len(today_files)} тем.\n\n")
                    
                    # Добавляем список обновленных тем
                    f.write("Обновленные темы:\n")
                    for file in today_files:
                        topic_name = os.path.basename(os.path.dirname(file)).replace('_', ' ').capitalize()
                        f.write(f"- {topic_name}\n")
            else:
                f.write("Попытка обновления данных из Telegram, но база знаний не найдена.\n")
            
            f.write("\n")
        
        logger.info(f"Создан файл ежедневной памяти: {memory_file}")
        return True
    
    except Exception as e:
        logger.error(f"Ошибка при создании файла ежедневной памяти: {e}")
        return False

def update_memory():
    """Обновляет основной файл памяти OpenClaw с информацией из базы знаний"""
    try:
        # Проверяем существование файлов
        if not os.path.exists(KNOWLEDGE_BASE):
            logger.error(f"Файл базы знаний {KNOWLEDGE_BASE} не найден")
            return False
            
        if not os.path.exists(MEMORY_FILE):
            logger.error(f"Файл памяти {MEMORY_FILE} не найден")
            return False
        
        # Читаем текущую память
        with open(MEMORY_FILE, 'r', encoding='utf-8') as f:
            memory_content = f.read()
        
        # Читаем базу знаний
        with open(KNOWLEDGE_BASE, 'r', encoding='utf-8') as f:
            kb_content = f.read()
        
        # Проверяем, есть ли раздел "Данные из Telegram" в памяти
        telegram_section_pattern = r'## Данные из Telegram\s+(.+?)(?=\n##|\Z)'
        telegram_section_match = re.search(telegram_section_pattern, memory_content, re.DOTALL)
        
        # Извлекаем основные данные из базы знаний
        kb_sections = {}
        
        current_section = None
        current_content = []
        
        for line in kb_content.splitlines():
            if line.startswith('## '):
                if current_section:
                    kb_sections[current_section] = '\n'.join(current_content)
                current_section = line[3:].strip()
                current_content = []
            elif current_section:
                current_content.append(line)
        
        # Добавляем последний раздел
        if current_section and current_content:
            kb_sections[current_section] = '\n'.join(current_content)
        
        # Формируем новое содержимое раздела "Данные из Telegram"
        telegram_data = [f"## Данные из Telegram\n\n### Обновлено: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"]
        
        # Добавляем краткую информацию о каждой теме
        for topic, content in kb_sections.items():
            # Ограничиваем содержимое до 300 символов
            short_content = content[:300] + "..." if len(content) > 300 else content
            telegram_data.append(f"### {topic}\n{short_content}\n")
        
        new_telegram_section = '\n'.join(telegram_data)
        
        # Обновляем файл памяти
        if telegram_section_match:
            # Если раздел существует, обновляем его
            updated_memory = re.sub(
                telegram_section_pattern,
                f"## Данные из Telegram\n{new_telegram_section}",
                memory_content,
                flags=re.DOTALL
            )
        else:
            # Если раздела нет, добавляем его в конец файла
            updated_memory = memory_content.rstrip() + "\n\n" + new_telegram_section
        
        # Записываем обновленную память
        with open(MEMORY_FILE, 'w', encoding='utf-8') as f:
            f.write(updated_memory)
        
        logger.info(f"Файл памяти {MEMORY_FILE} успешно обновлен")
        return True
    
    except Exception as e:
        logger.error(f"Ошибка при обновлении файла памяти: {e}")
        return False

def main():
    """Основная функция для запуска обновления памяти"""
    try:
        # Создаем файл ежедневной памяти
        daily_result = create_daily_memory_file()
        
        # Обновляем основной файл памяти
        memory_result = update_memory()
        
        if daily_result and memory_result:
            print("Память OpenClaw успешно обновлена.")
        elif not daily_result and memory_result:
            print("Основная память обновлена, но возникла ошибка при создании ежедневной памяти.")
        elif daily_result and not memory_result:
            print("Ежедневная память создана, но возникла ошибка при обновлении основной памяти.")
        else:
            print("Возникли ошибки при обновлении памяти OpenClaw.")
            return 1
        
        return 0
    except Exception as e:
        logger.error(f"Критическая ошибка: {e}")
        return 1

if __name__ == "__main__":
    sys.exit(main())