Documentation
//! 奇门遁甲领域内的基础枚举:起局方法、盘式、三元、九星、八门、九神。
//!
//! 所有枚举都是 `Copy`,便于传值。`Display` 输出中文名称,与传统命名一致。
//! 评分/吉凶不在本库职责范围内 — 由调用者根据领域需求自行判断。

use std::fmt::Display;
use std::fmt::Formatter;

use tyme4rs::tyme::Culture;

/// 奇门起局方法。当前实现仅支持 `Time` (时家奇门)。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QimenMethod {
    /// 时家
    Time,
    /// 日家 (尚未实现)
    Day,
    /// 月家 (尚未实现)
    Month,
    /// 年家 (尚未实现)
    Year,
}

impl Display for QimenMethod {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(match self {
            Self::Time => "时家",
            Self::Day => "日家",
            Self::Month => "月家",
            Self::Year => "年家",
        })
    }
}

/// 奇门盘式。当前实现仅支持 `SanYuan` (三元盘)。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QimenChartType {
    /// 三元
    SanYuan,
    /// 四柱 (尚未实现)
    SiZhu,
}

impl Display for QimenChartType {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(match self {
            Self::SanYuan => "三元",
            Self::SiZhu => "四柱",
        })
    }
}

/// 三元 (上元/中元/下元)。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QimenYuan {
    /// 上元
    Upper,
    /// 中元
    Middle,
    /// 下元
    Lower,
}

impl Display for QimenYuan {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(match self {
            Self::Upper => "上元",
            Self::Middle => "中元",
            Self::Lower => "下元",
        })
    }
}

impl Culture for QimenYuan {
    fn get_name(&self) -> String { self.to_string() }
}

/// 九星 (天蓬/天芮/天冲/天辅/天禽/天心/天柱/天任/天英)。
///
/// 额外的 `QinRui` (禽芮) 是当天禽与天芮同落 2 宫时使用的合并标记。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QimenStar {
    /// 天蓬
    TianPeng,
    /// 天芮
    TianRui,
    /// 天冲
    TianChong,
    /// 天辅
    TianFu,
    /// 天禽
    TianQin,
    /// 天心
    TianXin,
    /// 天柱
    TianZhu,
    /// 天任
    TianRen,
    /// 天英
    TianYing,
    /// 禽芮 (天禽与天芮合并落 2 宫的标记)
    QinRui,
}

impl Display for QimenStar {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(match self {
            Self::TianPeng => "天蓬",
            Self::TianRui => "天芮",
            Self::TianChong => "天冲",
            Self::TianFu => "天辅",
            Self::TianQin => "天禽",
            Self::TianXin => "天心",
            Self::TianZhu => "天柱",
            Self::TianRen => "天任",
            Self::TianYing => "天英",
            Self::QinRui => "禽芮",
        })
    }
}

impl Culture for QimenStar {
    fn get_name(&self) -> String { self.to_string() }
}

impl QimenStar {
    /// 九星本位宫 (天蓬→1, 天芮→2, 天冲→3, 天辅→4, 天禽→5中, 天心→6, 天柱→7, 天任→8, 天英→9; 禽芮合并寄 2)。
    pub const fn home_palace(self) -> u8 {
        match self {
            Self::TianPeng => 1,
            Self::TianRui | Self::QinRui => 2,
            Self::TianChong => 3,
            Self::TianFu => 4,
            Self::TianQin => 5,
            Self::TianXin => 6,
            Self::TianZhu => 7,
            Self::TianRen => 8,
            Self::TianYing => 9,
        }
    }

    /// 由九宫宫位号取该宫本位星 (越界返回 [`None`])。
    pub const fn from_palace(palace: u8) -> Option<Self> {
        match palace {
            1 => Some(Self::TianPeng),
            2 => Some(Self::TianRui),
            3 => Some(Self::TianChong),
            4 => Some(Self::TianFu),
            5 => Some(Self::TianQin),
            6 => Some(Self::TianXin),
            7 => Some(Self::TianZhu),
            8 => Some(Self::TianRen),
            9 => Some(Self::TianYing),
            _ => None,
        }
    }
}

/// 八门 (休/生/伤/杜/景/死/惊/开)。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QimenDoor {
    /// 休门
    Rest,
    /// 生门
    Life,
    /// 伤门
    Hurt,
    /// 杜门
    Block,
    /// 景门
    View,
    /// 死门
    Death,
    /// 惊门
    Fear,
    /// 开门
    Open,
}

impl Display for QimenDoor {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(match self {
            Self::Rest => "休门",
            Self::Life => "生门",
            Self::Hurt => "伤门",
            Self::Block => "杜门",
            Self::View => "景门",
            Self::Death => "死门",
            Self::Fear => "惊门",
            Self::Open => "开门",
        })
    }
}

impl Culture for QimenDoor {
    fn get_name(&self) -> String { self.to_string() }
}

impl QimenDoor {
    /// 八门本位宫 (休→1坎, 生→8艮, 伤→3震, 杜→4巽, 景→9离, 死→2坤, 惊→7兑, 开→6乾)。
    ///
    /// 八门各落本位八卦宫,这是奇门起卦/反查的基础。
    pub const fn home_palace(self) -> u8 {
        match self {
            Self::Rest => 1,
            Self::Death => 2,
            Self::Hurt => 3,
            Self::Block => 4,
            Self::View => 9,
            Self::Open => 6,
            Self::Fear => 7,
            Self::Life => 8,
        }
    }

    /// 由九宫宫位号取该宫本位门 (中宫 5 无门返回 [`None`])。
    pub const fn from_palace(palace: u8) -> Option<Self> {
        match palace {
            1 => Some(Self::Rest),
            2 => Some(Self::Death),
            3 => Some(Self::Hurt),
            4 => Some(Self::Block),
            6 => Some(Self::Open),
            7 => Some(Self::Fear),
            8 => Some(Self::Life),
            9 => Some(Self::View),
            _ => None,
        }
    }
}

/// 九神 (值符/腾蛇/太阴/六合/白虎/玄武/九地/九天)。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QimenGod {
    /// 值符
    ZhiFu,
    /// 腾蛇
    TengShe,
    /// 太阴
    TaiYin,
    /// 六合
    LiuHe,
    /// 白虎
    BaiHu,
    /// 玄武
    XuanWu,
    /// 九地
    JiuDi,
    /// 九天
    JiuTian,
}

impl Display for QimenGod {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(match self {
            Self::ZhiFu => "值符",
            Self::TengShe => "腾蛇",
            Self::TaiYin => "太阴",
            Self::LiuHe => "六合",
            Self::BaiHu => "白虎",
            Self::XuanWu => "玄武",
            Self::JiuDi => "九地",
            Self::JiuTian => "九天",
        })
    }
}

impl Culture for QimenGod {
    fn get_name(&self) -> String { self.to_string() }
}