"""
Отдельный скрипт для отправки постов в Telegram
Читает посты из файла parsed_posts.txt и отправляет их в Telegram
"""

import asyncio
import html
import os
import sys
from dataclasses import dataclass
from datetime import datetime
from pathlib import Path
from typing import Dict, List, Optional

from dotenv import 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', errors='replace')
        sys.stderr.reconfigure(encoding='utf-8', errors='replace')

load_dotenv()

try:
    from telegram import Bot
    from telegram.error import TelegramError
    TELEGRAM_BOT_AVAILABLE = True
except ImportError:
    Bot = None
    TelegramError = Exception
    TELEGRAM_BOT_AVAILABLE = False
    print("[WARNING] python-telegram-bot not available. Install: pip install python-telegram-bot")

from src.utils.translator import translate_to_russian, detect_language

TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')

# Лучше не хардкодить Windows путь. Берем из env или рядом со скриптом.
DEFAULT_INPUT = Path(__file__).resolve().parent / "parsed_posts.txt"
INPUT_FILE = Path(os.getenv("PARSED_POSTS_FILE", str(DEFAULT_INPUT))).resolve()


@dataclass
class ParsedPostForSend:
    platform: str
    source_username: str
    url: str
    content: str
    created_at: Optional[str] = None
    views: int = 0
    likes: int = 0
    comments: int = 0
    shares: int = 0
    reactions: int = 0


def _to_int(s: str) -> int:
    s = (s or "").strip().replace(",", "").replace(" ", "")
    return int(s) if s.isdigit() else 0


def parse_posts_from_file(file_path: Path) -> List[ParsedPostForSend]:
    posts: List[ParsedPostForSend] = []

    if not file_path.exists():
        print(f"❌ Файл не найден: {file_path}")
        return posts

    raw = file_path.read_text(encoding='utf-8', errors='replace')

    # Разбивка по "ПОСТ #"
    sections = raw.split("ПОСТ #")
    if len(sections) <= 1:
        print("⚠️ В файле не найдено блоков 'ПОСТ #'")
        return posts

    for section in sections[1:]:
        lines = [ln.rstrip("\n") for ln in section.splitlines()]
        if not lines:
            continue

        data: Dict[str, object] = {}
        i = 0

        # сбор текста до следующего заголовка
        def collect_multiline_text(start_idx: int) -> (str, int):
            buf: List[str] = []
            j = start_idx
            stop_prefixes = (
                "👁 Просмотры:",
                "❤️ Лайки:",
                "💬 Комментарии:",
                "🔄 Репосты/Retweets:",
                "⭐ Реакции:",
                "🔗 Ссылка:",
                "📅 Дата публикации:",
                "Платформа:",
                "Источник:",
            )
            while j < len(lines):
                ln = lines[j].strip()
                if not ln:
                    # пустую строку сохраняем как разделитель, но не бесконечно
                    buf.append("")
                    j += 1
                    continue
                if any(ln.startswith(p) for p in stop_prefixes):
                    break
                buf.append(ln)
                j += 1
            text = "\n".join([x for x in buf]).strip()
            return text, j

        while i < len(lines):
            line = lines[i].strip()

            if not line:
                i += 1
                continue

            if line.startswith('Платформа:'):
                # пример: "Платформа: 📷 Instagram"
                platform_part = line.split(':', 1)[1].strip()
                parts = platform_part.split()
                if len(parts) >= 2:
                    platform = parts[-1]
                else:
                    platform = platform_part
                data['platform'] = platform.lower()

            elif line.startswith('Источник:'):
                # пример: "Источник: @some"
                if '@' in line:
                    data['source_username'] = line.split('@', 1)[1].strip()
                else:
                    data['source_username'] = line.split(':', 1)[1].strip()

            elif line.startswith('🔗 Ссылка:'):
                data['url'] = line.split(':', 1)[1].strip()

            elif line.startswith('ТЕКСТ ПОСТА (ОРИГИНАЛ):'):
                # текст может быть многострочным
                text, new_i = collect_multiline_text(i + 1)
                data['content'] = text
                i = new_i
                continue

            elif line.startswith('👁 Просмотры:'):
                data['views'] = _to_int(line.split(':', 1)[1])

            elif line.startswith('❤️ Лайки:'):
                data['likes'] = _to_int(line.split(':', 1)[1])

            elif line.startswith('💬 Комментарии:'):
                data['comments'] = _to_int(line.split(':', 1)[1])

            elif line.startswith('🔄 Репосты/Retweets:'):
                data['shares'] = _to_int(line.split(':', 1)[1])

            elif line.startswith('⭐ Реакции:'):
                data['reactions'] = _to_int(line.split(':', 1)[1])

            elif line.startswith('📅 Дата публикации:'):
                data['created_at'] = line.split(':', 1)[1].strip()

            i += 1

        content = str(data.get('content') or "").strip()
        url = str(data.get('url') or "").strip()
        if content and url:
            post = ParsedPostForSend(
                platform=str(data.get('platform') or "unknown"),
                source_username=str(data.get('source_username') or "unknown"),
                url=url,
                content=content,
                created_at=str(data.get('created_at') or "") or None,
                views=int(data.get('views') or 0),
                likes=int(data.get('likes') or 0),
                comments=int(data.get('comments') or 0),
                shares=int(data.get('shares') or 0),
                reactions=int(data.get('reactions') or 0),
            )
            posts.append(post)

    return posts


