import tkinter as tk
from datetime import date
import random

# ===== 星座数据 =====
ZODIAC_DATA = [
    ("摩羯座", "12-22", "01-19", "务实稳重", "棕色", 4),
    ("水瓶座", "01-20", "02-18", "独立创新", "蓝色", 7),
    ("双鱼座", "02-19", "03-20", "浪漫敏感", "海绿色", 2),
    ("白羊座", "03-21", "04-19", "热情冲动", "红色", 9),
    ("金牛座", "04-20", "05-20", "踏实可靠", "绿色", 6),
    ("双子座", "05-21", "06-21", "机智善变", "黄色", 5),
    ("巨蟹座", "06-22", "07-22", "温柔顾家", "银色", 2),
    ("狮子座", "07-23", "08-22", "自信霸气", "金色", 1),
    ("处女座", "08-23", "09-22", "完美主义", "灰色", 5),
    ("天秤座", "09-23", "10-23", "优雅公正", "粉色", 6),
    ("天蝎座", "10-24", "11-22", "神秘深沉", "深红色", 8),
    ("射手座", "11-23", "12-21", "乐观自由", "紫色", 3),
]

# ===== 生肖数据 =====
CHINESE_ZODIAC = [
    ("鼠", "聪明灵活", "水"),
    ("牛", "勤劳踏实", "土"),
    ("虎", "勇猛果敢", "木"),
    ("兔", "温柔善良", "木"),
    ("龙", "尊贵霸气", "土"),
    ("蛇", "神秘智慧", "火"),
    ("马", "奔放热情", "火"),
    ("羊", "温顺善良", "土"),
    ("猴", "机智灵巧", "金"),
    ("鸡", "勤奋守时", "金"),
    ("狗", "忠诚正直", "土"),
    ("猪", "豁达乐观", "水"),
]

# ===== 运势池 =====
FORTUNES = [
    "今天运势极佳，适合大胆尝试新事物！",
    "财运亨通，可能有意外之财哦～",
    "桃花运爆棚，注意把握机会！",
    "工作/学习运不错，努力会有回报。",
    "今天适合安静思考，不宜冲动。",
    "贵人运强，有人会帮到你！",
    "健康运佳，适合运动锻炼。",
    "平平淡淡才是真，安稳度过就好。",
    "创意满满，适合艺术创作！",
    "可能会有小惊喜等着你～",
]


def get_zodiac(month, day):
    date_str = f"{month:02d}-{day:02d}"
    for name, start, end, _, _, _ in ZODIAC_DATA:
        if start <= date_str <= end or (start > end and (date_str >= start or date_str <= end)):
            return name
    return "摩羯座"


def get_chinese_zodiac(year):
    idx = (year - 1900) % 12
    return CHINESE_ZODIAC[idx]


