import tkinter as tk
from tkinter import ttk, messagebox
from datetime import date


# ---------- 星座数据 ----------
# (起始月, 起始日, 星座名, 符号, 元素, 守护星, 性格关键词)
ZODIAC_SIGNS = [
    (1, 20, "水瓶座", "♒", "风象", "天王星", "独立、创新、理性、博爱"),
    (2, 19, "双鱼座", "♓", "水象", "海王星", "浪漫、感性、富有同情心、想象力丰富"),
    (3, 21, "白羊座", "♈", "火象", "火星", "热情、勇敢、直率、冲劲十足"),
    (4, 20, "金牛座", "♉", "土象", "金星", "踏实、稳重、有耐心、重视物质"),
    (5, 21, "双子座", "♊", "风象", "水星", "机灵、善变、好奇心强、善于沟通"),
    (6, 22, "巨蟹座", "♋", "水象", "月亮", "温柔、顾家、敏感、重视情感"),
    (7, 23, "狮子座", "♌", "火象", "太阳", "自信、慷慨、有领导力、爱表现"),
    (8, 23, "处女座", "♍", "土象", "水星", "细致、完美主义、务实、有分析力"),
    (9, 23, "天秤座", "♎", "风象", "金星", "优雅、公正、善交际、追求平衡"),
    (10, 24, "天蝎座", "♏", "水象", "冥王星", "神秘、专注、意志坚定、情感浓烈"),
    (11, 23, "射手座", "♐", "火象", "木星", "乐观、自由、爱冒险、热爱探索"),
    (12, 22, "摩羯座", "♑", "土象", "土星", "务实、自律、有责任感、目标明确"),
]

# ---------- 生肖数据 ----------
ZODIAC_ANIMALS = ["鼠", "牛", "虎", "兔", "龙", "蛇",
                  "马", "羊", "猴", "鸡", "狗", "猪"]

ANIMAL_INFO = {
    "鼠": ("🐭", "机智、灵活、善于应变、精打细算"),
    "牛": ("🐮", "勤劳、踏实、有耐力、稳重可靠"),
    "虎": ("🐯", "勇敢、自信、有魄力、热情外向"),
    "兔": ("🐰", "温和、善良、细心、讲究生活品质"),
    "龙": ("🐲", "大气、自信、有抱负、充满活力"),
    "蛇": ("🐍", "智慧、冷静、有洞察力、思虑周全"),
    "马": ("🐴", "开朗、积极、爱自由、行动力强"),
    "羊": ("🐑", "温顺、善良、有艺术气质、重感情"),
    "猴": ("🐵", "聪明、活泼、幽默、反应敏捷"),
    "鸡": ("🐔", "勤奋、守时、注重细节、有责任感"),
    "狗": ("🐶", "忠诚、正直、重情义、可靠"),
    "猪": ("🐷", "厚道、真诚、乐观、有福气"),
}


def get_zodiac_sign(month, day):
    """根据月日返回星座信息"""
    # 从后往前找第一个满足 (month, day) >= (起始月, 起始日) 的星座
    result = ZODIAC_SIGNS[-1]
    for sign in ZODIAC_SIGNS:
        if (month, day) >= (sign[0], sign[1]):
            result = sign
    return result


def get_chinese_zodiac(year):
    """根据年份返回生肖（以农历春节近似，按公历年份计算）"""
    # 公元4年为鼠年，作为基准
    index = (year - 4) % 12
    return ZODIAC_ANIMALS[index]


