#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
發送不動產公告詳細訊息到 Telegram（每筆公告一則訊息）

使用方式：
  python send_detail_messages.py --date 2026-01-08
  python send_detail_messages.py  # 預設昨天
"""

import sys
sys.stdout.reconfigure(encoding='utf-8')

import os
import sqlite3
import argparse
from datetime import datetime, timedelta
from pathlib import Path
import time

import requests

BASE_PATH = Path(__file__).parent.parent
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')

# 不動產公告類型
TYPE_NAMES = {
    2: '委建合建',
    3: '不動產設備'
}

# 重要欄位（優先顯示）
PRIORITY_FIELDS = [
    '主旨',
    '標的物之名稱及性質',
    '事實發生日',
    '交易單位數量',
    '交易總金額',
    '交易相對人及其與公司之關係',
    '取得或處分之具體目的或用途',
    '本次交易之決定方式',
    '專業估價者事務所或公司及其估價金額',
    # 委建合建專用
    '合建基地坐落地點',
    '興建房屋類別及主要用途',
    '工程造價及付款辦法',
]


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 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 get_announcements_with_details(target_date: str) -> list:
    """取得有詳細資料的不動產公告"""
    if not DB_PATH.exists():
        return []

    conn = sqlite3.connect(DB_PATH)
    cur = conn.cursor()

    # 查詢不動產公告
    cur.execute('''
        SELECT id, stock_code, company_name, announcement_date, type_code, market_type, subject
        FROM announcements
        WHERE announcement_date = ?
          AND type_code IN (2, 3)
          AND detail_fetched = 1
        ORDER BY type_code, market_type, stock_code
    ''', (target_date,))

    announcements = []
    for row in cur.fetchall():
        ann = {
            'id': row[0],
            'stock_code': row[1],
            'company_name': row[2],
            'date': row[3],
            'type_code': row[4],
            'market_type': row[5],
            'subject': row[6],
            'details': []
        }

        # 查詢詳細欄位
        cur.execute('''
            SELECT field_name, field_value
            FROM announcement_details
            WHERE announcement_id = ?
            ORDER BY field_order
        ''', (ann['id'],))

        for field_name, field_value in cur.fetchall():
            ann['details'].append({
                'name': field_name,
                'value': field_value
            })

        announcements.append(ann)

    conn.close()
    return announcements


def build_detail_message(ann: dict) -> str:
    """組裝單筆公告的詳細訊息"""
    type_name = TYPE_NAMES.get(ann['type_code'], '其他')
    roc_date = format_date_roc(ann['date'])

    lines = [
        f"🏢 *{ann['stock_code']} {ann['company_name']}*",
        f"📅 {roc_date} | 【{ann['market_type']}】{type_name}",
        "",
    ]

    # 組織欄位（優先顯示重要欄位）
    details_dict = {d['name']: d['value'] for d in ann['details']}

    # 先顯示主旨
    if '主旨' in details_dict:
        subject = details_dict['主旨']
        lines.append(f"📋 *主旨*")
        lines.append(subject)
        lines.append("")

    # 顯示重要欄位
    shown_fields = {'主旨', '公司代號', '申報序號', '公告序號'}

    for priority_field in PRIORITY_FIELDS:
        for field_name in details_dict:
            if priority_field in field_name and field_name not in shown_fields:
                value = details_dict[field_name]
                if value and value.strip() and value != '不適用':
                    # 截斷過長的值
                    if len(value) > 300:
                        value = value[:300] + "..."
                    lines.append(f"*{field_name}*")
                    lines.append(value)
                    lines.append("")
                shown_fields.add(field_name)

    # 顯示其他欄位（較簡短的）
    lines.append("─────────────────")
    lines.append("📄 *其他欄位*")

    other_fields = []
    for detail in ann['details']:
        name = detail['name']
        value = detail['value']
        if name not in shown_fields and value and value.strip() and value != '不適用':
            # 只顯示較短的欄位
            if len(value) <= 100:
                other_fields.append(f"• {name}: {value}")
            shown_fields.add(name)

    if other_fields:
        lines.extend(other_fields[:10])  # 最多顯示 10 個其他欄位
        if len(other_fields) > 10:
            lines.append(f"（還有 {len(other_fields) - 10} 個欄位未顯示）")
    else:
        lines.append("（無其他重要欄位）")

    return "\n".join(lines)


def main():
    parser = argparse.ArgumentParser(description='發送不動產公告詳細訊息到 Telegram')
    parser.add_argument('--date', help='目標日期 (YYYY-MM-DD)，預設昨天')
    parser.add_argument('--dry-run', action='store_true', help='只顯示訊息，不實際發送')
    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')

    print(f"目標日期: {target_date}")
    print(f"資料庫: {DB_PATH}")

    # 取得公告
    announcements = get_announcements_with_details(target_date)
    print(f"找到 {len(announcements)} 筆不動產公告")

    if not announcements:
        print("沒有需要發送的公告")
        return

    # 發送每筆公告
    success_count = 0
    fail_count = 0

    for i, ann in enumerate(announcements, 1):
        print(f"\n[{i}/{len(announcements)}] {ann['stock_code']} {ann['company_name']}...")

        message = build_detail_message(ann)

        if args.dry_run:
            print("--- Dry Run ---")
            print(message)
            print("--- End ---")
            success_count += 1
        else:
            if send_telegram_message(message):
                print("  已發送")
                success_count += 1
            else:
                print("  發送失敗")
                fail_count += 1

            # 避免 Telegram API rate limit
            if i < len(announcements):
                time.sleep(1)

    print(f"\n完成: 成功 {success_count} 筆, 失敗 {fail_count} 筆")


if __name__ == '__main__':
    main()
