"""
Скрипт для парсинга постов из Telegram, Instagram и отправки в Telegram бота
"""

import asyncio
import sys
import os
from datetime import datetime, timedelta

# Добавляем путь к проекту
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from dotenv import load_dotenv
load_dotenv()

# Fix encoding for Windows
if sys.platform == 'win32':
    os.environ['PYTHONIOENCODING'] = 'utf-8'
    if hasattr(sys.stdout, 'reconfigure'):
        sys.stdout.reconfigure(encoding='utf-8')
        sys.stderr.reconfigure(encoding='utf-8')

# Опциональный импорт Telegram парсера
try:
    from src.parsers.telegram_parser import TelegramParser
    TELEGRAM_PARSER_AVAILABLE = True
except ImportError:
    TelegramParser = None
    TELEGRAM_PARSER_AVAILABLE = False
    print("[WARNING] Telegram parser not available (telethon not installed)")

from src.parsers.instagram_parser import InstagramParser
from src.parsers.x_parser import XParser
from src.utils.translator import translate_to_russian, detect_language

# Опциональный импорт Telegram бота
try:
    from telegram import Bot
    from telegram.error import TelegramError
    TELEGRAM_BOT_AVAILABLE = True
except ImportError:
    Bot = None
    TelegramError = None
    TELEGRAM_BOT_AVAILABLE = False
    print("[WARNING] Telegram bot library not available (will skip sending to bot)")

# Конфигурация
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')  # ID чата для отправки постов

# Тестовые источники
# Telegram каналы (требуют авторизацию через Telethon - TELEGRAM_API_ID и TELEGRAM_API_HASH)
# Оставьте пустым, если нет credentials
TELEGRAM_SOURCES = [
    # Пример: {'username': 'channelname', 'subscribers': 100000},
]

INSTAGRAM_SOURCES = [
    {'username': 'zillow', 'subscribers': 1500000},
    {'username': 'realtor', 'subscribers': 1200000},
]

X_SOURCES = [
    {'username': 'Zillow', 'subscribers': 2000000},
    {'username': 'realtordotcom', 'subscribers': 1500000},
]


async def parse_telegram_source(username: str, subscribers: int):
    """Парсит посты из Telegram канала"""
    print(f"\n{'='*60}")
    print(f"Парсинг Telegram: @{username}")
    print(f"{'='*60}")
    
    if not TELEGRAM_PARSER_AVAILABLE:
        print(f"[WARNING] Telegram parser не доступен (telethon не установлен)")
        print(f"[INFO] Установите: pip install telethon")
        return []
    
    try:
        parser = TelegramParser(username, subscribers)
        
        # Проверяем, есть ли credentials
        if not parser.client:
            print(f"[WARNING] Telegram API credentials не настроены. Пропускаем @{username}")
            print(f"[INFO] Для парсинга Telegram каналов нужны TELEGRAM_API_ID и TELEGRAM_API_HASH в .env")
            return []
        
        posts = await parser.parse_posts(days=1)
        
        print(f"[OK] Получено постов: {len(posts)}")
        return posts
        
    except Exception as e:
        print(f"[ERROR] Ошибка парсинга Telegram @{username}: {e}")
        return []


async def parse_instagram_source(username: str, subscribers: int):
    """Парсит посты из Instagram"""
    print(f"\n{'='*60}")
    print(f"Парсинг Instagram: @{username}")
    print(f"{'='*60}")
    
    try:
        parser = InstagramParser(username, subscribers)
        posts = await parser.parse_posts(days=1)
        
        print(f"[OK] Получено постов: {len(posts)}")
        return posts
        
    except Exception as e:
        print(f"[ERROR] Ошибка парсинга Instagram @{username}: {e}")
        return []


async def parse_x_source(username: str, subscribers: int):
    """Парсит посты из X.com (через RSS если нужно)"""
    print(f"\n{'='*60}")
    print(f"Парсинг X.com: @{username}")
    print(f"{'='*60}")
    
    try:
        parser = XParser(username, subscribers)
        posts = await parser.parse_posts(days=1)
        
        print(f"[OK] Получено постов: {len(posts)}")
        return posts
        
    except Exception as e:
        print(f"[ERROR] Ошибка парсинга X.com @{username}: {e}")
        return []


