use crate::core::model::bureau::FiveElementBureau;
use crate::core::model::calendar::Gender;
use crate::core::model::ganzhi::{EarthlyBranch, HeavenlyStem};
pub(crate) const fn kui_yue_branches(stem: HeavenlyStem) -> (EarthlyBranch, EarthlyBranch) {
match stem {
HeavenlyStem::Jia | HeavenlyStem::Wu | HeavenlyStem::Geng => {
(EarthlyBranch::Chou, EarthlyBranch::Wei)
}
HeavenlyStem::Yi | HeavenlyStem::Ji => (EarthlyBranch::Zi, EarthlyBranch::Shen),
HeavenlyStem::Xin => (EarthlyBranch::Wu, EarthlyBranch::Yin),
HeavenlyStem::Bing | HeavenlyStem::Ding => (EarthlyBranch::Hai, EarthlyBranch::You),
HeavenlyStem::Ren | HeavenlyStem::Gui => (EarthlyBranch::Mao, EarthlyBranch::Si),
}
}
pub(crate) fn lu_yang_tuo_ma_branches(
stem: HeavenlyStem,
branch: EarthlyBranch,
) -> (EarthlyBranch, EarthlyBranch, EarthlyBranch, EarthlyBranch) {
let lu = match stem {
HeavenlyStem::Jia => EarthlyBranch::Yin,
HeavenlyStem::Yi => EarthlyBranch::Mao,
HeavenlyStem::Bing | HeavenlyStem::Wu => EarthlyBranch::Si,
HeavenlyStem::Ding | HeavenlyStem::Ji => EarthlyBranch::Wu,
HeavenlyStem::Geng => EarthlyBranch::Shen,
HeavenlyStem::Xin => EarthlyBranch::You,
HeavenlyStem::Ren => EarthlyBranch::Hai,
HeavenlyStem::Gui => EarthlyBranch::Zi,
};
let ma = match branch {
EarthlyBranch::Yin | EarthlyBranch::Wu | EarthlyBranch::Xu => EarthlyBranch::Shen,
EarthlyBranch::Shen | EarthlyBranch::Zi | EarthlyBranch::Chen => EarthlyBranch::Yin,
EarthlyBranch::Si | EarthlyBranch::You | EarthlyBranch::Chou => EarthlyBranch::Hai,
EarthlyBranch::Hai | EarthlyBranch::Mao | EarthlyBranch::Wei => EarthlyBranch::Si,
};
(lu, lu.offset(1), lu.offset(-1), ma)
}
pub(crate) const fn chang_qu_branches_by_stem(
stem: HeavenlyStem,
) -> (EarthlyBranch, EarthlyBranch) {
match stem {
HeavenlyStem::Jia => (EarthlyBranch::Si, EarthlyBranch::You),
HeavenlyStem::Yi => (EarthlyBranch::Wu, EarthlyBranch::Shen),
HeavenlyStem::Bing | HeavenlyStem::Wu => (EarthlyBranch::Shen, EarthlyBranch::Wu),
HeavenlyStem::Ding | HeavenlyStem::Ji => (EarthlyBranch::You, EarthlyBranch::Si),
HeavenlyStem::Geng => (EarthlyBranch::Hai, EarthlyBranch::Mao),
HeavenlyStem::Xin => (EarthlyBranch::Zi, EarthlyBranch::Yin),
HeavenlyStem::Ren => (EarthlyBranch::Yin, EarthlyBranch::Zi),
HeavenlyStem::Gui => (EarthlyBranch::Mao, EarthlyBranch::Hai),
}
}
pub(crate) fn luan_xi_branches(branch: EarthlyBranch) -> (EarthlyBranch, EarthlyBranch) {
let hong_luan = EarthlyBranch::Mao.offset(-(branch.index() as isize));
(hong_luan, hong_luan.offset(6))
}
pub(crate) fn nian_jie_branch(year_branch: EarthlyBranch) -> EarthlyBranch {
const NIAN_JIE_BY_YEAR_BRANCH: [EarthlyBranch; 12] = [
EarthlyBranch::Xu,
EarthlyBranch::You,
EarthlyBranch::Shen,
EarthlyBranch::Wei,
EarthlyBranch::Wu,
EarthlyBranch::Si,
EarthlyBranch::Chen,
EarthlyBranch::Mao,
EarthlyBranch::Yin,
EarthlyBranch::Chou,
EarthlyBranch::Zi,
EarthlyBranch::Hai,
];
NIAN_JIE_BY_YEAR_BRANCH[year_branch.index()]
}
pub(crate) const fn changsheng_start_branch(bureau: FiveElementBureau) -> EarthlyBranch {
match bureau {
FiveElementBureau::Water2 => EarthlyBranch::Shen,
FiveElementBureau::Wood3 => EarthlyBranch::Hai,
FiveElementBureau::Metal4 => EarthlyBranch::Si,
FiveElementBureau::Earth5 => EarthlyBranch::Shen,
FiveElementBureau::Fire6 => EarthlyBranch::Yin,
}
}
pub(crate) fn twelve_god_direction_forward(gender: Gender, year_branch: EarthlyBranch) -> bool {
let branch_yang = year_branch.index() % 2 == 0;
let gender_yang = matches!(gender, Gender::Male);
branch_yang == gender_yang
}