#!/usr/bin/env python3
"""
Telegram Collector - Configuration Script
----------------------------------------
This script helps set up and configure the Telegram Collector skill
for monitoring and extracting knowledge from Telegram groups and channels.
"""

import os
import sys
import json
import re
from pathlib import Path
import subprocess
import shutil

# Директории
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
SCRIPTS_DIR = os.path.join(SCRIPT_DIR, "scripts")
REFERENCES_DIR = os.path.join(SCRIPT_DIR, "references")
DATA_DIR = os.path.join(SCRIPT_DIR, "data")

# Убедитесь, что все необходимые директории существуют
os.makedirs(SCRIPTS_DIR, exist_ok=True)
os.makedirs(REFERENCES_DIR, exist_ok=True)
os.makedirs(DATA_DIR, exist_ok=True)
os.makedirs(os.path.join(DATA_DIR, "raw"), exist_ok=True)
os.makedirs(os.path.join(DATA_DIR, "topics"), exist_ok=True)
os.makedirs(os.path.join(DATA_DIR, "summaries"), exist_ok=True)

# Файл конфигурации
CONFIG_FILE = os.path.join(SCRIPT_DIR, "config.json")

def print_banner():
    """Выводит баннер приветствия"""
    print("\n" + "=" * 60)
    print("  TELEGRAM COLLECTOR - КОНФИГУРАЦИЯ  ".center(60))
    print("=" * 60)
    print("\nЭтот мастер поможет вам настроить сбор данных из Telegram.")
    print("Для работы вам понадобятся учетные данные Telegram API.\n")

def check_dependencies():
    """Проверяет наличие необходимых зависимостей"""
    print("Проверка зависимостей...")
    
    # Проверка Python
    try:
        python_version = subprocess.check_output(["python3", "--version"], universal_newlines=True)
        print(f"✅ {python_version.strip()}")
    except:
        print("❌ Python3 не найден. Пожалуйста, установите Python3.")
        return False
    
    # Проверка pip
    try:
        pip_version = subprocess.check_output(["pip3", "--version"], universal_newlines=True)
        print(f"✅ pip установлен: {pip_version.split()[1]}")
    except:
        print("❌ pip не найден. Пожалуйста, установите pip.")
        return False
    
    # Установка необходимых пакетов
    print("\nУстановка необходимых пакетов...")
    try:
        subprocess.check_call(["pip3", "install", "telethon", "python-dotenv", "nltk"])
        print("✅ Все пакеты установлены успешно")
    except:
        print("❌ Ошибка при установке пакетов")
        return False
    
    # Проверка NLTK данных
    try:
        import nltk
        nltk.download('punkt', quiet=True)
        nltk.download('stopwords', quiet=True)
        print("✅ NLTK данные загружены")
    except:
        print("❌ Ошибка при загрузке NLTK данных")
    
    return True

def get_telegram_api_credentials():
    """Получает учетные данные Telegram API от пользователя"""
    print("\n" + "=" * 60)
    print("НАСТРОЙКА TELEGRAM API".center(60))
    print("=" * 60)
    
    print("\nДля использования API Telegram вам необходимы API ID и API Hash.")
    print("Их можно получить на сайте https://my.telegram.org/apps\n")
    
    api_id = input("Введите API ID: ").strip()
    while not api_id.isdigit():
        print("❌ API ID должен быть числом")
        api_id = input("Введите API ID: ").strip()
    
    api_hash = input("Введите API Hash: ").strip()
    while not re.match(r'^[a-f0-9]{32}$', api_hash, re.I):
        print("❌ API Hash должен быть 32-символьной строкой")
        api_hash = input("Введите API Hash: ").strip()
    
    phone = input("Введите номер телефона (в международном формате, например +79123456789): ").strip()
    while not re.match(r'^\+[0-9]{7,15}$', phone):
        print("❌ Неверный формат номера телефона")
        phone = input("Введите номер телефона (например +79123456789): ").strip()
    
    return {
        "api_id": api_id,
        "api_hash": api_hash,
        "phone": phone
    }

