#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#author:Wos
#天干地支五运六气计算脚本
from datetime import date,datetime
import sys


h = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
e = ['寅','卯','辰','巳','午','未','申','酉','戌','亥','子','丑']
e_ = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥','子']


#将时间转换成时辰
def shichen():
    now = int(datetime.now().strftime('%H'))
    if int(now) % 2 == 1:
        print("当前时辰:"+e_[int((int(now)+1)/2)]+"时")
    else:
        print("当前时辰:"+e_[int(int(now)/2)]+"时")


#五运六气相关数据
wuxing=['木(风)','火(热)','土(湿)','金(燥)','水(寒)']
tiangan={'甲己':'土(湿)','乙庚':'金(燥)','丙辛':'水(寒)','丁壬':'木(风)','戊癸':'火(热)'}
dizhi={'亥巳':'厥阴风木(风)','子午':'少阴君火(热)','丑未':'太阴湿土(湿)','寅申':'少阳相火(暑)','卯酉':'阳明燥金(燥)','辰戌':'太阳寒水(寒)'}
dizhi2={'亥巳':'厥阴风木(风)','子午':'少阴君火(热)','寅申':'少阳相火(暑)','丑未':'太阴湿土(湿)','卯酉':'阳明燥金(燥)','辰戌':'太阳寒水(寒)'}

wuyunshijian='''
         1/21~4/4   4/4~6/16   6/16~8/28  8/28~11/9  11/9~1/21  
'''

liuqishijian='''
         1/21~3/21    3/21~5/21    5/21~7/23    7/23~9/23    9/23~11/23   11/23~1/21
'''


#六十干支常数
sixtyJiazi={'甲子甲午':'热化二,雨化五,燥化四。上咸寒,中苦热,下酸热',
'乙丑乙未':'热化寒化胜复同。灾七宫,湿化五,清化四,寒化六。上苦热,中酸和,下甘热',
'丙寅丙申':'火化二,寒化六,风化三。上成寒,中咸温,下辛温',
'丁卯丁酉':'清化热化胜复同。灾三宫,燥化九,风化三,热化七。上苦小温,中辛和,下咸寒',
'戊辰戊戌':'寒化六,热化七,湿化五。上苦温,中甘和,下甘温',
'己巳己亥':'风化清化胜复同,灾五宫,风化三,湿化五,火化七。上辛凉,中甘和,下咸寒',
'庚午庚子':'热化七,清化九,燥化九,上咸寒,中辛温,下酸温',
'辛未辛丑':'雨化风化胜复同。灾一宫。雨化五,寒化一,上苦热,中苦和,下苦热',
'壬申壬寅':'火化二,风化八。上咸寒,中酸和,下辛凉',
'癸酉癸卯':'寒化雨化胜复同。灾九宫。燥化九,热化二,上苦小温,中咸温,下咸寒',
'甲戌甲辰':'寒化六,湿化五。上苦热,中苦温,下苦温',
'乙亥乙巳':'热化寒化胜复同。灾七宫,风化八,清化四,火化二。上辛凉,中酸和,下咸寒',
'丙子 丙午':'热化二,寒化六,清化四。上威寒,中咸热,下酸温',
'丁丑丁未':'清化热化胜复同。灾三宫。雨化五,风化三,寒化一。上苦温,中辛温,下甘热',
'戊寅戊申':'火化七,风化三。上咸寒,中甘和,下辛凉',
'己卯已酉':'风化清佔胜复同。灾五宫。清化九,雨化五,热化七。上苦小温,中甘和,下成寒',
'庚辰庚戌':'寒化一,清化九,雨化五。上苦热,中辛温,下甘热',
'辛巳辛亥':'雨化风化胜复同。灾一宫。风化三,寒化一,火化七。上辛凉,中苦和,下成寒',
'壬午壬子':'热化二,风化八,清化四。上咸寒,中酸凉,下酸温',
'癸未癸丑':'寒化雨化胜复同。灾九宫。雨化五,火化二,寒化一。上苦温,中咸温,下甘热',
'甲申甲寅':'火化二,雨化五,风化八。上咸寒,中咸和,下辛凉',
'乙酉乙卯':'热化寒化胜复同。灾七官。燥化四,清化四,热化二。上苦小温,中苦和,下咸寒',
'丙戌丙辰':'寒化六,雨化五。上苦热,中咸温,下甘熱',
'丁亥丁巳':'清化热化胜复同。灾三宫。风化三,火化七。上辛凉,中辛和,下咸寒',
'戊子戊午':'热化七,清化九。上咸寒,中甘寒,下酸温',
'己丑己未':'风化清化胜复同。灾五宫,雨化五,寒化一。上苦熱,中甘和,下甘熟',
'庚寅庚申':'火化七,清化九,风化三。上咸寒,中辛温,下辛凉',
'辛卯辛酉':'雨化风化胜复同。灾一宫。清化九,寒化一,热化七。上苦小温,中苦和,下咸寒',
'壬辰壬戌':'寒化六,风化八,雨化五。上苦温,中酸和,下甘温',
'癸巳癸亥':'寒化雨化胜复同。灾九宫。风化八,火化二。上辛凉,中咸和,下咸寒'}


