#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
發送每日擷取報告到 Telegram（含不動產公告詳細列表）

使用方式：
  python send_telegram_report.py --date 2026-01-08
  python send_telegram_report.py  # 預設昨天
"""

import sys
sys.stdout.reconfigure(encoding='utf-8')

import os
import json
import sqlite3
import argparse
from datetime import datetime, timedelta
from pathlib import Path

import requests

BASE_PATH = Path(__file__).parent.parent
LOG_PATH = BASE_PATH / 'logs'
DB_PATH = BASE_PATH / 'db' / 'mops_announcements.db'

TELEGRAM_BOT_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')
TELEGRAM_CHAT_ID = os.environ.get('TELEGRAM_CHAT_ID')

# 關注的公告類型
REAL_ESTATE_TYPES = {
    2: '委建合建類',
    3: '不動產設備類'
}

TYPE_FULL_NAMES = {
    2: '將以自地委建、租地委建、合建分屋、合建分成、合建分售方式取得不動產者適用',
    3: '取得或處分不動產、設備或其使用權資產者適用'
}

MARKETS = ['上市', '上櫃', '興櫃', '公開發行']


def send_telegram_message(message: str) -> bool:
    """發送 Telegram 訊息"""
    if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID:
        print("未設定 TELEGRAM_BOT_TOKEN 或 TELEGRAM_CHAT_ID 環境變數")
        print("\n--- 訊息內容 ---")
        print(message)
        return False

    try:
        url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
        payload = {
            'chat_id': TELEGRAM_CHAT_ID,
            'text': message,
            'parse_mode': 'Markdown',
            'disable_web_page_preview': True,
        }
        response = requests.post(url, json=payload, timeout=30)
        response.raise_for_status()
        return True
    except Exception as e:
        print(f"Telegram 發送失敗: {e}")
        return False


def query_real_estate_announcements(target_date: str) -> dict:
    """查詢不動產相關公告"""
    if not DB_PATH.exists():
        return {}

    conn = sqlite3.connect(DB_PATH)
    cur = conn.cursor()

    results = {2: {}, 3: {}}

    for type_code in [2, 3]:
        for market in MARKETS:
            cur.execute('''
                SELECT stock_code, company_name, announcement_date, subject
                FROM announcements
                WHERE announcement_date = ?
                  AND type_code = ?
                  AND market_type = ?
                ORDER BY stock_code
            ''', (target_date, type_code, market))

            rows = cur.fetchall()
            results[type_code][market] = rows

    conn.close()
    return results


def format_date_roc(date_str: str) -> str:
    """轉換為民國年格式"""
    try:
        y = int(date_str[:4]) - 1911
        m = date_str[5:7]
        d = date_str[8:10]
        return f"{y}/{m}/{d}"
    except:
        return date_str


def build_detail_message(target_date: str, report: dict, real_estate: dict) -> str:
    """組裝詳細報告訊息"""

    # 判斷是否有新增
    new_inserts = report.get('newInserts', 0)
    emoji = '📢' if new_inserts > 0 else '✅'

    # 市場統計
    market_stats = []
    for market, count in report.get('byMarket', {}).items():
        if count > 0:
            market_stats.append(f"{market}: {count}")
    market_stats_str = ' | '.join(market_stats)

    # 彙總區塊
    lines = [
        f"{emoji} *取得或處分資產公告*",
        "━━━━━━━━━━━━━━━",
        f"📅 日期: {target_date}",
        f"📊 總公告: {report.get('totalAnnouncements', 0)} 筆",
        f"🆕 新增: {new_inserts} 筆",
        "",
        f"📈 市場分布: {market_stats_str}",
    ]

    # 不動產詳細列表
    for type_code in [2, 3]:
        lines.append("")
        lines.append(f"━━━━━━━━━━━━━━━")
        lines.append(f"🏠 *{REAL_ESTATE_TYPES[type_code]}*")
        lines.append(f"_{TYPE_FULL_NAMES[type_code]}_")
        lines.append("")

        type_data = real_estate.get(type_code, {})
        has_data = False

        for market in MARKETS:
            market_data = type_data.get(market, [])

            if market_data:
                has_data = True
                lines.append(f"【{market}】")
                for row in market_data:
                    stock_code, company_name, date, subject = row
                    roc_date = format_date_roc(date)
                    # 截斷過長的主旨
                    if len(subject) > 40:
                        subject = subject[:40] + "..."
                    lines.append(f"• {stock_code} {company_name}")
                    lines.append(f"  {roc_date} {subject}")
                lines.append("")

        if not has_data:
            lines.append("（今日無此類公告）")
            lines.append("")

    return "\n".join(lines)


def main():
    parser = argparse.ArgumentParser(description='發送每日擷取報告到 Telegram')
    parser.add_argument('--date', help='目標日期 (YYYY-MM-DD)，預設昨天')
    args = parser.parse_args()

    # 決定日期
    if args.date:
        target_date = args.date
    else:
        yesterday = datetime.now() - timedelta(days=1)
        target_date = yesterday.strftime('%Y-%m-%d')

    # 讀取 JSON 報告
    report_path = LOG_PATH / f'daily_report_{target_date}.json'

    if not report_path.exists():
        print(f"找不到報告檔案: {report_path}")
        sys.exit(1)

    with open(report_path, 'r', encoding='utf-8') as f:
        report = json.load(f)

    # 查詢不動產公告詳情
    real_estate = query_real_estate_announcements(target_date)

    # 組裝訊息
    message = build_detail_message(target_date, report, real_estate)

    # 發送
    success = send_telegram_message(message)
    if success:
        print("Telegram 通知已發送")
    else:
        print("Telegram 發送失敗或未設定")


if __name__ == '__main__':
    main()
