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

# 星座数据
constellation_data = [
    ("摩羯座", (12, 22), (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), "乐观爱自由，热爱探索，坦率豁达")
]

# 生肖顺序 + 五行
zodiac_list = [
    ("鼠", "水"), ("牛", "土"), ("虎", "木"), ("兔", "木"),
    ("龙", "土"), ("蛇", "火"), ("马", "火"), ("羊", "土"),
    ("猴", "金"), ("鸡", "金"), ("狗", "土"), ("猪", "水")
]

def get_constellation(month, day):
    for name, start, end, desc in constellation_data:
        sm, sd = start
        em, ed = end
        if (month == sm and day >= sd) or (month == em and day <= ed):
            return name, desc, f"{sm}月{sd}日-{em}月{ed}日"
        if sm > em:
            if (month >= sm and day >= sd) or (month <= em and day <= ed):
                return name, desc, f"{sm}月{sd}日-{em}月{ed}日"
    return "未知", "", ""

def get_zodiac(year):
    idx = (year - 4) % 12
    animal, five = zodiac_list[idx]
    return animal, five

def query():
    try:
        y = int(entry_year.get())
        m = int(entry_month.get())
        d = int(entry_day.get())
        birthday = datetime.date(y, m, d)
    except ValueError:
        messagebox.showerror("输入错误", "请输入合法数字年月日！")
        return
    except Exception:
        messagebox.showerror("日期错误", "日期不存在！")
        return

    # 星座
    cons_name, cons_desc, cons_range = get_constellation(m, d)
    # 生肖五行
    animal, five = get_zodiac(y)
    # 年龄
    today = datetime.date.today()
    age = today.year - birthday.year
    if (today.month, today.day) < (birthday.month, birthday.day):
        age -= 1

    info = f"""
【出生信息】
出生日期：{y}年{m:02d}月{d:02d}日
周岁年龄：{age}岁

【生肖】
属相：{animal}
五行属性：{five}

【星座】
星座：{cons_name}
日期区间：{cons_range}
性格特点：{cons_desc}
"""
    text_result.delete(1.0, tk.END)
    text_result.insert(tk.END, info)

# 窗口搭建
root = tk.Tk()
root.title("星座生肖查询器")
root.geometry("460x380")
root.resizable(False, False)

main_frame = ttk.Frame(root, padding=15)
main_frame.pack(fill=tk.BOTH, expand=True)

# 输入区域
ttk.Label(main_frame, text="出生年份：").grid(row=0, column=0, sticky="w")
entry_year = ttk.Entry(main_frame, width=10)
entry_year.grid(row=0, column=1, padx=6, pady=4)

ttk.Label(main_frame, text="出生月份：").grid(row=0, column=2, sticky="w", padx=(10,0))
entry_month = ttk.Entry(main_frame, width=6)
entry_month.grid(row=0, column=3, padx=6, pady=4)

ttk.Label(main_frame, text="出生日期：").grid(row=1, column=0, sticky="w")
entry_day = ttk.Entry(main_frame, width=6)
entry_day.grid(row=1, column=1, padx=6, pady=4)

btn_query = ttk.Button(main_frame, text="开始查询", command=query)
btn_query.grid(row=1, column=2, columnspan=2, pady=6)

# 结果框
ttk.Label(main_frame, text="查询结果：").grid(row=2, column=0, columnspan=4, sticky="w", pady=(8,2))
text_result = tk.Text(main_frame, height=12, width=52)
text_result.grid(row=3, column=0, columnspan=4)

root.mainloop()