class ZodiacApp:
    def __init__(self, root):
        self.root = root
        self.root.title("🔮 星座 / 生肖 查询")
        self.root.geometry("560x620")
        self.root.resizable(False, False)
        self.root.configure(bg="#f5f7fa")

        self.build_ui()

    def build_ui(self):
        # 标题
        title = tk.Label(self.root, text="🔮 星座 / 生肖 查询",
                         font=("Microsoft YaHei", 20, "bold"),
                         fg="#5e35b1", bg="#f5f7fa")
        title.pack(pady=15)

        # ===== 输入区 =====
        input_frame = tk.LabelFrame(self.root, text=" 选择或输入日期 ",
                                    font=("Microsoft YaHei", 11, "bold"),
                                    fg="#3949ab", bg="#f5f7fa", padx=10, pady=10)
        input_frame.pack(padx=20, pady=5, fill="x")

        row = tk.Frame(input_frame, bg="#f5f7fa")
        row.pack()

        tk.Label(row, text="年:", font=("Microsoft YaHei", 11), bg="#f5f7fa").grid(row=0, column=0, padx=3)
        self.year_var = tk.StringVar(value=str(date.today().year))
        self.year_spin = tk.Spinbox(row, from_=1900, to=2100, width=6,
                                    textvariable=self.year_var, font=("Microsoft YaHei", 11))
        self.year_spin.grid(row=0, column=1, padx=3)

        tk.Label(row, text="月:", font=("Microsoft YaHei", 11), bg="#f5f7fa").grid(row=0, column=2, padx=3)
        self.month_var = tk.StringVar(value=str(date.today().month))
        tk.Spinbox(row, from_=1, to=12, width=4, textvariable=self.month_var,
                   font=("Microsoft YaHei", 11)).grid(row=0, column=3, padx=3)

        tk.Label(row, text="日:", font=("Microsoft YaHei", 11), bg="#f5f7fa").grid(row=0, column=4, padx=3)
        self.day_var = tk.StringVar(value=str(date.today().day))
        tk.Spinbox(row, from_=1, to=31, width=4, textvariable=self.day_var,
                   font=("Microsoft YaHei", 11)).grid(row=0, column=5, padx=3)

        query_btn = tk.Button(input_frame, text="✨ 立即查询", command=self.query,
                              bg="#7e57c2", fg="white",
                              font=("Microsoft YaHei", 11, "bold"),
                              relief="flat", width=14, pady=4, cursor="hand2")
        query_btn.pack(pady=10)

        # ===== 结果区 =====
        result_frame = tk.Frame(self.root, bg="#f5f7fa")
        result_frame.pack(padx=20, pady=5, fill="both", expand=True)

        # 星座卡片
        self.sign_card = tk.LabelFrame(result_frame, text=" ♈ 星座信息 ",
                                       font=("Microsoft YaHei", 12, "bold"),
                                       fg="#c2185b", bg="white", padx=12, pady=8,
                                       relief="groove", bd=2)
        self.sign_card.pack(fill="x", pady=6)

        self.sign_name_label = tk.Label(self.sign_card, text="—",
                                        font=("Microsoft YaHei", 18, "bold"),
                                        fg="#c2185b", bg="white")
        self.sign_name_label.pack(anchor="w")

        self.sign_detail_label = tk.Label(self.sign_card, text="",
                                          font=("Microsoft YaHei", 10),
                                          fg="#555", bg="white", justify="left")
        self.sign_detail_label.pack(anchor="w", pady=3)

        self.sign_traits_label = tk.Label(self.sign_card, text="",
                                          font=("Microsoft YaHei", 10),
                                          fg="#333", bg="white",
                                          wraplength=480, justify="left")
        self.sign_traits_label.pack(anchor="w")

        # 生肖卡片
        self.animal_card = tk.LabelFrame(result_frame, text=" 🐲 生肖信息 ",
                                         font=("Microsoft YaHei", 12, "bold"),
                                         fg="#d84315", bg="white", padx=12, pady=8,
                                         relief="groove", bd=2)
        self.animal_card.pack(fill="x", pady=6)

        self.animal_name_label = tk.Label(self.animal_card, text="—",
                                          font=("Microsoft YaHei", 18, "bold"),
                                          fg="#d84315", bg="white")
        self.animal_name_label.pack(anchor="w")

        self.animal_detail_label = tk.Label(self.animal_card, text="",
                                            font=("Microsoft YaHei", 10),
                                            fg="#555", bg="white", justify="left")
        self.animal_detail_label.pack(anchor="w", pady=3)

        self.animal_traits_label = tk.Label(self.animal_card, text="",
                                            font=("Microsoft YaHei", 10),
                                            fg="#333", bg="white",
                                            wraplength=480, justify="left")
        self.animal_traits_label.pack(anchor="w")

        # 底部提示
        tip = tk.Label(self.root, text="提示：生肖以公历年份近似计算，正式以农历春节为界。",
                       font=("Microsoft YaHei", 9), fg="#888", bg="#f5f7fa")
        tip.pack(side="bottom", pady=6)

        # 绑定回车查询
        for w in (self.year_spin,):
            w.bind("<Return>", lambda e: self.query())

        # 启动时先查询今天的
        self.query()

    def query(self):
        try:
            year = int(self.year_var.get())
            month = int(self.month_var.get())
            day = int(self.day_var.get())
            # 校验日期合法性
            test_date = date(year, month, day)
        except ValueError:
            messagebox.showerror("错误", "请输入有效的日期（年 1900-2100，日 1-31）！")
            return

        # ---- 星座 ----
        sign = get_zodiac_sign(month, day)
        sign_name, sign_symbol, element, planet, traits = sign[2], sign[3], sign[4], sign[5], sign[6]

        # 星座区间
        idx = ZODIAC_SIGNS.index(sign)
        next_sign = ZODIAC_SIGNS[(idx + 1) % 12]
        start_m, start_d = sign[0], sign[1]
        end_m, end_d = next_sign[0], next_sign[1] - 1
        if end_d == 0:  # 极少出现，保险处理
            end_m -= 1
            end_d = 31
        if end_d < 1:
            end_d = 30

        self.sign_name_label.config(text=f"{sign_symbol} {sign_name}")
        self.sign_detail_label.config(
            text=f"日期区间：{start_m}月{start_d}日 ～ {end_m}月{end_d}日    "
                 f"元素：{element}    守护星：{planet}")
        self.sign_traits_label.config(text=f"性格关键词：{traits}")

        # ---- 生肖 ----
        animal = get_chinese_zodiac(year)
        emoji, animal_traits = ANIMAL_INFO[animal]

        # 计算附近各生肖年份（最近 3 个同生肖年份，方便对照）
        nearby_years = []
        for offset in (-12, 0, 12):
            y = year + offset
            if 1900 <= y <= 2100:
                nearby_years.append(str(y))
        years_text = "、".join(nearby_years)

        self.animal_name_label.config(text=f"{emoji} 属{animal}")
        self.animal_detail_label.config(text=f"出生年份：{year} 年    同生肖年份：{years_text}")
        self.animal_traits_label.config(text=f"性格关键词：{animal_traits}")


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