hentuluoshu = '''
==========================================================
                 (偶数为阴,奇数为阳) 
       河图                            洛书    

        27                              南 
                              4         9          2
83     105       49         东3         5          7 西
                              8         1          6
        61                              北 

==========================================================         
      先天八卦                      后天八卦

兑2     乾1     巽5           巽4     离9     坤2

离3     中      坎6           震3     中5     兑7

震4     坤8     艮7           艮8     坎1     乾6
==========================================================
   五行方位图                         季节(农历)

木    火     土                       夏(4~6月)

木    土     金         春(1~4月)     长夏(6~8月)    秋(8~11月)

土    水     金                       冬(11~次1月)
==========================================================
     五行生克图
木 x 土 x 水 x 火 x 金
木 > 火 > 土 > 金 > 水
========================================================================================================
                  十二经纳地支                                        十二经纳天干


       巳(脾)    午(心)   未(小)    申(膀)                            丙(小)丁(心)


 太阳> 辰(胃)                       酉(肾)          甲(肝)乙(胆 )     戊(胃)己(脾)         庚(大)辛(肺)


 阳明> 卯(大)                       戌(心包)                      壬(膀,三焦)癸(肾,心包)


       寅(肺)    丑(肝)   子(胆)    亥(焦)
        ^        ^        ^         ^
       少阳      太阴     少阴      厥阴

========================================================================================================

                                  一阴      二阴      三阴
                                 (巳亥)    (子午)    (丑未)
                       (先)司天|厥阴风木->少阴君火->太阴湿土   
                            ||
                       (后)在泉|少阳相火->阳明燥金->太阳寒水
                                 (寅申)    (卯酉)    (辰戌)
                                  一阳      二阳      三阳

      先由地支确定司天,在泉选择其阴阳的对立面,即一阴对一阳,二阴对二阳,三阴对三阳

========================================================================================================
                                天干地支的计算

                 4    5    6    7    8    9    0    1    2    3
                '甲','乙','丙','丁','戊','己','庚','辛','壬','癸'

                根据年尾数找天干,比如1991年,尾数为1,所以天干为辛

             1    2    3    4    5    6    7    8    9    10   11   12
            '寅','卯','辰','巳','午','未','申','酉','戌','亥','子','丑'

     地支的计算公式 (年份+7)%12,如果余数为0,则地支为丑,否则就是余数对应的位置
                    比如1991年的地支  (1991+7)%12=6,所以是未

========================================================================================================
'''


