import tkinter as tk
from tkinter import ttk, scrolledtext
import random
from datetime import datetime

# ==================== 核心运势生成逻辑 ====================
def get_daily_horoscope(sign: str, target_date: datetime) -> dict:
    """
    根据星座和日期生成确定性的运势数据（基于随机种子，同一天同一星座结果不变）
    返回包含各项运势分数、幸运信息及描述的字典
    """
    # 使用日期和星座名构造种子，确保每日运势稳定
    seed_str = f"{target_date.strftime('%Y%m%d')}_{sign}"
    rng = random.Random(seed_str)

    # 生成各项分数 (范围: 55-99, 爱情/事业/健康略宽)
    overall_score = rng.randint(55, 99)
    love_score = rng.randint(50, 98)
    career_score = rng.randint(50, 98)
    health_score = rng.randint(50, 98)

    # 幸运信息
    lucky_num = rng.randint(1, 9)
    colors = ['红色', '蓝色', '绿色', '黄色', '紫色', '橙色', '粉色', '青色', '银色', '金色']
    lucky_color = rng.choice(colors)

    # 根据整体分数生成不同风格的描述
    if overall_score >= 90:
        desc = "✨ 运势爆棚！今日星光加持，万事顺利，大胆去实现你的目标吧！"
    elif overall_score >= 80:
        desc = "🌟 运势良好，各方面发展顺利，积极把握机会会有意外收获。"
    elif overall_score >= 70:
        desc = "🌤️ 运势平稳，保持乐观心态，小事也能带来快乐。"
    elif overall_score >= 60:
        desc = "⛅ 运势一般，可能会有小波折，谨慎行事即可安稳度过。"
    else:
        desc = "🌧️ 运势稍弱，建议多休息，避免重大决策，明日会更好。"

    # 爱情运专属小贴士
    if love_score >= 90:
        love_tip = "💖 爱情运极佳！适合约会或表达心意，浪漫值满格。"
    elif love_score >= 70:
        love_tip = "💞 爱情运不错，多些沟通和陪伴会让感情升温。"
    else:
        love_tip = "🌱 爱情运稍弱，注意避免误解，耐心是金钥匙。"

    full_desc = f"{desc}\n{love_tip}"

    return {
        "overall": overall_score,
        "love": love_score,
        "career": career_score,
        "health": health_score,
        "lucky_num": lucky_num,
        "lucky_color": lucky_color,
        "desc": full_desc
    }

def score_to_stars(score: int) -> str:
    """将分数(0-100)转换为★☆格式的星级字符串，每20分一颗★，剩余部分用☆补齐"""
    full = score // 20
    empty = 5 - full
    return "★" * full + "☆" * empty

# ==================== GUI 界面 ====================
class HoroscopeApp:
    def __init__(self, root):
        self.root = root
        self.root.title("✨ 星座运势娱乐小程序 ✨")
        self.root.geometry("520x620")
        self.root.resizable(False, False)
        self.root.configure(bg='#f0f3f5')

        # 设置样式
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('TLabel', background='#f0f3f5', font=('微软雅黑', 10))
        style.configure('TButton', font=('微软雅黑', 10, 'bold'))
        style.configure('TCombobox', font=('微软雅黑', 10))

        # 标题装饰
        title_label = tk.Label(root, text="🔮 每日星座运势 🔮", font=('微软雅黑', 20, 'bold'),
                               bg='#f0f3f5', fg='#4a6fa5')
        title_label.pack(pady=15)

        # 星座选择区域
        select_frame = tk.Frame(root, bg='#f0f3f5')
        select_frame.pack(pady=10)

        tk.Label(select_frame, text="请选择你的星座：", font=('微软雅黑', 12),
                 bg='#f0f3f5', fg='#2c3e50').pack(side=tk.LEFT, padx=5)

        # 十二星座列表
        self.signs = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座',
                      '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']
        self.sign_var = tk.StringVar(value=self.signs[0])
        self.combo = ttk.Combobox(select_frame, textvariable=self.sign_var, values=self.signs,
                                  state='readonly', width=12, font=('微软雅黑', 11))
        self.combo.pack(side=tk.LEFT, padx=10)

        # 查看运势按钮
        self.btn = ttk.Button(root, text="🌟 查看今日运势 🌟", command=self.show_horoscope)
        self.btn.pack(pady=15)

        # 结果显示区域 (带滚动条)
        result_frame = tk.Frame(root, bg='#f0f3f5')
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)

        self.result_text = scrolledtext.ScrolledText(result_frame, wrap=tk.WORD, font=('微软雅黑', 11),
                                                     bg='#ffffff', fg='#1e2a36', relief=tk.GROOVE,
                                                     bd=2, height=18, width=60)
        self.result_text.pack(fill=tk.BOTH, expand=True)

        # 初始提示信息
        self.result_text.insert(tk.END, "✨ 欢迎来到星座运势小程序 ✨\n\n请在上方选择您的星座，然后点击「查看今日运势」按钮，\n即可获取今日的运势详解～\n\n⭐ 每日运势基于日期和星座生成，同一天同一星座结果不变，更具真实感 ⭐")
        self.result_text.config(state=tk.DISABLED)

        # 底部装饰
        footer = tk.Label(root, text="娱乐至上 · 仅供参考 · 开心每一天", font=('微软雅黑', 9),
                          bg='#f0f3f5', fg='#7f8c8d')
        footer.pack(side=tk.BOTTOM, pady=10)

    def show_horoscope(self):
        """获取当前选择的星座，生成运势并显示在文本区域"""
        selected_sign = self.sign_var.get()
        today = datetime.now().date()
        horo_data = get_daily_horoscope(selected_sign, today)

        # 格式化输出结果
        output_lines = []
        output_lines.append(f"📅 日期：{today.strftime('%Y年%m月%d日')}")
        output_lines.append(f"♈ 星座：{selected_sign}")
        output_lines.append("━" * 28)

        # 整体运势
        overall_stars = score_to_stars(horo_data["overall"])
        output_lines.append(f"✨ 整体运势：{horo_data['overall']}分  {overall_stars}")
        # 爱情运势
        love_stars = score_to_stars(horo_data["love"])
        output_lines.append(f"💕 爱情运势：{horo_data['love']}分  {love_stars}")
        # 事业运势
        career_stars = score_to_stars(horo_data["career"])
        output_lines.append(f"📈 事业学业：{horo_data['career']}分  {career_stars}")
        # 健康运势
        health_stars = score_to_stars(horo_data["health"])
        output_lines.append(f"🏃 健康运势：{horo_data['health']}分  {health_stars}")

        output_lines.append("━" * 28)
        output_lines.append(f"🍀 幸运数字：{horo_data['lucky_num']}")
        output_lines.append(f"🎨 幸运颜色：{horo_data['lucky_color']}")
        output_lines.append("━" * 28)
        output_lines.append("📖 今日箴言：")
        output_lines.append(horo_data["desc"])
        output_lines.append("\n" + "🌟 保持好心情，好运常相伴 🌟")

        # 更新文本区域
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, "\n".join(output_lines))
        self.result_text.config(state=tk.DISABLED)

# ==================== 程序入口 ====================
if __name__ == "__main__":
    root = tk.Tk()
    app = HoroscopeApp(root)
    root.mainloop()