import tkinter as tk
from tkinter import messagebox

# ======================== 数据定义 ========================

ZODIAC_DATA = [
    {"name": "摩羯座", "en": "Capricorn", "emoji": "♑", "start": (1, 1), "end": (1, 19),
     "element": "土象", "ruler": "土星", "trait": "务实、有责任感、耐心、自律，追求稳定与成就，做事脚踏实地。"},
    {"name": "水瓶座", "en": "Aquarius", "emoji": "♒", "start": (1, 20), "end": (2, 18),
     "element": "风象", "ruler": "天王星", "trait": "独立、创新、理性、博爱，思维前卫，喜欢探索未知领域。"},
    {"name": "双鱼座", "en": "Pisces", "emoji": "♓", "start": (2, 19), "end": (3, 20),
     "element": "水象", "ruler": "海王星", "trait": "浪漫、敏感、富有想象力，善解人意，具有强烈的艺术气质。"},
    {"name": "白羊座", "en": "Aries", "emoji": "♈", "start": (3, 21), "end": (4, 19),
     "element": "火象", "ruler": "火星", "trait": "热情、勇敢、果断、充满活力，天生的领导者，行动力极强。"},
    {"name": "金牛座", "en": "Taurus", "emoji": "♉", "start": (4, 20), "end": (5, 20),
     "element": "土象", "ruler": "金星", "trait": "稳重、忠诚、有耐心，重视物质与感官享受，做事坚持不懈。"},
    {"name": "双子座", "en": "Gemini", "emoji": "♊", "start": (5, 21), "end": (6, 21),
     "element": "风象", "ruler": "水星", "trait": "机智、善变、好奇心强，沟通能力出色，兴趣广泛且多才多艺。"},
    {"name": "巨蟹座", "en": "Cancer", "emoji": "♋", "start": (6, 22), "end": (7, 22),
     "element": "水象", "ruler": "月亮", "trait": "温柔、顾家、情感丰富，重视安全感，对亲友极为关怀。"},
    {"name": "狮子座", "en": "Leo", "emoji": "♌", "start": (7, 23), "end": (8, 22),
     "element": "火象", "ruler": "太阳", "trait": "自信、慷慨、有领导力，热爱成为焦点，充满创造力与热情。"},
    {"name": "处女座", "en": "Virgo", "emoji": "♍", "start": (8, 23), "end": (9, 22),
     "element": "土象", "ruler": "水星", "trait": "细心、追求完美、分析力强，做事一丝不苟，注重细节与效率。"},
    {"name": "天秤座", "en": "Libra", "emoji": "♎", "start": (9, 23), "end": (10, 23),
     "element": "风象", "ruler": "金星", "trait": "优雅、公正、善于社交，追求和谐与美感，讨厌冲突与不公。"},
    {"name": "天蝎座", "en": "Scorpio", "emoji": "♏", "start": (10, 24), "end": (11, 22),
     "element": "水象", "ruler": "冥王星", "trait": "深沉、专注、意志力强，洞察力惊人，爱恨分明。"},
    {"name": "射手座", "en": "Sagittarius", "emoji": "♐", "start": (11, 23), "end": (12, 21),
     "element": "火象", "ruler": "木星", "trait": "乐观、自由、热爱冒险，追求真理与远方，哲学气质浓厚。"},
    {"name": "摩羯座", "en": "Capricorn", "emoji": "♑", "start": (12, 22), "end": (12, 31),
     "element": "土象", "ruler": "土星", "trait": "务实、有责任感、耐心、自律，追求稳定与成就，做事脚踏实地。"},
]

ZODIAC_INFO = {}
for z in ZODIAC_DATA:
    ZODIAC_INFO[z["name"]] = z

