use serde::{Deserialize, Serialize};
use crate::core::pattern::relation::PalaceRelation;
use crate::core::{EarthlyBranch, Mutagen, Scope, StarName};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternId {
ZiFuChaoYuan,
JiYueTongLiang,
YangTuoJiaJi,
LingChangTuoWu,
ZuoYouJiaMing,
ChangQuJiaMing,
RiYueBingMing,
RiYueFanBei,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternFamily {
MajorStarCombination,
AuxiliaryStarCombination,
Mutagen,
SanFangSiZheng,
ShaJi,
Temporal,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternPolarity {
Auspicious,
Inauspicious,
Mixed,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternStatus {
Fulfilled,
Partial,
Weakened,
Broken,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternStrength {
Weak,
Medium,
Strong,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternScope {
Natal,
Decadal,
Age,
Yearly,
Monthly,
Daily,
Hourly,
Combined(Vec<Scope>),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternAnchor {
Palace(EarthlyBranch),
Star(StarName),
Mutagen(Mutagen),
Chart,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternEvidence {
StarInPalace {
star: StarName,
branch: EarthlyBranch,
},
StarInPalaceRelation {
star: StarName,
anchor: EarthlyBranch,
branch: EarthlyBranch,
relation: PalaceRelation,
},
StarsInSamePalace {
stars: Vec<StarName>,
branch: EarthlyBranch,
},
StarsInSanFangSiZheng {
stars: Vec<StarName>,
anchor: EarthlyBranch,
branches: Vec<EarthlyBranch>,
},
MutagenOnStar {
star: StarName,
mutagen: Mutagen,
scope: Scope,
branch: EarthlyBranch,
},
PalaceRelation {
from: EarthlyBranch,
to: EarthlyBranch,
relation: PalaceRelation,
},
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PatternCondition {
RequiresStar {
star: StarName,
},
RequiresStarInPalace {
star: StarName,
branch: EarthlyBranch,
},
RequiresStarInRelation {
star: StarName,
anchor: EarthlyBranch,
relation: PalaceRelation,
},
RequiresMutagen {
star: StarName,
mutagen: Mutagen,
},
WeakenedByStar {
star: StarName,
branch: EarthlyBranch,
},
BrokenByStar {
star: StarName,
branch: EarthlyBranch,
},
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct PatternDetection {
pub id: PatternId,
pub name_zh: &'static str,
pub family: PatternFamily,
pub polarity: PatternPolarity,
pub status: PatternStatus,
pub strength: PatternStrength,
pub scope: PatternScope,
pub anchor: PatternAnchor,
pub involved_palaces: Vec<EarthlyBranch>,
pub involved_stars: Vec<StarName>,
pub involved_mutagens: Vec<Mutagen>,
pub evidence: Vec<PatternEvidence>,
pub missing_conditions: Vec<PatternCondition>,
pub weakening_factors: Vec<PatternCondition>,
pub breaking_factors: Vec<PatternCondition>,
}