import tkinter as tk
from datetime import datetime

# ========================
# 主题配置
# ========================
themes = {
    "🌸 樱花粉": {"bg": "#FFE4E9", "fg": "#D81B60", "btn": "#F8BBD0"},
    "💜 梦幻紫": {"bg": "#F3E5F5", "fg": "#7B1FA2", "btn": "#CE93D8"},
    "💙 天空蓝": {"bg": "#E3F2FD", "fg": "#1565C0", "btn": "#90CAF9"},
    "💚 抹茶绿": {"bg": "#E8F5E9", "fg": "#2E7D32", "btn": "#A5D6A7"},
    "🧡 蜜桔橙": {"bg": "#FFF3E0", "🌞": "#EF6C00", "btn": "#FFCC80"},
    "🍬 糖果色": {"bg": "#FCE4EC", "fg": "#C2185B", "btn": "#F48FB1"},
}

# ========================
# 星座数据
# ========================
constellations = [
    ("摩羯座", (1, 1), (1, 19)),
    ("水瓶座", (1, 20), (2, 18)),
    ("双鱼座", (2, 19), (3, 20)),
    ("白羊座", (3, 21), (4, 19)),
    ("金牛座", (4, 20), (5, 20)),
    ("双子座", (5, 21), (6, 21)),
    ("巨蟹座", (6, 22), (7, 22)),
    ("狮子座", (7, 23), (8, 22)),
    ("处女座", (8, 23), (9, 22)),
    ("天秤座", (9, 23), (10, 23)),
    ("天蝎座", (10, 24), (11, 22)),
    ("射手座", (11, 23), (12, 21)),
    ("摩羯座", (12, 22), (12, 31)),
]

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

# ========================
# 换肤函数（✅ 所有控件已提前创建）
# ========================
def apply_theme(name):
    t = themes[name]

    root.configure(bg=t["bg"])
    top_frame.configure(bg=t["bg"])
    input_frame.configure(bg=t["bg"])
    result_frame.configure(bg=t["bg"])

    label_title.configure(bg=t["bg"], fg=t["fg"])
    label_input_hint.configure(bg=t["bg"], fg=t["fg"])
    label_result_hint.configure(bg=t["bg"], fg=t["fg"])

    for btn in theme_buttons:
        btn.configure(bg=t["btn"], fg=t["fg"])

    btn_query.configure(bg=t["btn"], fg=t["fg"])
    btn_today.configure(bg=t["btn"], fg=t["fg"])

# ========================
# 查询逻辑
# ========================
def get_constellation(month, day):
    for name, start, end in constellations:
        if (month == start[0] and day >= start[1]) or \
           (month == end[0] and day <= end[1]):
            return name
    return "未知"

def get_chinese_zodiac(year):
    return animals[(year - 1900) % 12]

def query():
    try:
        y = int(entry_year.get())
        m = int(entry_month.get())
        d = int(entry_day.get())

        if not (1900 <= y <= datetime.now().year):
            raise ValueError

        constellation = get_constellation(m, d)
        zodiac = get_chinese_zodiac(y)

        result_text.set(
            f"🎂 生日：{y}-{m:02d}-{d:02d}\n"
            f"⭐ 星座：{constellation}\n"
            f"🐾 生肖：{zodiac}"
        )
    except:
        result_text.set("⚠️ 请输入正确的日期哦～")

def set_today():
    today = datetime.now()
    entry_year.delete(0, tk.END)
    entry_year.insert(0, today.year)
    entry_month.delete(0, tk.END)
    entry_month.insert(0, today.month)
    entry_day.delete(0, tk.END)
    entry_day.insert(0, today.day)

# ========================
# 创建窗口
# ========================
root = tk.Tk()
root.title("🔮 星座生肖查询器")
root.geometry("820x620")
root.resizable(False, False)

# ========================
# 顶部区域
# ========================
top_frame = tk.Frame(root)
top_frame.pack(fill="x", pady=10)

label_title = tk.Label(
    top_frame,
    text="🔮 星座 & 生肖查询器 ✨",
    font=("Comic Sans MS", 24, "bold")
)
label_title.pack()

# ========================
# 主题按钮（先创建）
# ========================
theme_frame = tk.Frame(top_frame)
theme_frame.pack(pady=5)

theme_buttons = []
for name in themes:
    btn = tk.Button(
        theme_frame, text=name,
        font=("Comic Sans MS", 9)
    )
    btn.pack(side="left", padx=3)
    theme_buttons.append(btn)

# ========================
# 输入区域（先创建）
# ========================
input_frame = tk.Frame(root)
input_frame.pack(pady=10)

label_input_hint = tk.Label(
    input_frame,
    text="🎂 请输入生日：",
    font=("Comic Sans MS", 11)
)
label_input_hint.grid(row=0, column=0, columnspan=6, sticky="w", padx=10)

tk.Label(input_frame, text="年").grid(row=1, column=0)
entry_year = tk.Entry(input_frame, width=6, justify="center")
entry_year.grid(row=1, column=1, padx=2)

tk.Label(input_frame, text="月").grid(row=1, column=2)
entry_month = tk.Entry(input_frame, width=4, justify="center")
entry_month.grid(row=1, column=3, padx=2)

tk.Label(input_frame, text="日").grid(row=1, column=4)
entry_day = tk.Entry(input_frame, width=4, justify="center")
entry_day.grid(row=1, column=5, padx=2)

btn_query = tk.Button(input_frame, text="🔍 查询")
btn_query.grid(row=1, column=6, padx=10)

btn_today = tk.Button(input_frame, text="📌 今天")
btn_today.grid(row=1, column=7, padx=5)

# ========================
# 结果区域（先创建）
# ========================
result_frame = tk.Frame(root)
result_frame.pack(pady=20)

label_result_hint = tk.Label(
    result_frame,
    text="🔍 查询结果：",
    font=("Comic Sans MS", 11)
)
label_result_hint.pack(anchor="w", padx=15)

result_text = tk.StringVar()
label_result = tk.Label(
    result_frame,
    textvariable=result_text,
    font=("Comic Sans MS", 14),
    justify="left"
)
label_result.pack(padx=15, pady=10)

# ========================
# 绑定按钮事件
# ========================
btn_query.config(command=query)
btn_today.config(command=set_today)

for btn, name in zip(theme_buttons, themes.keys()):
    btn.config(command=lambda n=name: apply_theme(n))

# ========================
# ✅ 最后一步：初始化换肤
# ========================
apply_theme("🌸 樱花粉")

root.mainloop()