def format_post_for_telegram(post, platform: str, source_username: str = None, original_lang: str = None):
    """Форматирует пост для отправки в Telegram"""
    # Определяем язык оригинала
    if not original_lang and post.content:
        original_lang = detect_language(post.content)
    
    # Переводим на русский если нужно
    content = post.content or "Нет текста"
    content_ru = content
    is_translated = False
    if original_lang and original_lang != 'ru':
        content_ru = translate_to_russian(content, original_lang)
        if content_ru != content:
            is_translated = True
    
    # Обрезаем длинный текст
    if len(content_ru) > 3000:
        content_ru = content_ru[:3000] + "..."
    
    # Формируем сообщение
    platform_emoji = {
        'telegram': '📱',
        'instagram': '📷',
        'x': '🐦'
    }.get(platform, '📄')
    
    message = f"{platform_emoji} <b>{platform.upper()}</b>"
    
    # Источник
    if source_username:
        message += f" | <b>@{source_username}</b>"
    message += "\n\n"
    
    # Текст поста
    message += f"{content_ru}\n"
    
    # Указываем, что текст переведен
    if is_translated and original_lang:
        lang_names = {
            'en': 'английский',
            'es': 'испанский',
            'fr': 'французский',
            'de': 'немецкий',
            'it': 'итальянский',
            'pt': 'португальский',
            'ja': 'японский',
            'ko': 'корейский',
            'zh': 'китайский',
            'ar': 'арабский'
        }
        lang_name = lang_names.get(original_lang, original_lang)
        message += f"\n<i>🌐 Переведено с {lang_name}</i>\n"
    
    message += "\n"
    
    # Метрики популярности
    metrics = []
    if post.views > 0:
        metrics.append(f"👁 {post.views:,}")
    if post.likes > 0:
        metrics.append(f"❤️ {post.likes:,}")
    if post.comments > 0:
        metrics.append(f"💬 {post.comments:,}")
    if post.shares > 0 or (hasattr(post, 'retweets') and post.retweets > 0):
        shares_count = post.shares if post.shares > 0 else (post.retweets if hasattr(post, 'retweets') else 0)
        metrics.append(f"🔄 {shares_count:,}")
    if hasattr(post, 'reactions') and post.reactions > 0:
        metrics.append(f"⭐ {post.reactions:,}")
    
    if metrics:
        message += " ".join(metrics) + "\n\n"
    
    # Ссылка
    if post.url:
        message += f"🔗 <a href=\"{post.url}\">Открыть пост</a>\n"
    
    # Дата
    if post.created_at:
        date_str = post.created_at.strftime("%d.%m.%Y %H:%M")
        message += f"\n📅 {date_str}"
    
    return message


async def send_post_to_telegram(bot: Bot, chat_id: str, message: str):
    """Отправляет пост в Telegram"""
    try:
        await bot.send_message(
            chat_id=chat_id,
            text=message,
            parse_mode='HTML',
            disable_web_page_preview=False
        )
        return True
    except TelegramError as e:
        print(f"[ERROR] Ошибка отправки в Telegram: {e}")
        return False