class ZodiacApp:
    def __init__(self, root):
        self.root = root
        self.root.title("034. 星座 / 生肖查询小程序")
        self.root.geometry("620x680")
        self.root.resizable(False, False)

        self.build_ui()

    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="🔮 星座 / 生肖查询小程序",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=12)

        # ===== 查询区 =====
        query_frame = tk.LabelFrame(self.root, text="🔍 查询", font=("微软雅黑", 10))
        query_frame.pack(padx=25, pady=5, fill=tk.X)

        # 行1：星座查询
        row1 = tk.Frame(query_frame)
        row1.pack(fill=tk.X, padx=10, pady=5)

        tk.Label(row1, text="月份：").pack(side=tk.LEFT)
        self.month_spin = tk.Spinbox(row1, from_=1, to=12, width=4)
        self.month_spin.pack(side=tk.LEFT, padx=3)
        self.month_spin.delete(0, tk.END)
        self.month_spin.insert(0, str(date.today().month))

        tk.Label(row1, text=" 日期：").pack(side=tk.LEFT)
        self.day_spin = tk.Spinbox(row1, from_=1, to=31, width=4)
        self.day_spin.pack(side=tk.LEFT, padx=3)
        self.day_spin.delete(0, tk.END)
        self.day_spin.insert(0, str(date.today().day))

        tk.Button(row1, text="查星座", bg="#2196F3", fg="white",
                  width=10, command=self.query_zodiac).pack(side=tk.LEFT, padx=10)

        # 行2：生肖查询
        row2 = tk.Frame(query_frame)
        row2.pack(fill=tk.X, padx=10, pady=5)

        tk.Label(row2, text="年份：").pack(side=tk.LEFT)
        self.year_spin = tk.Spinbox(row2, from_=1900, to=2100, width=6)
        self.year_spin.pack(side=tk.LEFT, padx=3)
        self.year_spin.delete(0, tk.END)
        self.year_spin.insert(0, str(date.today().year))

        tk.Button(row2, text="查生肖", bg="#FF9800", fg="white",
                  width=10, command=self.query_chinese_zodiac).pack(side=tk.LEFT, padx=10)

        # 行3：一键查询（生日完整查询）
        row3 = tk.Frame(query_frame)
        row3.pack(fill=tk.X, padx=10, pady=(5, 8))

        tk.Button(row3, text="🎯 一键查询（星座+生肖）", bg="#4CAF50", fg="white",
                  width=25, height=2, font=("微软雅黑", 10, "bold"),
                  command=self.query_all).pack(side=tk.LEFT)

        tk.Button(row3, text="🎲 今日运势", bg="#9C27B0", fg="white",
                  width=15, height=2, font=("微软雅黑", 10, "bold"),
                  command=self.daily_fortune).pack(side=tk.LEFT, padx=10)

        # ===== 结果区 =====
        result_frame = tk.LabelFrame(self.root, text="📋 查询结果", font=("微软雅黑", 10))
        result_frame.pack(padx=25, pady=10, fill=tk.BOTH, expand=True)

        self.result_text = tk.Text(
            result_frame, font=("微软雅黑", 11),
            wrap=tk.WORD, relief=tk.FLAT, height=18
        )
        self.result_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        # 滚动条
        scrollbar = tk.Scrollbar(self.result_text)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.result_text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.result_text.yview)

        # 底部
        tk.Label(
            self.root, text="提示：输入日期后点击查询即可 | 运势为随机趣味内容",
            font=("微软雅黑", 8), fg="#999"
        ).pack(pady=5)

        # 初始提示
        self.result_text.insert("1.0", "👆 请输入日期，然后点击查询按钮\n\n")
        self.result_text.config(state=tk.DISABLED)

    def _set_text(self, text):
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete("1.0", tk.END)
        self.result_text.insert("1.0", text)
        self.result_text.config(state=tk.DISABLED)

    def query_zodiac(self):
        try:
            month = int(self.month_spin.get())
            day = int(self.day_spin.get())
        except ValueError:
            self._set_text("⚠️ 请输入有效的日期！")
            return

        if not (1 <= month <= 12 and 1 <= day <= 31):
            self._set_text("⚠️ 日期不合法！")
            return

        zodiac_name = get_zodiac(month, day)

        # 找详情
        for name, _, _, trait, color, num in ZODIAC_DATA:
            if name == zodiac_name:
                text = (
                    f"🌟 星座查询结果\n"
                    f"{'='*40}\n\n"
                    f"  🔮 您的星座是：【{name}】\n\n"
                    f"  📌 出生日期范围：\n"
                    f"     {month}月{day}日\n\n"
                    f"  💡 性格关键词：{trait}\n"
                    f"  🎨 幸运色：{color}\n"
                    f"  🔢 幸运数字：{num}\n\n"
                    f"{'='*40}\n"
                )
                self._set_text(text)
                return

    def query_chinese_zodiac(self):
        try:
            year = int(self.year_spin.get())
        except ValueError:
            self._set_text("⚠️ 请输入有效的年份！")
            return

        idx = (year - 1900) % 12
        animal, trait, element = CHINESE_ZODIAC[idx]

        # 生肖emoji映射
        emojis = ["🐭", "🐂", "🐯", "🐰", "🐲", "🐍",
                  "🐴", "🐑", "🐵", "🐔", "🐶", "🐷"]

        text = (
            f"🏮 生肖查询结果\n"
            f"{'='*40}\n\n"
            f"  {emojis[idx]} 您的生肖是：【{animal}】\n\n"
            f"  📅 出生年份：{year}年\n\n"
            f"  💡 性格特点：{trait}\n"
            f"  🌊 五行属性：{element}\n\n"
            f"  📋 十二生肖顺序：\n"
            f"  鼠🐭 牛🐂 虎🐯 兔🐰 龙🐲 蛇🐍\n"
            f"  马🐴 羊🐑 猴🐵 鸡🐔 狗🐶 猪🐷\n\n"
            f"{'='*40}\n"
        )
        self._set_text(text)

    def query_all(self):
        try:
            year = int(self.year_spin.get())
            month = int(self.month_spin.get())
            day = int(self.day_spin.get())
        except ValueError:
            self._set_text("⚠️ 请输入完整的年月日！")
            return

        zodiac_name = get_zodiac(month, day)
        idx = (year - 1900) % 12
        animal, trait_cz, element = CHINESE_ZODIAC[idx]
        emojis = ["🐭", "🐂", "🐯", "🐰", "🐲", "🐍",
                  "🐴", "🐑", "🐵", "🐔", "🐶", "🐷"]

        for name, _, _, trait_z, color, num in ZODIAC_DATA:
            if name == zodiac_name:
                text = (
                    f"🎯 完整查询结果\n"
                    f"{'='*40}\n\n"
                    f"  📅 出生日期：{year}年{month}月{day}日\n\n"
                    f"  🔮 星座：【{zodiac_name}】\n"
                    f"     ├─ 性格：{trait_z}\n"
                    f"     ├─ 幸运色：{color}\n"
                    f"     └─ 幸运数字：{num}\n\n"
                    f"  {emojis[idx]} 生肖：【{animal}】\n"
                    f"     ├─ 性格：{trait_cz}\n"
                    f"     └─ 五行：{element}\n\n"
                    f"{'='*40}\n"
                )
                self._set_text(text)
                return

    def daily_fortune(self):
        fortune = random.choice(FORTUNES)

        # 随机综合运势
        stars = random.randint(1, 5)
        star_str = "★" * stars + "☆" * (5 - stars)

        try:
            month = int(self.month_spin.get())
            day = int(self.day_spin.get())
            zodiac_name = get_zodiac(month, day)
        except:
            zodiac_name = "未知"

        text = (
            f"🎲 {zodiac_name} 今日运势\n"
            f"{'='*40}\n\n"
            f"  ✨ 综合运势：{star_str}\n\n"
            f"  💬 {fortune}\n\n"
            f"  🍀 幸运提示：\n"
            f"     {random.choice(['宜出门', '宜学习', '宜社交', '宜休息', '宜表白', '宜投资'])}\n"
            f"     {random.choice(['忌冲动', '忌熬夜', '忌暴饮暴食', '忌拖延', '忌纠结'])}\n\n"
            f"  ⚠️ 温馨提示：运势仅供娱乐参考～\n\n"
            f"{'='*40}\n"
        )
        self._set_text(text)


if __name__ == "__main__":
    root = tk.Tk()
    ZodiacApp(root)
    root.mainloop()