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

# ========== 基础干支、时辰、五行数据 ==========
tian_gan = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
di_zhi = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
shi_chen_list = [("23",0,"子时"),("1",1,"丑时"),("3",2,"寅时"),("5",3,"卯时"),
                 ("7",4,"辰时"),("9",5,"巳时"),("11",6,"午时"),("13",7,"未时"),
                 ("15",8,"申时"),("17",9,"酉时"),("19",10,"戌时"),("21",11,"亥时")]

# 天干地支对应五行
gan_wuxing = {"甲":"木","乙":"木","丙":"火","丁":"火","戊":"土","己":"土","庚":"金","辛":"金","壬":"水","癸":"水"}
zhi_wuxing = {"子":"水","丑":"土","寅":"木","卯":"木","辰":"土","巳":"火","午":"火","未":"土","申":"金","酉":"金","戌":"土","亥":"水"}

# 星座数据 (月,日),名称,简介
constellation_data = [
    ((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_name = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
zodiac_desc = {
    "鼠":"聪慧机敏，适应力强，心思灵巧",
    "牛":"勤恳踏实，忍耐力强，为人忠厚",
    "虎":"自信豪爽，胆识过人，爱打抱不平",
    "兔":"温和文静，心思缜密，待人谦和",
    "龙":"志向高远，气度不凡，天生自带魄力",
    "蛇":"冷静睿智，直觉敏锐，做事深藏不露",
    "马":"热情奔放，热爱闯荡，崇尚无拘无束",
    "羊":"善良温顺，性情柔和，富有同理心",
    "猴":"活泼机灵，头脑灵活，创意层出不穷",
    "鸡":"精明要强，做事勤勉，善于打理琐事",
    "狗":"忠诚正直，重情重义，有很强的正义感",
    "猪":"豁达随和，心地纯良，懂得享受生活"
}

# 五行运势评语
wx_comment = {
    "木":"【木旺】性情仁厚、上进心强；适宜文创、教育、园林行业；需要收敛执拗脾气",
    "火":"【火旺】待人热忱、表现力出众；适合新媒体、餐饮、光电行业；切忌急躁冲动",
    "土":"【土旺】忠厚守信、包容心强；适合地产、仓储、农牧业；遇事不要太过保守",
    "金":"【金旺】决断果敢、讲义气；适合五金军警金融行业；减少固执强硬",
    "水":"【水旺】思维灵巧、洞察过人；适合物流贸易、水产、策划；防止情绪敏感多疑"
}

# ========== 核心计算函数 ==========
def get_year_gz(y):
    offset = y - 4
    g = offset % 10
    z = offset % 12
    return tian_gan[g],di_zhi[z]

def get_month_gz(yearGanIdx,month):
    # 年上起月法
    base = (yearGanIdx * 2 + 2) %10
    mg = (base + month -1) %10
    mz = (month+1) %12
    return tian_gan[mg],di_zhi[mz]

def get_day_gz(y,m,d):
    dt = datetime(y,m,d)
    days = dt.toordinal()
    gzIndex = (days - 11) %60
    return tian_gan[gzIndex%10],di_zhi[gzIndex%12]

def get_shichen(hour,dayGanIdx):
    # 日上起时
    h = int(hour)
    idx=0
    for s_h,i,name in shi_chen_list:
        if h >= int(s_h) or (h==0 and int(s_h)==23):
            idx=i
            break
    shi_gan = (dayGanIdx*2 + idx) % 10
    return tian_gan[shi_gan],di_zhi[idx],shi_chen_list[idx][2]

# ====修复后的星座判断函数====
def get_constellation(month, day):
    date_list = [item[0] for item in constellation_data]
    for index, (m,d) in enumerate(date_list):
        next_m,next_d = date_list[(index+1)%12]
        if month == m and day >= d:
            return constellation_data[index][1], constellation_data[index][2]
        if month == next_m and day < next_d:
            return constellation_data[index][1], constellation_data[index][2]
    return "摩羯座", "隐忍上进，吃苦耐劳，成熟稳重，拥有长远眼光"

def get_zodiac(year):
    idx = (year - 4) % 12
    name = zodiac_name[idx]
    return name, zodiac_desc[name]

# 主查询
def search_all():
    try:
        y = int(e_year.get())
        m = int(e_month.get())
        d = int(e_day.get())
        hh = int(e_hour.get())
        if not (1<=m<=12 and 1<=d<=31 and 0<=hh<=23):
            res.delete(1.0,tk.END)
            res.insert(tk.END,"❌ 时间输入非法！小时范围0‑23")
            return
        #四柱
        yg,yz = get_year_gz(y)
        yearGanIndex = tian_gan.index(yg)
        mg,mz = get_month_gz(yearGanIndex,m)
        dg,dz = get_day_gz(y,m,d)
        dayGanIndex = tian_gan.index(dg)
        sg,sz,sc_name = get_shichen(hh,dayGanIndex)
        bazi = f"{yg}{yz}  {mg}{mz}  {dg}{dz}  {sg}{sz}"
        #五行统计
        wx_count = {"木":0,"火":0,"土":0,"金":0,"水":0}
        all_gans = [yg,mg,dg,sg]
        all_zhis = [yz,mz,dz,sz]
        for g in all_gans:
            wx_count[gan_wuxing[g]] +=1
        for z in all_zhis:
            wx_count[zhi_wuxing[z]] +=1
        max_val = max(wx_count.values())
        wang_list = [k for k,v in wx_count.items() if v==max_val]
        #星座生肖
        star_name,star_info = get_constellation(m,d)
        sx_name,sx_info = get_zodiac(y)

        #运势文本
        out_text = f"""
—————— 古风生辰完整命盘 ——————
公历生辰：{y}年{m}月{d}日  {hh}时
对应时辰：{sc_name}

【生辰八字 · 四柱】
年柱：{yg}{yz}
月柱：{mg}{mz}
日柱：{dg}{dz}
时柱：{sg}{sz}
完整八字：{bazi}

【生肖信息】
生肖：{sx_name}｜解析：{sx_info}

【星座信息】
星座：{star_name}｜解析：{star_info}

【八字五行统计(干支合计)】
木：{wx_count["木"]}
火：{wx_count["火"]}
土：{wx_count["土"]}
金：{wx_count["金"]}
水：{wx_count["水"]}

▶ 本命最旺盛五行：{"、".join(wang_list)}
"""
        for w in wang_list:
            out_text += "\n"+wx_comment[w]

        #综合运势
        out_text+="""
—————— 分项简易运势参考 ——————
【性格】由日干决定，主先天本性；
【事业】月柱代表青年学业职场，适合顺着自己旺相五行择业；
【财运】金、土代表财气，土厚稳重、金足善抓机遇；
【感情】水火主情缘；水多细腻多情，火旺待人热忱；
【健康】木主肝胆、火主心脉、土主脾胃、金主肺呼吸道、水主肾脏泌尿；
【五行喜忌】
木缺宜亲近绿植、东方方位；
火缺多阳光、暖色环境；
土缺适宜山地、黄色物件；
金缺多金属饰品、西边方位；
水缺适宜近水、黑色蓝色色系。

温馨提示：八字仅传统民俗娱乐参考，命运掌握于自身选择与努力。
        """
        res.delete(1.0,tk.END)
        res.insert(tk.END,out_text)
    except ValueError:
        res.delete(1.0,tk.END)
        res.insert(tk.END,"❌ 全部输入必须为整数数字！")

def clear():
    e_year.delete(0,tk.END)
    e_month.delete(0,tk.END)
    e_day.delete(0,tk.END)
    e_hour.delete(0,tk.END)
    res.delete(1.0,tk.END)

# ========== GUI古风界面 ==========
root = tk.Tk()
root.title("国风生辰命盘｜八字五行星座生肖查询")
root.geometry("620x520")
bg_color = "#f3e8d2"
btn_color = "#8b4513"
text_color = "#3b2415"
root.configure(bg=bg_color)

tk.Label(root,text="▷ 四柱八字·五行运势查询 ◁",font=("SimHei",20),bg=bg_color,fg="#602c10").pack(pady=12)
frame_in = tk.Frame(root,bg=bg_color)
frame_in.pack(pady=6)

tk.Label(frame_in,text="出生年",font=("SimHei",11),bg=bg_color,fg=text_color).grid(row=0,column=0,padx=5)
e_year = ttk.Entry(frame_in,width=7,font=("SimHei",11))
e_year.grid(row=0,column=1,padx=4)

tk.Label(frame_in,text="月",font=("SimHei",11),bg=bg_color,fg=text_color).grid(row=0,column=2,padx=5)
e_month = ttk.Entry(frame_in,width=4,font=("SimHei",11))
e_month.grid(row=0,column=3,padx=4)

tk.Label(frame_in,text="日",font=("SimHei",11),bg=bg_color,fg=text_color).grid(row=0,column=4,padx=5)
e_day = ttk.Entry(frame_in,width=4,font=("SimHei",11))
e_day.grid(row=0,column=5,padx=4)

tk.Label(frame_in,text="时刻(0‑23)",font=("SimHei",11),bg=bg_color,fg=text_color).grid(row=0,column=6,padx=5)
e_hour = ttk.Entry(frame_in,width=5,font=("SimHei",11))
e_hour.grid(row=0,column=7,padx=4)

frame_btn = tk.Frame(root,bg=bg_color)
frame_btn.pack(pady=10)
tk.Button(frame_btn,text="开启命盘测算",command=search_all,font=("SimHei",11),bg=btn_color,fg="white",width=14,relief="flat").grid(row=0,column=0,padx=12)
tk.Button(frame_btn,text="清空全部",command=clear,font=("SimHei",11),bg="#a05a2c",fg="white",width=14,relief="flat").grid(row=0,column=1,padx=12)

res = scrolledtext.ScrolledText(root,width=70,height=20,font=("SimHei",10),bg="#fff8ec",fg=text_color)
res.pack(pady=8)

root.mainloop()