def create_env_file(credentials):
    """Создает файл .env с учетными данными"""
    env_file = os.path.expanduser("~/.openclaw/.env")
    
    with open(env_file, 'w', encoding='utf-8') as f:
        f.write(f"# Telegram API credentials\n")
        f.write(f"TELEGRAM_API_ID={credentials['api_id']}\n")
        f.write(f"TELEGRAM_API_HASH={credentials['api_hash']}\n")
        f.write(f"TELEGRAM_PHONE={credentials['phone']}\n")
        f.write(f"TELEGRAM_SESSION=telegram_collector\n\n")
        f.write(f"# Output directory\n")
        f.write(f"OUTPUT_DIR={DATA_DIR}\n")
    
    print(f"\n✅ Ключи добавлены в: {env_file}")
    
    # Сохраняем конфигурацию (credentials хранятся только в .env, не в config.json)
    config = {
        "credentials_configured": True,  # Флаг, что credentials настроены (хранятся в .env)
        "data_dir": DATA_DIR,
        "initialized": False,
        "cron_setup": False,
        "openclaw_integration": False
    }
    
    with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
        json.dump(config, f, indent=2)
    
    return True

def configure_cron():
    """Настраивает cron-задания для автоматического запуска"""
    print("\n" + "=" * 60)
    print("НАСТРОЙКА АВТОМАТИЗАЦИИ".center(60))
    print("=" * 60)
    
    print("\nВыберите частоту сбора данных из Telegram:")
    print("1. Каждый час")
    print("2. Каждые 6 часов (рекомендуется)")
    print("3. Каждые 12 часов")
    print("4. Раз в день")
    print("5. Не настраивать автоматизацию")
    
    choice = input("\nВаш выбор (1-5): ").strip()
    while choice not in ["1", "2", "3", "4", "5"]:
        choice = input("Пожалуйста, выберите 1-5: ").strip()
    
    if choice == "5":
        print("\n✅ Автоматизация не настроена. Вы можете запускать сбор данных вручную.")
        return False
    
    # Преобразуем выбор в выражение cron
    cron_expr = ""
    if choice == "1":
        cron_expr = "0 * * * *"  # Каждый час
    elif choice == "2":
        cron_expr = "0 */6 * * *"  # Каждые 6 часов
    elif choice == "3":
        cron_expr = "0 */12 * * *"  # Каждые 12 часов
    elif choice == "4":
        cron_expr = "0 0 * * *"  # В полночь каждый день
    
    # Подготавливаем задание cron в формате OpenClaw
    run_script = os.path.join(SCRIPTS_DIR, "run.sh")
    
    # Создаем файл запуска
    with open(run_script, 'w', encoding='utf-8') as f:
        f.write('#!/bin/bash\n')
        f.write(f'cd "{SCRIPT_DIR}"\n')
        f.write(f'python3 {SCRIPTS_DIR}/collector.py collect-all\n')
        f.write(f'python3 {SCRIPTS_DIR}/analyzer.py analyze-all\n')
        f.write(f'python3 {SCRIPTS_DIR}/analyzer.py update-kb\n')
    
    # Устанавливаем права на выполнение
    os.chmod(run_script, 0o755)
    
    print(f"\n✅ Создан скрипт запуска: {run_script}")
    
    # Настраиваем задание cron через OpenClaw
    print("\nНастройка cron-задания через OpenClaw...")
    try:
        subprocess.run(["openclaw", "cron", "add", "--job", json.dumps({
            "name": "telegram-collector:run",
            "schedule": {
                "kind": "cron",
                "expr": cron_expr,
                "tz": "UTC"
            },
            "payload": {
                "kind": "systemEvent",
                "text": f"Запуск сбора данных из Telegram: {run_script}"
            },
            "sessionTarget": "main",
            "enabled": True
        })], check=True)
        
        print("\n✅ Cron-задание успешно настроено")
        
        # Обновляем конфигурацию
        if os.path.exists(CONFIG_FILE):
            with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
                config = json.load(f)
            
            config["cron_setup"] = True
            config["cron_expr"] = cron_expr
            
            with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
                json.dump(config, f, indent=2)
        
        return True
    except:
        print("\n❌ Ошибка при настройке cron-задания")
        print("Вы можете настроить его позже вручную.")
        return False

