#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
密碼雜湊生成工具

使用方法：
1. 直接執行：python generate_password_hash.py
2. 輸入新密碼（至少8字元，包含英文和數字）
3. 將生成的雜湊值複製到 .env 檔案的 LOGIN_PASSWORD 欄位

注意：執行後請立即刪除或清空終端機歷史記錄，避免明文密碼外洩
"""

from werkzeug.security import generate_password_hash
import sys
import getpass

def validate_password_strength(password):
    """
    驗證密碼強度

    要求：
    - 至少 8 個字元
    - 包含英文字母
    - 包含數字
    """
    if len(password) < 8:
        return False, "密碼長度至少需要 8 個字元"

    has_letter = any(c.isalpha() for c in password)
    has_digit = any(c.isdigit() for c in password)

    if not has_letter:
        return False, "密碼必須包含英文字母"

    if not has_digit:
        return False, "密碼必須包含數字"

    return True, None

def main():
    print("=" * 60)
    print("🔐 MOMO 監控系統 - 密碼雜湊生成工具")
    print("=" * 60)
    print()
    print("密碼要求：")
    print("  • 至少 8 個字元")
    print("  • 包含英文字母（大小寫皆可）")
    print("  • 包含數字")
    print("  • 建議使用符號增加強度（如 !@#$%^&*）")
    print()

    try:
        # 使用 getpass 隱藏輸入（不會在終端顯示）
        password = getpass.getpass("請輸入新密碼: ")

        if not password:
            print("\n❌ 密碼不能為空")
            sys.exit(1)

        # 驗證密碼強度
        is_valid, error_message = validate_password_strength(password)
        if not is_valid:
            print(f"\n❌ {error_message}")
            sys.exit(1)

        # 再次確認密碼
        password_confirm = getpass.getpass("請再次輸入密碼: ")

        if password != password_confirm:
            print("\n❌ 兩次輸入的密碼不一致")
            sys.exit(1)

        # 生成雜湊
        password_hash = generate_password_hash(password, method='pbkdf2:sha256', salt_length=16)

        print("\n" + "=" * 60)
        print("✅ 密碼雜湊生成成功！")
        print("=" * 60)
        print()
        print("請將以下內容複製到 .env 檔案中：")
        print()
        print(f"LOGIN_PASSWORD={password_hash}")
        print()
        print("⚠️  安全提醒：")
        print("  1. 請立即將上述雜湊值複製到 .env 檔案")
        print("  2. 重新啟動 app.py 使新密碼生效")
        print("  3. 清空終端機歷史記錄（history -c）")
        print("  4. 不要將 .env 檔案提交到 Git")
        print("  5. 定期更換密碼（建議每 90 天）")
        print()
        print("=" * 60)

    except KeyboardInterrupt:
        print("\n\n⚠️  操作已取消")
        sys.exit(0)
    except Exception as e:
        print(f"\n❌ 發生錯誤: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