async def send_post_to_telegram(bot: Bot, post: ParsedPostForSend, index: int) -> bool:
    try:
        content = post.content or "Нет текста"
        original_lang = detect_language(content) if content != "Нет текста" else None
        content_ru = content

        if original_lang and original_lang != 'ru':
            content_ru = translate_to_russian(content, original_lang)

        if len(content_ru) > 3000:
            content_ru = content_ru[:3000] + "..."

        # Telegram HTML: экранируем, иначе любой < > & ломает сообщение
        safe_text = html.escape(content_ru)

        platform_emoji = {
            'telegram': '📱',
            'instagram': '📷',
            'x': '🐦'
        }.get((post.platform or '').lower(), '📄')

        platform = (post.platform or 'UNKNOWN').upper()
        message = f"{platform_emoji} <b>{platform}</b> | <b>@{html.escape(post.source_username or 'unknown')}</b>\n\n"
        message += f"{safe_text}\n"

        if original_lang and original_lang != 'ru' and content_ru != content:
            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>🌐 Переведено с {html.escape(str(lang_name))}</i>\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:
            metrics.append(f"🔄 {post.shares:,}")
        if post.reactions > 0:
            metrics.append(f"⭐ {post.reactions:,}")

        if metrics:
            message += "\n" + " ".join(metrics) + "\n\n"

        if post.url:
            message += f"🔗 <a href=\"{html.escape(post.url)}\">Открыть пост</a>\n"

        if post.created_at:
            message += f"\n📅 {html.escape(post.created_at)}"

        # Важно: превью по ссылке для Instagram часто НЕ гарантировано.
        # Для стабильных картинок нужно отправлять media напрямую (send_photo/send_media_group).
        await bot.send_message(
            chat_id=TELEGRAM_CHAT_ID,
            text=message,
            parse_mode='HTML',
            disable_web_page_preview=False
        )

        return True

    except TelegramError as e:
        print(f"  ⚠ Ошибка отправки в Telegram: {e}")
        return False
    except Exception as e:
        print(f"  ⚠ Неожиданная ошибка: {e}")
        import traceback
        traceback.print_exc()
        return False


async def main():
    print("=" * 60)
    print("ОТПРАВКА ПОСТОВ В TELEGRAM")
    print("=" * 60)
    print(f"Время запуска: {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}")
    print(f"Файл с постами: {INPUT_FILE}")
    print()

    if not TELEGRAM_BOT_AVAILABLE:
        print("❌ python-telegram-bot недоступен")
        return

    if not TELEGRAM_BOT_TOKEN:
        print("❌ TELEGRAM_BOT_TOKEN не установлен в .env")
        return

    if not TELEGRAM_CHAT_ID:
        print("❌ TELEGRAM_CHAT_ID не установлен в .env")
        return

    print("📖 Читаю посты из файла...")
    posts = parse_posts_from_file(INPUT_FILE)

    if not posts:
        print("⚠️ Не найдено постов в файле")
        return

    print(f"✓ Найдено постов: {len(posts)}")

    try:
        bot = Bot(token=TELEGRAM_BOT_TOKEN)
        print(f"✓ Бот инициализирован, отправка в чат: {TELEGRAM_CHAT_ID}")
    except Exception as e:
        print(f"❌ Ошибка инициализации бота: {e}")
        return

    print("\n" + "=" * 60)
    print("ОТПРАВКА ПОСТОВ")
    print("=" * 60)

    sent_count = 0
    max_posts = min(10, len(posts))

    for i, post in enumerate(posts[:max_posts], 1):
        success = await send_post_to_telegram(bot, post, i)
        if success:
            sent_count += 1
            print(f"✓ Отправлен пост {i}/{max_posts}: {post.platform.upper()}/@{post.source_username}")
        else:
            print(f"⚠ Не удалось отправить пост {i}/{max_posts}")

        await asyncio.sleep(2)

    print("\n" + "=" * 60)
    print(f"✓ Отправлено постов: {sent_count}/{max_posts}")
    print("=" * 60)


if __name__ == '__main__':
    asyncio.run(main())
