"""
Telegram Bot 推送模块

功能:
- 发送信号通知
- 发送日报
- 发送错误告警
- 接收命令 (/status, /stop, /resume)

配置:
在 config/secrets.yaml 或环境变量中设置:
  TELEGRAM_BOT_TOKEN: Bot Token (从@BotFather获取)
  TELEGRAM_CHAT_ID: 接收消息的Chat ID
"""

import os
import logging
import asyncio
from typing import Optional
from datetime import datetime, timezone

logger = logging.getLogger(__name__)


class TelegramNotifier:
    """
    Telegram消息推送器

    用法:
        notifier = TelegramNotifier(token, chat_id)
        await notifier.send("Hello!")
        # 或同步:
        notifier.send_sync("Hello!")
    """

    def __init__(
        self,
        token: Optional[str] = None,
        chat_id: Optional[str] = None,
    ):
        self.token = token or os.environ.get('TELEGRAM_BOT_TOKEN', '')
        self.chat_id = chat_id or os.environ.get('TELEGRAM_CHAT_ID', '')
        self._enabled = bool(self.token and self.chat_id)

        if not self._enabled:
            logger.warning(
                "Telegram未配置 (设置 TELEGRAM_BOT_TOKEN 和 TELEGRAM_CHAT_ID 环境变量)"
            )

    @property
    def enabled(self) -> bool:
        return self._enabled

    async def send(self, text: str, parse_mode: str = None) -> bool:
        """
        异步发送消息

        Args:
            text: 消息文本
            parse_mode: 'HTML' or 'Markdown' or None
        Returns:
            是否发送成功
        """
        if not self._enabled:
            logger.info(f"[Telegram未配置] {text[:100]}...")
            return False

        try:
            import aiohttp
            url = f"https://api.telegram.org/bot{self.token}/sendMessage"
            payload = {
                "chat_id": self.chat_id,
                "text": text,
            }
            if parse_mode:
                payload["parse_mode"] = parse_mode

            async with aiohttp.ClientSession() as session:
                async with session.post(url, json=payload, timeout=aiohttp.ClientTimeout(total=30)) as resp:
                    if resp.status == 200:
                        logger.info(f"Telegram sent: {text[:50]}...")
                        return True
                    else:
                        body = await resp.text()
                        logger.error(f"Telegram error {resp.status}: {body}")
                        return False
        except ImportError:
            # Fallback to requests if aiohttp not installed
            return self._send_requests(text, parse_mode)
        except Exception as e:
            logger.error(f"Telegram send failed: {e}")
            return False

    def _send_requests(self, text: str, parse_mode: str = None) -> bool:
        """使用requests库发送（同步后备）"""
        try:
            import requests
            url = f"https://api.telegram.org/bot{self.token}/sendMessage"
            payload = {
                "chat_id": self.chat_id,
                "text": text,
            }
            if parse_mode:
                payload["parse_mode"] = parse_mode

            resp = requests.post(url, json=payload, timeout=30)
            if resp.status_code == 200:
                logger.info(f"Telegram sent: {text[:50]}...")
                return True
            else:
                logger.error(f"Telegram error {resp.status_code}: {resp.text}")
                return False
        except Exception as e:
            logger.error(f"Telegram send failed: {e}")
            return False

    def send_sync(self, text: str, parse_mode: str = None) -> bool:
        """
        同步发送消息（适用于非async上下文）
        """
        if not self._enabled:
            logger.info(f"[Telegram未配置] {text[:100]}...")
            return False

        return self._send_requests(text, parse_mode)

    async def send_signal(self, signal_dict: dict) -> bool:
        """发送交易信号"""
        from .templates import format_signal
        text = format_signal(signal_dict)
        return await self.send(text)

    def send_signal_sync(self, signal_dict: dict) -> bool:
        """同步发送交易信号"""
        from .templates import format_signal
        text = format_signal(signal_dict)
        return self.send_sync(text)

    async def send_daily_report(self, stats: dict) -> bool:
        """发送每日报告"""
        from .templates import format_daily_report
        text = format_daily_report(stats)
        return await self.send(text)

    async def send_error(self, error_msg: str, component: str = '') -> bool:
        """发送错误告警"""
        from .templates import format_error_alert
        text = format_error_alert(error_msg, component)
        text = text.replace('{now}', datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M UTC'))
        return await self.send(text)

    async def send_heartbeat(self) -> bool:
        """发送心跳"""
        from .templates import format_heartbeat
        return await self.send(format_heartbeat())