async def main():
    """Главная функция"""
    print("="*60)
    print("ПАРСИНГ И ОТПРАВКА ПОСТОВ В TELEGRAM БОТА")
    print("="*60)
    print(f"Время запуска: {datetime.now().isoformat()}\n")
    
    bot = None
    if TELEGRAM_BOT_AVAILABLE:
        if not TELEGRAM_BOT_TOKEN:
            print("[WARNING] TELEGRAM_BOT_TOKEN не установлен в .env")
        elif not TELEGRAM_CHAT_ID:
            print("[WARNING] TELEGRAM_CHAT_ID не установлен. Посты будут только распарсены, но не отправлены.")
            print("Установите TELEGRAM_CHAT_ID в .env для отправки постов.")
        else:
            try:
                bot = Bot(token=TELEGRAM_BOT_TOKEN)
                print(f"[OK] Бот инициализирован, отправка в чат: {TELEGRAM_CHAT_ID}")
            except Exception as e:
                print(f"[WARNING] Не удалось инициализировать бота: {e}")
                bot = None
    else:
        print("[INFO] Telegram bot библиотека недоступна, посты будут только сохранены в файл")
    
    all_posts = []
    
    # Парсим Telegram каналы
    print(f"\n{'='*60}")
    print("ПАРСИНГ TELEGRAM КАНАЛОВ")
    print(f"{'='*60}")
    for source in TELEGRAM_SOURCES:
        posts = await parse_telegram_source(source['username'], source['subscribers'])
        for post in posts:
            post.platform = 'telegram'
        all_posts.extend(posts)
        await asyncio.sleep(2)
    
    # Парсим Instagram
    print(f"\n{'='*60}")
    print("ПАРСИНГ INSTAGRAM")
    print(f"{'='*60}")
    for source in INSTAGRAM_SOURCES:
        posts = await parse_instagram_source(source['username'], source['subscribers'])
        for post in posts:
            if not hasattr(post, 'platform'):
                post.platform = 'instagram'
            if not hasattr(post, 'source_username'):
                post.source_username = source['username']
        all_posts.extend(posts)
        await asyncio.sleep(3)  # Увеличиваем задержку для Instagram
    
    # Парсим X.com
    print(f"\n{'='*60}")
    print("ПАРСИНГ X.COM")
    print(f"{'='*60}")
    for source in X_SOURCES:
        posts = await parse_x_source(source['username'], source['subscribers'])
        for post in posts:
            if not hasattr(post, 'platform'):
                post.platform = 'x'
            if not hasattr(post, 'source_username'):
                post.source_username = source['username']
        all_posts.extend(posts)
        await asyncio.sleep(2)
    
    # Сортируем по дате (новые первыми)
    all_posts.sort(key=lambda p: p.created_at if p.created_at else datetime.min, reverse=True)
    
    print(f"\n{'='*60}")
    print(f"ВСЕГО ПОЛУЧЕНО ПОСТОВ: {len(all_posts)}")
    print(f"{'='*60}")
    
    # Отправляем посты в Telegram
    if bot and TELEGRAM_CHAT_ID and all_posts:
        print(f"\n{'='*60}")
        print("ОТПРАВКА ПОСТОВ В TELEGRAM")
        print(f"{'='*60}")
        
        sent_count = 0
        for i, post in enumerate(all_posts[:20], 1):  # Отправляем первые 20
            try:
                source_username = getattr(post, 'source_username', None)
                message = format_post_for_telegram(post, post.platform, source_username)
                success = await send_post_to_telegram(bot, TELEGRAM_CHAT_ID, message)
                
                if success:
                    sent_count += 1
                    print(f"[OK] Отправлен пост {i}/{min(20, len(all_posts))}: {post.platform}/@{source_username}")
                else:
                    print(f"[ERROR] Не удалось отправить пост {i}")
                
                # Задержка между отправками
                await asyncio.sleep(1)
                
            except Exception as e:
                print(f"[ERROR] Ошибка при отправке поста {i}: {e}")
        
        print(f"\n[OK] Отправлено постов: {sent_count}/{min(20, len(all_posts))}")
    
    # Сохраняем результаты в файл с переводом и метриками
    output_file = 'parsed_posts.txt'
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write("="*60 + "\n")
        f.write("ПАРСЕННЫЕ ПОСТЫ С ПЕРЕВОДОМ И МЕТРИКАМИ\n")
        f.write("="*60 + "\n")
        f.write(f"Время: {datetime.now().isoformat()}\n")
        f.write(f"Всего постов: {len(all_posts)}\n\n")
        
        for i, post in enumerate(all_posts, 1):
            f.write(f"\n{'='*60}\n")
            f.write(f"ПОСТ #{i}\n")
            f.write(f"{'='*60}\n")
            
            # Платформа и источник
            platform_emoji = {
                'telegram': '📱',
                'instagram': '📷',
                'x': '🐦'
            }.get(post.platform, '📄')
            source_username = getattr(post, 'source_username', 'unknown')
            f.write(f"Платформа: {platform_emoji} {post.platform.upper()}\n")
            f.write(f"Источник: @{source_username}\n")
            f.write(f"ID: {post.external_id}\n")
            f.write(f"URL: {post.url}\n\n")
            
            # Оригинальный текст
            original_content = post.content or "Нет текста"
            f.write(f"ОРИГИНАЛЬНЫЙ ТЕКСТ:\n{original_content}\n\n")
            
            # Перевод на русский
            if original_content and original_content != "Нет текста":
                lang = detect_language(original_content)
                if lang and lang != 'ru':
                    translated = translate_to_russian(original_content, lang)
                    f.write(f"ЯЗЫК ОРИГИНАЛА: {lang}\n")
                    f.write(f"ПЕРЕВОД НА РУССКИЙ:\n{translated}\n\n")
                else:
                    f.write(f"ЯЗЫК: {lang or 'не определен'}\n")
                    f.write(f"ТЕКСТ УЖЕ НА РУССКОМ ИЛИ ПЕРЕВОД НЕДОСТУПЕН\n\n")
            
            # Метрики популярности
            f.write(f"МЕТРИКИ ПОПУЛЯРНОСТИ:\n")
            f.write(f"  👁 Просмотры: {post.views:,}\n")
            f.write(f"  ❤️ Лайки: {post.likes:,}\n")
            f.write(f"  💬 Комментарии: {post.comments:,}\n")
            shares_count = post.shares if post.shares > 0 else (getattr(post, 'retweets', 0) if hasattr(post, 'retweets') else 0)
            f.write(f"  🔄 Репосты/Retweets: {shares_count:,}\n")
            reactions_count = getattr(post, 'reactions', 0) if hasattr(post, 'reactions') else 0
            f.write(f"  ⭐ Реакции: {reactions_count:,}\n")
            
            # Общий скор популярности
            total_engagement = post.likes + post.comments + shares_count + reactions_count
            f.write(f"\n  📊 Общая вовлеченность: {total_engagement:,}\n")
            
            # Дата
            if post.created_at:
                date_str = post.created_at.strftime("%d.%m.%Y %H:%M")
                f.write(f"\n📅 Дата: {date_str}\n")
            else:
                f.write(f"\n📅 Дата: N/A\n")
        
        f.write("\n" + "="*60 + "\n")
        f.write("КОНЕЦ ОТЧЕТА\n")
        f.write("="*60 + "\n")
    
    print(f"\n[OK] Результаты сохранены в {output_file}")
    print(f"[OK] Всего постов: {len(all_posts)}")


if __name__ == '__main__':
    asyncio.run(main())