SHENGXIAO_DATA = {
    "鼠": {"emoji": "🐭", "dizhi": "子", "trait": "机智灵活、适应力强、善于交际，头脑聪明，善于发现机会。",
           "match": "龙、猴、牛", "conflict": "马、羊、兔"},
    "牛": {"emoji": "🐮", "dizhi": "丑", "trait": "勤劳踏实、坚韧不拔、值得信赖，做事有条不紊，意志坚定。",
           "match": "鼠、蛇、鸡", "conflict": "羊、马、狗"},
    "虎": {"emoji": "🐯", "dizhi": "寅", "trait": "勇敢自信、富有魄力、热情洋溢，天生领袖气质，敢于冒险。",
           "match": "马、狗、猪", "conflict": "猴、蛇"},
    "兔": {"emoji": "🐰", "dizhi": "卯", "trait": "温和善良、心思细腻、品味高雅，处事谨慎，有艺术天赋。",
           "match": "羊、狗、猪", "conflict": "鸡、龙、鼠"},
    "龙": {"emoji": "🐲", "dizhi": "辰", "trait": "气宇轩昂、精力充沛、志向远大，充满魅力，天生好运。",
           "match": "鼠、猴、鸡", "conflict": "狗、兔"},
    "蛇": {"emoji": "🐍", "dizhi": "巳", "trait": "深沉睿智、直觉敏锐、优雅从容，善于思考，洞察力强。",
           "match": "牛、鸡", "conflict": "猪、虎"},
    "马": {"emoji": "🐴", "dizhi": "午", "trait": "热情奔放、行动力强、崇尚自由，精力旺盛，乐观积极。",
           "match": "虎、羊、狗", "conflict": "鼠、牛"},
    "羊": {"emoji": "🐑", "dizhi": "未", "trait": "温柔体贴、富有同情心、创造力强，追求和谐美好的生活。",
           "match": "兔、马、猪", "conflict": "牛、狗、鼠"},
    "猴": {"emoji": "🐵", "dizhi": "申", "trait": "聪明伶俐、活泼好动、多才多艺，反应敏捷，幽默风趣。",
           "match": "鼠、龙", "conflict": "虎、猪"},
    "鸡": {"emoji": "🐔", "dizhi": "酉", "trait": "勤奋务实、观察敏锐、表现欲强，做事精准，追求完美。",
           "match": "牛、龙、蛇", "conflict": "兔、狗"},
    "狗": {"emoji": "🐶", "dizhi": "戌", "trait": "忠诚正直、重情重义、正义感强，是最值得信赖的伙伴。",
           "match": "虎、兔、马", "conflict": "龙、鸡、羊"},
    "猪": {"emoji": "🐷", "dizhi": "亥", "trait": "真诚善良、豁达乐观、宽容大度，享受生活，待人真诚。",
           "match": "虎、兔、羊", "conflict": "蛇、猴"},
}

SHENGXIAO_LIST = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]

# ======================== 工具函数 ========================

def get_zodiac(month, day):
    """根据月日返回星座名称"""
    for z in ZODIAC_DATA:
        sm, sd = z["start"]
        em, ed = z["end"]
        if (month, day) >= (sm, sd) and (month, day) <= (em, ed):
            return z["name"]
    return "摩羯座"

def get_shengxiao(year):
    """根据年份返回生肖"""
    idx = (year - 4) % 12
    return SHENGXIAO_LIST[idx]

def is_valid_date(month, day):
    """简单校验日期是否合法"""
    if month < 1 or month > 12:
        return False
    days_in_month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if day < 1 or day > days_in_month[month]:
        return False
    return True

# ======================== 界面构建 ========================