def configure_openclaw_integration():
    """Настраивает интеграцию с памятью OpenClaw"""
    print("\n" + "=" * 60)
    print("ИНТЕГРАЦИЯ С OPENCLAW".center(60))
    print("=" * 60)
    
    print("\nХотите ли вы интегрировать собранные данные с памятью OpenClaw?")
    print("Это позволит автоматически обновлять MEMORY.md с информацией из Telegram.")
    
    choice = input("\nИнтегрировать с памятью OpenClaw? (y/n): ").strip().lower()
    if choice != "y":
        print("\n✅ Интеграция с памятью OpenClaw не настроена.")
        return False
    
    print("\nНастройка интеграции с памятью OpenClaw...")
    
    # Подготавливаем задание cron для обновления памяти
    try:
        subprocess.run(["openclaw", "cron", "add", "--job", json.dumps({
            "name": "telegram-collector:memory-update",
            "schedule": {
                "kind": "cron",
                "expr": "30 */8 * * *",  # Через 30 минут после каждых 8 часов
                "tz": "UTC"
            },
            "payload": {
                "kind": "agentTurn",
                "message": f"Обнови знания из Telegram. Изучи новые данные в директории {DATA_DIR} и обнови MEMORY.md добавив туда важную информацию из базы знаний knowledge_base.md. Также проверь, появились ли новые темы и категоризируй их.",
                "timeoutSeconds": 300  # 5 минут на выполнение
            },
            "sessionTarget": "isolated",
            "delivery": {
                "mode": "announce",
                "bestEffort": True
            },
            "enabled": True
        })], check=True)
        
        print("\n✅ Интеграция с памятью OpenClaw успешно настроена")
        
        # Обновляем конфигурацию
        if os.path.exists(CONFIG_FILE):
            with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
                config = json.load(f)
            
            config["openclaw_integration"] = True
            
            with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
                json.dump(config, f, indent=2)
        
        return True
    except:
        print("\n❌ Ошибка при настройке интеграции с OpenClaw")
        print("Вы можете настроить её позже вручную.")
        return False

def main():
    """Основная функция настройки"""
    print_banner()
    
    # Проверяем зависимости
    if not check_dependencies():
        print("\n❌ Ошибка при проверке зависимостей. Пожалуйста, установите необходимые компоненты вручную.")
        return 1
    
    # Проверяем существование файла конфигурации
    initialized = False
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
            config = json.load(f)
        
        initialized = config.get("initialized", False)
    
    if initialized:
        print("\n✅ Telegram Collector уже настроен.")
        print("Вы хотите изменить настройки?")
        
        choice = input("\nИзменить настройки? (y/n): ").strip().lower()
        if choice != "y":
            print("\nНастройки не изменены.")
            return 0
    
    # Получаем учетные данные Telegram API
    credentials = get_telegram_api_credentials()
    
    # Создаем файл .env
    if not create_env_file(credentials):
        print("\n❌ Ошибка при создании файла .env")
        return 1
    
    # Настраиваем автоматизацию
    configure_cron()
    
    # Настраиваем интеграцию с OpenClaw
    configure_openclaw_integration()
    
    # Обновляем статус инициализации
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
            config = json.load(f)
        
        config["initialized"] = True
        
        with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
            json.dump(config, f, indent=2)
    
    print("\n" + "=" * 60)
    print("НАСТРОЙКА ЗАВЕРШЕНА".center(60))
    print("=" * 60)
    
    print("\n✅ Telegram Collector успешно настроен!")
    print("\nТеперь вы можете:")
    print("1. Запустить просмотр доступных групп и каналов:")
    print(f"   python3 {SCRIPTS_DIR}/collector.py list")
    print("2. Добавить группы и каналы для отслеживания:")
    print(f"   python3 {SCRIPTS_DIR}/collector.py add <group_id>")
    print("3. Добавить темы для анализа:")
    print(f"   python3 {SCRIPTS_DIR}/analyzer.py add-topic \"Название темы\" \"ключевое_слово1,ключевое_слово2\"")
    print("4. Запустить сбор данных вручную:")
    print(f"   {SCRIPTS_DIR}/run.sh\n")
    
    return 0

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