import tkinter as tk
from tkinter import ttk
from datetime import datetime

# ========== 数据 ==========
zodiac_animals = ['鼠', '牛', '虎', '兔', '龙', '蛇',
                  '马', '羊', '猴', '鸡', '狗', '猪']
zodiac_emoji = ['🐭', '🐮', '🐯', '🐰', '🐲', '🐍',
                '🐴', '🐑', '🐵', '🐔', '🐶', '🐷']


def get_zodiac(year, month, day):
    """按立春(2月4日)为界计算生肖"""
    zodiac_year = year
    if month < 2 or (month == 2 and day < 4):
        zodiac_year = year - 1
    idx = (zodiac_year - 4) % 12
    return zodiac_animals[idx], zodiac_emoji[idx]


def get_constellation(month, day):
    """根据公历月日返回星座名和符号"""
    # 摩羯座跨年特殊处理
    if (month == 12 and day >= 22) or (month == 1 and day <= 19):
        return '摩羯座', '♑'

    c_list = [
        (1, 20, '水瓶座', '♒'),
        (2, 19, '双鱼座', '♓'),
        (3, 21, '白羊座', '♈'),
        (4, 20, '金牛座', '♉'),
        (5, 21, '双子座', '♊'),
        (6, 22, '巨蟹座', '♋'),
        (7, 23, '狮子座', '♌'),
        (8, 23, '处女座', '♍'),
        (9, 23, '天秤座', '♎'),
        (10, 24, '天蝎座', '♏'),
        (11, 22, '射手座', '♐'),
    ]
    for m, d, name, sym in reversed(c_list):
        if month > m or (month == m and day >= d):
            return name, sym
    return '摩羯座', '♑'


# ========== 主窗口 ==========
root = tk.Tk()
root.title("星座 · 生肖查询")
root.geometry("460x380")
root.resizable(False, False)
root.configure(bg="#f0f0f0")

# 标题
title = tk.Label(root, text="✨ 星座 · 生肖 查询 ✨",
                 font=("Microsoft YaHei", 16, "bold"),
                 bg="#f0f0f0", fg="#1e3c5c")
title.pack(pady=(15, 5))

subtitle = tk.Label(root, text="选择日期，一键查询",
                    font=("Microsoft YaHei", 10, "italic"),
                    bg="#f0f0f0", fg="#5a5a5a")
subtitle.pack(pady=(0, 15))

# ========== 日期选择区 ==========
date_frame = tk.Frame(root, bg="#e8e8e8", bd=2, relief="groove")
date_frame.pack(padx=20, pady=5, fill="x")

# 年份
tk.Label(date_frame, text="年份", bg="#e8e8e8",
         font=("Microsoft YaHei", 10)).grid(row=0, column=0, padx=8, pady=10)
year_var = tk.StringVar()
year_combo = ttk.Combobox(date_frame, textvariable=year_var,
                          values=[str(y) for y in range(1940, 2031)],
                          width=8, state="readonly")
year_combo.grid(row=1, column=0, padx=8, pady=(0, 10))

# 月份
tk.Label(date_frame, text="月份", bg="#e8e8e8",
         font=("Microsoft YaHei", 10)).grid(row=0, column=1, padx=8, pady=10)
month_var = tk.StringVar()
month_combo = ttk.Combobox(date_frame, textvariable=month_var,
                           values=[str(m) for m in range(1, 13)],
                           width=5, state="readonly")
month_combo.grid(row=1, column=1, padx=8, pady=(0, 10))

# 日期
tk.Label(date_frame, text="日期", bg="#e8e8e8",
         font=("Microsoft YaHei", 10)).grid(row=0, column=2, padx=8, pady=10)
day_var = tk.StringVar()
day_combo = ttk.Combobox(date_frame, textvariable=day_var,
                         values=[str(d) for d in range(1, 32)],
                         width=5, state="readonly")
day_combo.grid(row=1, column=2, padx=8, pady=(0, 10))


def update_days(*args):
    """根据年份和月份更新日期下拉框"""
    try:
        y = int(year_var.get())
        m = int(month_var.get())
        import calendar
        max_day = calendar.monthrange(y, m)[1]
        day_combo['values'] = [str(d) for d in range(1, max_day + 1)]
        if day_var.get() and int(day_var.get()) > max_day:
            day_var.set(str(max_day))
    except (ValueError, TypeError):
        pass


year_combo.bind("<<ComboboxSelected>>", update_days)
month_combo.bind("<<ComboboxSelected>>", update_days)


# ========== 结果显示区 ==========
result_frame = tk.LabelFrame(root, text=" 查询结果 ",
                             font=("Microsoft YaHei", 10, "bold"),
                             bg="#ffffff", fg="#3a3a3a",
                             bd=2, relief="groove", padx=15, pady=10)
result_frame.pack(padx=20, pady=15, fill="both", expand=True)

# 生肖显示
zodiac_label = tk.Label(result_frame, text="🐉  生肖：—",
                        font=("Microsoft YaHei", 14, "bold"),
                        bg="#ffffff", fg="#1e3c5c", anchor="w")
zodiac_label.pack(fill="x", pady=8)

# 星座显示
const_label = tk.Label(result_frame, text="♌  星座：—",
                       font=("Microsoft YaHei", 14, "bold"),
                       bg="#ffffff", fg="#1e3c5c", anchor="w")
const_label.pack(fill="x", pady=8)

# 提示信息
info_label = tk.Label(result_frame, text="",
                      font=("Microsoft YaHei", 9),
                      bg="#ffffff", fg="#888")
info_label.pack(fill="x", pady=(5, 0))


# ========== 按钮功能 ==========
def query():
    try:
        y = int(year_var.get())
        m = int(month_var.get())
        d = int(day_var.get())
    except ValueError:
        info_label.config(text="⚠️ 请先选择完整的日期", fg="#c0392b")
        return

    zodiac_name, zodiac_em = get_zodiac(y, m, d)
    const_name, const_sym = get_constellation(m, d)

    zodiac_label.config(text=f"{zodiac_em}  生肖：{zodiac_name}")
    const_label.config(text=f"{const_sym}  星座：{const_name}")
    info_label.config(text=f"查询日期：{y}年{m}月{d}日", fg="#666")


def reset():
    today = datetime.now()
    year_var.set(str(today.year))
    month_var.set(str(today.month))
    update_days()
    day_var.set(str(today.day))
    zodiac_label.config(text="🐉  生肖：—")
    const_label.config(text="♌  星座：—")
    info_label.config(text="")


# 按钮区
btn_frame = tk.Frame(root, bg="#f0f0f0")
btn_frame.pack(pady=(0, 15))

query_btn = tk.Button(btn_frame, text="🔍 查 询", command=query,
                      font=("Microsoft YaHei", 11, "bold"),
                      bg="#4a90d9", fg="white", width=12,
                      relief="raised", bd=2, cursor="hand2")
query_btn.pack(side="left", padx=10)

reset_btn = tk.Button(btn_frame, text="⟲ 重 置", command=reset,
                      font=("Microsoft YaHei", 11, "bold"),
                      bg="#d0d0d0", fg="#333", width=12,
                      relief="raised", bd=2, cursor="hand2")
reset_btn.pack(side="left", padx=10)

# ========== 初始化 ==========
reset()  # 默认显示今天日期

root.mainloop()