class App:
    def __init__(self, root):
        self.root = root
        self.root.title("✨ 星座 & 生肖查询小程序")
        self.root.geometry("520x700")
        self.root.resizable(False, False)
        self.root.configure(bg="#f0f4ff")

        # 标题
        title_frame = tk.Frame(root, bg="#4a6cf7", height=70)
        title_frame.pack(fill=tk.X)
        title_frame.pack_propagate(False)
        tk.Label(title_frame, text="✨ 星座 & 生肖查询 ✨",
                 font=("微软雅黑", 20, "bold"), fg="white", bg="#4a6cf7").pack(expand=True)

        # ---- 查询区域 ----
        query_frame = tk.LabelFrame(root, text="  📅 请输入出生日期  ", font=("微软雅黑", 11, "bold"),
                                     bg="#f0f4ff", fg="#4a6cf7", padx=15, pady=15)
        query_frame.pack(padx=20, pady=(15, 10), fill=tk.X)

        row = tk.Frame(query_frame, bg="#f0f4ff")
        row.pack()

        tk.Label(row, text="年份:", font=("微软雅黑", 11), bg="#f0f4ff").grid(row=0, column=0, padx=5)
        self.year_var = tk.StringVar(value="2000")
        self.year_entry = tk.Entry(row, textvariable=self.year_var, width=8, font=("微软雅黑", 12),
                                    justify="center", relief="solid", bd=1)
        self.year_entry.grid(row=0, column=1, padx=5)

        tk.Label(row, text="月:", font=("微软雅黑", 11), bg="#f0f4ff").grid(row=0, column=2, padx=(15, 5))
        self.month_var = tk.StringVar(value="1")
        self.month_entry = tk.Entry(row, textvariable=self.month_var, width=4, font=("微软雅黑", 12),
                                     justify="center", relief="solid", bd=1)
        self.month_entry.grid(row=0, column=3, padx=5)

        tk.Label(row, text="日:", font=("微软雅黑", 11), bg="#f0f4ff").grid(row=0, column=4, padx=(15, 5))
        self.day_var = tk.StringVar(value="1")
        self.day_entry = tk.Entry(row, textvariable=self.day_var, width=4, font=("微软雅黑", 12),
                                   justify="center", relief="solid", bd=1)
        self.day_entry.grid(row=0, column=5, padx=5)

        # 查询按钮
        btn = tk.Button(root, text="🔍  开始查询", font=("微软雅黑", 13, "bold"),
                        bg="#4a6cf7", fg="white", activebackground="#3451b2",
                        relief="flat", cursor="hand2", padx=30, pady=8,
                        command=self.do_query)
        btn.pack(pady=10)

        # ---- 结果展示区 ----
        self.result_frame = tk.Frame(root, bg="#f0f4ff")
        self.result_frame.pack(padx=20, pady=5, fill=tk.BOTH, expand=True)

        # 星座卡片
        self.zodiac_card = tk.LabelFrame(self.result_frame, text="  ♈ 星座信息  ",
                                          font=("微软雅黑", 11, "bold"),
                                          bg="#fff8e1", fg="#f57f17", padx=15, pady=12)
        self.zodiac_card.pack(fill=tk.X, pady=(0, 8))
        self.zodiac_label = tk.Label(self.zodiac_card, text="查询后在此显示结果",
                                      font=("微软雅黑", 11), bg="#fff8e1", fg="#555",
                                      justify="left", wraplength=440)
        self.zodiac_label.pack(anchor="w")

        # 生肖卡片
        self.shengxiao_card = tk.LabelFrame(self.result_frame, text="  🐲 生肖信息  ",
                                             font=("微软雅黑", 11, "bold"),
                                             bg="#e8f5e9", fg="#2e7d32", padx=15, pady=12)
        self.shengxiao_card.pack(fill=tk.X, pady=(0, 8))
        self.shengxiao_label = tk.Label(self.shengxiao_card, text="查询后在此显示结果",
                                         font=("微软雅黑", 11), bg="#e8f5e9", fg="#555",
                                         justify="left", wraplength=440)
        self.shengxiao_label.pack(anchor="w")

        # 底部提示
        tk.Label(root, text="💡 提示：输入完整的出生年月日，点击查询即可",
                 font=("微软雅黑", 9), fg="#999", bg="#f0f4ff").pack(side="bottom", pady=5)

    def do_query(self):
        try:
            year = int(self.year_var.get())
            month = int(self.month_var.get())
            day = int(self.day_var.get())
        except ValueError:
            messagebox.showwarning("输入错误", "请输入有效的数字！")
            return

        if not is_valid_date(month, day):
            messagebox.showwarning("日期无效", f"{month}月{day}日 不是有效日期，请检查！")
            return

        if year < 1 or year > 9999:
            messagebox.showwarning("年份无效", "请输入 1~9999 之间的年份！")
            return

        # 查星座
        zodiac_name = get_zodiac(month, day)
        z = ZODIAC_INFO[zodiac_name]
        zodiac_text = (
            f"{z['emoji']}  {z['name']}（{z['en']}）\n"
            f"━━━━━━━━━━━━━━━━━━━━━━\n"
            f"🔹 元素属性：{z['element']}     🔹 守护星：{z['ruler']}\n"
            f"🔹 日期范围：{z['start'][0]}月{z['start'][1]}日 ~ {z['end'][0]}月{z['end'][1]}日\n\n"
            f"📌 性格特点：\n{z['trait']}"
        )
        self.zodiac_label.config(text=zodiac_text)

        # 查生肖
        sx_name = get_shengxiao(year)
        s = SHENGXIAO_DATA[sx_name]
        shengxiao_text = (
            f"{s['emoji']}  生肖{s['name']}（地支：{s['dizhi']}）     年份：{year}年\n"
            f"━━━━━━━━━━━━━━━━━━━━━━\n"
            f"📌 性格特点：\n{s['trait']}\n\n"
            f"💕 相合生肖：{s['match']}\n"
            f"⚠️  相冲生肖：{s['conflict']}"
        )
        self.shengxiao_label.config(text=shengxiao_text)


# ======================== 启动 ========================
if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()