#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
郵件問題診斷工具
檢查 SMTP 設定並提供修正建議
"""

import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

import config
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def diagnose_smtp_config():
    """診斷 SMTP 設定"""

    print("=" * 80)
    print("📧 郵件設定診斷工具")
    print("=" * 80)

    print("\n1️⃣ 當前 SMTP 設定：")
    print("-" * 80)
    print(f"   SMTP 伺服器: {config.EMAIL_HOST}")
    print(f"   SMTP 埠號: {config.EMAIL_PORT}")
    print(f"   寄件者: {config.EMAIL_SENDER}")
    print(f"   登入帳號: {config.EMAIL_HOST_USER}")
    print(f"   密碼: {'*' * len(config.EMAIL_HOST_PASSWORD)}")

    # 判斷設定是否合理
    print("\n2️⃣ 設定分析：")
    print("-" * 80)

    is_pchome_email = '@pchome.tw' in config.EMAIL_HOST_USER
    is_gmail_smtp = 'gmail.com' in config.EMAIL_HOST

    if is_pchome_email and is_gmail_smtp:
        print("   ❌ 錯誤：使用 PChome 郵件地址但設定 Gmail SMTP 伺服器")
        print("   ⚠️  這會導致認證失敗，郵件無法發送")
        print("\n   💡 解決方案：")
        print("   請向 PChome IT 部門詢問以下資訊：")
        print("   - SMTP 伺服器地址（例如：smtp.pchome.tw 或 mail.pchome.tw）")
        print("   - SMTP 埠號（通常是 587 或 465）")
        print("   - 是否需要使用 TLS/SSL")
        print("   - 認證方式（帳號密碼或其他）")
        return False

    elif is_pchome_email:
        print("   ⚠️  使用 PChome 郵件，但 SMTP 伺服器不是 Gmail")
        print(f"   當前 SMTP: {config.EMAIL_HOST}")
        print("   請確認此伺服器是否正確")

    elif is_gmail_smtp:
        print("   ℹ️  使用 Gmail SMTP 伺服器")
        if '@gmail.com' not in config.EMAIL_HOST_USER:
            print("   ⚠️  但寄件者不是 Gmail 地址，可能會有問題")

    print("\n3️⃣ 測試 SMTP 連線：")
    print("-" * 80)

    try:
        print("   正在連接 SMTP 伺服器...")
        server = smtplib.SMTP(config.EMAIL_HOST, config.EMAIL_PORT, timeout=10)
        print("   ✅ 成功連接到 SMTP 伺服器")

        print("   正在啟動 TLS 加密...")
        server.starttls()
        print("   ✅ TLS 加密啟動成功")

        print("   正在進行身份認證...")
        server.login(config.EMAIL_HOST_USER, config.EMAIL_HOST_PASSWORD)
        print("   ✅ 身份認證成功")

        server.quit()
        print("\n   🎉 SMTP 設定完全正確！")
        return True

    except smtplib.SMTPAuthenticationError as e:
        print(f"   ❌ 認證失敗: {e}")
        print("\n   可能原因：")
        print("   1. 帳號或密碼錯誤")
        print("   2. 使用 PChome 郵件但 SMTP 伺服器設定為 Gmail")
        print("   3. 需要啟用「允許低安全性應用程式」（Gmail）")
        print("   4. 需要使用應用程式專用密碼（Gmail）")
        return False

    except smtplib.SMTPConnectError as e:
        print(f"   ❌ 連線失敗: {e}")
        print("\n   可能原因：")
        print("   1. SMTP 伺服器地址錯誤")
        print("   2. 網路連線問題")
        print("   3. 防火牆封鎖")
        return False

    except Exception as e:
        print(f"   ❌ 未知錯誤: {e}")
        return False

def test_send_email():
    """測試發送郵件"""

    print("\n4️⃣ 測試發送郵件：")
    print("-" * 80)

    try:
        # 建立測試郵件
        msg = MIMEMultipart('alternative')
        msg['From'] = config.EMAIL_SENDER
        msg['To'] = config.EMAIL_SENDER  # 發給自己
        msg['Subject'] = '【測試】MOMO 系統郵件測試'

        # 純文字版本
        text_body = """
這是一封測試郵件。

如果您收到這封郵件，表示 SMTP 設定正確。

此致
MOMO 監控系統
"""

        # HTML 版本
        html_body = """
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body style="font-family: 'Microsoft JhengHei', Arial, sans-serif; padding: 20px;">
    <h2 style="color: #2c3e50;">✅ 測試郵件</h2>
    <p>這是一封測試郵件。</p>
    <p>如果您收到這封郵件，表示 SMTP 設定正確。</p>
    <hr>
    <p style="color: #7f8c8d; font-size: 12px;">此致<br>MOMO 監控系統</p>
</body>
</html>
"""

        text_part = MIMEText(text_body, 'plain', 'utf-8')
        html_part = MIMEText(html_body, 'html', 'utf-8')
        msg.attach(text_part)
        msg.attach(html_part)

        # 發送
        print("   正在發送測試郵件...")
        with smtplib.SMTP(config.EMAIL_HOST, config.EMAIL_PORT) as server:
            server.starttls()
            server.login(config.EMAIL_HOST_USER, config.EMAIL_HOST_PASSWORD)
            server.sendmail(config.EMAIL_SENDER, [config.EMAIL_SENDER], msg.as_string())

        print("   ✅ 測試郵件發送成功！")
        print(f"\n   📬 請檢查信箱: {config.EMAIL_SENDER}")
        print("   ⚠️  如果沒收到，請檢查垃圾郵件資料夾")
        return True

    except Exception as e:
        print(f"   ❌ 發送失敗: {e}")
        return False

def main():
    """主程式"""

    # 診斷 SMTP 設定
    smtp_ok = diagnose_smtp_config()

    if smtp_ok:
        # 如果 SMTP 設定正確，測試發送郵件
        test_send_email()
    else:
        print("\n" + "=" * 80)
        print("❌ SMTP 設定有問題，無法發送郵件")
        print("=" * 80)
        print("\n建議處理步驟：")
        print("1. 確認您要使用的郵件系統（PChome 或 Gmail）")
        print("2. 取得正確的 SMTP 伺服器設定")
        print("3. 更新 .env 檔案中的設定")
        print("4. 重新執行此診斷工具")

    print("\n" + "=" * 80)
    print("診斷完成")
    print("=" * 80)

if __name__ == '__main__':
    main()