#将年份转换成干支 
def hefs(year):
    if year == "":
        year = date.today().strftime("%Y")
    rd = (int(year)%10)
    h_year = h[rd-3-1] #天干
    rd_2 = (int(year)+7)%12
    dz = "" #地支 
    ganzhi = ""#干支
    if rd_2 == 0:
        dz = str(e[11])
        ganzhi = str(h_year)+str(e[11]) 
        print("目标:"+str(h_year)+str(e[11])+"年")
    elif rd_2 != 0:
        dz = str(e[rd_2-1])
        ganzhi = str(h_year)+str(e[rd_2-1])
        print("目标:"+str(h_year)+str(e[rd_2-1])+"年")

    #根据天干获取岁运
    idx = 0
    suiyun = ""
    print(hentuluoshu,end="")
    print("                  五运六气\n")
    for key,value in sixtyJiazi.items():
        if str(ganzhi) in str(key):
            print("常数:"+str(value))
            break

    for k in tiangan:
        if str(h_year) in str(k):
            for j in h:
                if str(h_year) == j:
                    idx = h.index(j)%2
            if idx == 0:
                suiyun = tiangan[k]
                print("\n中运:"+tiangan[k]+"(太)")
            else:
                suiyun = tiangan[k]
                print("\n中运:"+tiangan[k]+"(少)")

    #主运计算
    idx_ = idx #备份
    print(wuyunshijian,end="")
    #客运计算,天运,变动
    wuxing_ = []
    for k in wuxing:
        if str(suiyun) == k:
            wuxing_ = wuxing[wuxing.index(k):]+wuxing[:wuxing.index(k)]
    print("客运(天):",end="")
    idx_ = idx #备份
    for k in wuxing_:
        if wuxing_.index(k) == 0:
            if idx == 0:
                print(str(k)+"(太)",end="")
                idx = 1
            else:
                print(str(k)+"(少)",end="")
                idx = 0
        else:
            if idx == 0:
                print(" "+str(k)+"(太)",end="")
                idx = 1
            else:
                print(" "+str(k)+"(少)",end="")
                idx = 0
    idx = idx_ #还原
    #主运,地运 不变
    print("\n主运(地):",end="")
    for k in wuxing:
        if wuxing.index(k) == 0:
            if idx == 0:
                print(str(k),end="")
                idx = 1
            else:
                print(str(k),end="")
                idx = 0
        else:
            if idx == 0:
                print("     "+str(k),end="")
                idx = 1
            else:
                print("     "+str(k),end="")
                idx = 0            

    idx = idx_ #还原

    #六气的计算 
    #司天 上半年 天气
    #在泉 下半年 地气
    dizhi_ = []
    sitian = "" #司天,是客气的第三个
    print("\n--------------------------------------------------------------------------------")
    for k in dizhi:
        dizhi_.append(dizhi[k])
    for k in dizhi:
        if str(dz) in str(k):
            sitian = dizhi[k]
            print("\n司天(上):"+dizhi[k])
            for j in dizhi_:
                if dizhi[k] == j:
                    idx = dizhi_.index(j)
                    print("在泉(下):"+dizhi_[(3+idx)%6])
    #主气
    dizhi2_ = []
    print(liuqishijian,end="")
    for k in dizhi2:
        dizhi2_.append(dizhi2[k])
    #客气
    print("客气(天):",end="")
    keqi = []
    for j in dizhi_:
        if str(sitian) == j:
            idx = dizhi_.index(j)-2
            keqi = dizhi_[idx:]+dizhi_[:idx]
    for k in keqi:
        if keqi.index(k) == 0:
            print(k,end="")
        else:
            print(","+k,end="")
    print("\n主气(地):",end="")
    for k in dizhi2_:
        if dizhi2_.index(k) == 0:
            print(k,end="")
        else:
            print(","+k,end="")
    print("\n")








if __name__ == "__main__":

    try:
        year = sys.argv[1]
        shichen()
        hefs(year)
    except:
        print("eg. python hefs.py 2023|less")