"""
Скрипт для экспорта постов из базы данных в txt файл
с переводом, метриками и источником
"""

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')

from src.database.db import SessionLocal
from src.database.models import Post, Source
from src.utils.translator import translate_to_russian, detect_language

def export_posts_to_txt(days=7, output_file='parsed_posts.txt'):
    """Экспортирует посты из базы данных в txt файл"""
    
    session = SessionLocal()
    try:
        # Получаем посты за последние N дней
        cutoff_date = datetime.utcnow() - timedelta(days=days)
        posts = session.query(Post).join(Source).filter(
            Post.created_at >= cutoff_date
        ).order_by(Post.created_at.desc()).all()
        
        print(f"Найдено постов в базе данных: {len(posts)}")
        
        if not posts:
            print("[WARNING] Нет постов в базе данных. Создаю тестовые данные...")
            # Создаем тестовые данные для демонстрации
            posts = create_test_posts()
        
        # Сохраняем в файл
        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(posts)}\n\n")
            
            for i, post in enumerate(posts, 1):
                # Получаем источник
                if hasattr(post, 'platform') and hasattr(post, 'source_username'):
                    # Тестовые посты уже имеют platform и source_username
                    source_username = post.source_username
                    platform = post.platform
                else:
                    # Реальные посты из БД
                    source = session.query(Source).filter(Source.id == post.source_id).first()
                    source_username = source.username if source else 'unknown'
                    platform = source.platform if source else 'unknown'
                
                f.write(f"\n{'='*60}\n")
                f.write(f"ПОСТ #{i}\n")
                f.write(f"{'='*60}\n")
                
                # Платформа и источник
                platform_emoji = {
                    'telegram': '📱',
                    'instagram': '📷',
                    'x': '🐦',
                    'twitter': '🐦'
                }.get(platform.lower(), '📄')
                f.write(f"Платформа: {platform_emoji} {platform.upper()}\n")
                f.write(f"Источник: @{source_username}\n")
                f.write(f"ID: {post.external_id}\n")
                f.write(f"URL: {post.url or 'N/A'}\n\n")
                
                # Оригинальный текст
                original_content = post.content or "Нет текста"
                f.write(f"ОРИГИНАЛЬНЫЙ ТЕКСТ:\n{original_content}\n\n")
                
                # Перевод на русский
                if original_content and original_content != "Нет текста":
                    try:
                        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")
                    except Exception as e:
                        f.write(f"ОШИБКА ПЕРЕВОДА: {e}\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"[OK] Результаты сохранены в {output_file}")
        print(f"[OK] Всего постов: {len(posts)}")
        
    except Exception as e:
        print(f"[ERROR] Ошибка при экспорте: {e}")
        import traceback
        traceback.print_exc()
    finally:
        session.close()


def create_test_posts():
    """Создает тестовые посты для демонстрации формата"""
    from datetime import datetime
    
    # Создаем простой класс для тестовых постов
    class TestPost:
        def __init__(self, source_id, external_id, content, url, views, likes, comments, shares, reactions, created_at, platform, username):
            self.source_id = source_id
            self.external_id = external_id
            self.content = content
            self.url = url
            self.views = views
            self.likes = likes
            self.comments = comments
            self.shares = shares
            self.reactions = reactions
            self.created_at = created_at
            self.platform = platform
            self.source_username = username
    
    # Создаем тестовые объекты (не сохраняем в БД)
    test_posts = []
    
    # Тестовый пост 1 - X.com
    post1 = TestPost(
        source_id=1,
        external_id='test_x_1',
        content='It was only a matter of time… 😉',
        url='https://x.com/Zillow/status/1702796773071475004',
        views=125000,
        likes=3500,
        comments=120,
        shares=450,
        reactions=0,
        created_at=datetime.now() - timedelta(hours=2),
        platform='x',
        username='Zillow'
    )
    test_posts.append(post1)
    
    # Тестовый пост 2 - Instagram
    post2 = TestPost(
        source_id=2,
        external_id='test_ig_1',
        content='Even the landscaping is award-winning. 🏡🏆 Explore the Nissan Heisman House\'s on-site training facility, dorm-style bunkrooms, ever-expanding trophy room, and more on Zillow today.',
        url='https://www.instagram.com/p/ABC123/',
        views=89000,
        likes=2100,
        comments=85,
        shares=320,
        reactions=0,
        created_at=datetime.now() - timedelta(hours=5),
        platform='instagram',
        username='zillow'
    )
    test_posts.append(post2)
    
    # Тестовый пост 3 - X.com
    post3 = TestPost(
        source_id=3,
        external_id='test_x_2',
        content='Our logo looks right at home alongside this team. Beyond proud to announce that we\'re officially a sponsor of the Seattle Seahawks. 💙💚',
        url='https://x.com/Zillow/status/1686776410487111688',
        views=98000,
        likes=2800,
        comments=95,
        shares=380,
        reactions=0,
        created_at=datetime.now() - timedelta(hours=8),
        platform='x',
        username='Zillow'
    )
    test_posts.append(post3)
    
    return test_posts


if __name__ == '__main__':
    print("="*60)
    print("ЭКСПОРТ ПОСТОВ ИЗ БАЗЫ ДАННЫХ")
    print("="*60)
    
    # Экспортируем посты за последние 7 дней
    export_posts_to_txt(days=7, output_file='parsed_posts.txt')
    
    print("\n[OK] Готово!")

