Documentation
//! 长生十二宫
//!
//! 长生十二宫:长生、沐浴、冠带、临官、帝旺、衰、病、死、墓、绝、胎、养。
//!
//! [`tyme4rs::tyme::culture::Terrain`] 通过 [`Auspicious`] trait 接入本库,
//! 与 [`crate::Pattern`] / [`crate::Hexagram`] / [`crate::ShenSha`] 共享一致接口。
//!
//! 用法:
//!
//! ```no_run
//! use qimen::{Auspicious, SolarTimeQimenExt};
//! use tyme4rs::tyme::solar::SolarTime;
//!
//! let qimen = SolarTime::from_ymd_hms(2026, 1, 14, 18, 45, 0).qimen();
//! for palace in qimen.palaces() {
//!     if let Some(t) = palace.terrain() {
//!         println!("{}宫 {} [{}] {}", palace.number(), t.name(), t.auspice(), t.summary());
//!     }
//! }
//! ```

use tyme4rs::tyme::culture::Terrain;

use crate::auspice::Auspice;
use crate::auspice::Auspicious;

/// 12 宫静态名称 (索引 0..12 对应:长生、沐浴、冠带、临官、帝旺、衰、病、死、墓、绝、胎、养)。
const TERRAIN_NAME: [&str; 12] = ["长生", "沐浴", "冠带", "临官", "帝旺", "", "", "", "", "", "", ""];

/// 12 宫吉凶查表。
const TERRAIN_AUSPICE: [Auspice; 12] = [
    Auspice::Auspicious,        // 0  长生
    Auspice::Neutral,           // 1  沐浴
    Auspice::Auspicious,        // 2  冠带
    Auspice::Auspicious,        // 3  临官
    Auspice::GreatAuspicious,   // 4  帝旺
    Auspice::Neutral,           // 5  衰
    Auspice::Inauspicious,      // 6  病
    Auspice::GreatInauspicious, // 7  死
    Auspice::Inauspicious,      // 8  墓
    Auspice::GreatInauspicious, // 9  绝
    Auspice::Neutral,           // 10 胎
    Auspice::Auspicious,        // 11 养
];

/// 12 宫客观 summary 查表。
const TERRAIN_SUMMARY: [&str; 12] = [
    "长生十二宫之首。万物初生之态,如人之出生,充满生机与希望。",
    "长生十二宫第二位。又名\"桃花\",如人初生后沐浴净身,象征不稳定与桃花。",
    "长生十二宫第三位。如人成年加冠,开始走向社会,代表成长、自信。",
    "长生十二宫第四位。又名\"\",如人入仕做官,代表壮年、权力。",
    "长生十二宫第五位。五行力量巅峰,如帝王之旺,极盛之态。盛极必衰。",
    "长生十二宫第六位。帝旺之后力量开始衰退,如人步入中年体力下降。",
    "长生十二宫第七位。力量进一步衰弱,如人生病,需休养调理。",
    "长生十二宫第八位。万物气绝,如人之死亡,代表终结与静止。",
    "长生十二宫第九位。又名\"\",如人入土归葬,代表收藏、积蓄、隐藏。",
    "长生十二宫第十位。万物气息断绝,旧形全消,但蕴含新生的转机。",
    "长生十二宫第十一位。新生命在母体中孕育,代表新计划、新希望的萌芽。",
    "长生十二宫第十二位。胎儿在母体中成长发育,即将出世,代表蓄养、培育。",
];

/// `Terrain` 的吉凶定性 (5 级):
///
/// - 长生 / 冠带 / 临官 / 养 → 吉
/// - 帝旺 → 大吉 (五行巅峰)
/// - 沐浴 / 衰 / 胎 → 中和
/// - 病 / 墓 → 凶
/// - 死 / 绝 → 大凶
impl Auspicious for Terrain {
    fn name(&self) -> &'static str { TERRAIN_NAME.get(self.get_index()).copied().unwrap_or("") }

    fn summary(&self) -> &'static str { TERRAIN_SUMMARY.get(self.get_index()).copied().unwrap_or("") }

    fn auspice(&self) -> Auspice { TERRAIN_AUSPICE.get(self.get_index()).copied().unwrap_or(Auspice::Neutral) }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn auspice_for_each_position() {
        assert_eq!(Terrain::from_name("长生").auspice(), Auspice::Auspicious);
        assert_eq!(Terrain::from_name("沐浴").auspice(), Auspice::Neutral);
        assert_eq!(Terrain::from_name("冠带").auspice(), Auspice::Auspicious);
        assert_eq!(Terrain::from_name("临官").auspice(), Auspice::Auspicious);
        assert_eq!(Terrain::from_name("帝旺").auspice(), Auspice::GreatAuspicious);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::Neutral);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::Inauspicious);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::GreatInauspicious);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::Inauspicious);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::GreatInauspicious);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::Neutral);
        assert_eq!(Terrain::from_name("").auspice(), Auspice::Auspicious);
    }

    #[test]
    fn name_and_summary_non_empty_for_all_12() {
        for i in 0..12 {
            let t = Terrain::from_index(i);
            assert!(!t.name().is_empty(), "name missing for index {i}");
            assert!(!t.summary().is_empty(), "summary missing for index {i}");
        }
    }
}