import '../models/divination_params.dart'; import '../models/divination_result.dart'; class DivinationResultBuilder { DivinationResultData build({ required DivinationParams params, required List yaoStates, }) { final binaryCode = params.toBinary(yaoStates); final changedBinaryCode = params.toChangedBinary(yaoStates); final baseHexagram = _hexagramMap[binaryCode]; final changedHexagram = _hexagramMap[changedBinaryCode]; if (baseHexagram == null || changedHexagram == null) { throw StateError( 'Unknown hexagram mapping for binary=$binaryCode changed=$changedBinaryCode', ); } final signType = _signByStates(yaoStates); final content = _mockContent( params.questionType, params.question, signType, ); final lineData = _buildYaoLines(yaoStates, false); final targetStates = _toChangedStates(yaoStates); final targetLineData = _buildYaoLines(targetStates, true); return DivinationResultData( params: params, binaryCode: binaryCode, changedBinaryCode: changedBinaryCode, guaName: baseHexagram.name, targetGuaName: changedHexagram.name, upperName: baseHexagram.upper, lowerName: baseHexagram.lower, signType: signType, keywords: content.keywords, conclusion: content.conclusion, analysis: content.analysis, suggestion: content.suggestion, ganzhi: const GanzhiData( yearGanZhi: '丙午', monthGanZhi: '甲辰', dayGanZhi: '辛亥', timeGanZhi: '乙巳', yearKongWang: '子丑', monthKongWang: '申酉', dayKongWang: '寅卯', timeKongWang: '午未', yueJian: '辰', riChen: '亥', yuePo: '戌', riChong: '巳', ), wuXingStatus: const {'木': '旺', '火': '相', '土': '休', '金': '囚', '水': '死'}, yaoLines: lineData, targetYaoLines: targetLineData, ); } List _buildYaoLines(List states, bool target) { const spirits = ['龙', '雀', '勾', '蛇', '虎', '玄']; const relations = ['父母', '兄弟', '官鬼', '妻财', '子孙', '父母']; const branches = ['子', '寅', '辰', '午', '申', '戌']; const elements = ['水', '木', '土', '火', '金', '土']; return List.generate(6, (idx) { final mark = switch (idx) { 1 => '应', 4 => '世', _ => '', }; return YaoLineData( index: idx, spirit: spirits[idx], relation: relations[idx], branch: branches[idx], element: elements[idx], type: states[idx], mark: target ? '' : mark, ); }); } List _toChangedStates(List source) { return source.map((state) { return switch (state) { YaoType.oldYang => YaoType.youngYin, YaoType.oldYin => YaoType.youngYang, _ => state, }; }).toList(); } String _signByStates(List states) { final dynamicCount = states .where((e) => e == YaoType.oldYang || e == YaoType.oldYin) .length; if (dynamicCount <= 1) { return '上上签'; } if (dynamicCount <= 3) { return '中上签'; } return '中下签'; } _MockContent _mockContent( QuestionType type, String question, String signType, ) { final domain = switch (type) { QuestionType.career || QuestionType.study => '事业与成长', QuestionType.love => '关系与情感', QuestionType.wealth => '财富与资源', QuestionType.fortune => '阶段运势', QuestionType.dream => '潜意识信号', QuestionType.health => '身心节律', QuestionType.search => '寻物线索', QuestionType.other => '综合事项', }; return _MockContent( keywords: '$signType · $domain', conclusion: '这个卦象的结果为$signType。你关注的“$question”处于可推进阶段,当前节奏重在稳步而行,不宜急进。', analysis: '本卦显示外在条件逐步成形,内在决心也在增强。若短期遇到反复,通常是资源重组与信息修正,并非方向错误。建议将目标拆分为可验证的小节点,持续复盘。', suggestion: '建议一:先定三周内可执行动作并按日推进。\n建议二:重要决定留有缓冲期,避免情绪化判断。\n建议三:遇到阻滞先调整节奏,再补关键资源。', ); } } class _MockContent { const _MockContent({ required this.keywords, required this.conclusion, required this.analysis, required this.suggestion, }); final String keywords; final String conclusion; final String analysis; final String suggestion; } class _HexagramShort { const _HexagramShort(this.name, this.upper, this.lower); final String name; final String upper; final String lower; } const Map _hexagramMap = { '111111': _HexagramShort('乾为天', '乾', '乾'), '011111': _HexagramShort('天风姤', '乾', '巽'), '001111': _HexagramShort('天山遁', '乾', '艮'), '000111': _HexagramShort('天地否', '乾', '坤'), '000011': _HexagramShort('风地观', '巽', '坤'), '000001': _HexagramShort('山地剥', '艮', '坤'), '000101': _HexagramShort('火地晋', '离', '坤'), '111101': _HexagramShort('火天大有', '离', '乾'), '010010': _HexagramShort('坎为水', '坎', '坎'), '110010': _HexagramShort('水泽节', '坎', '兑'), '100010': _HexagramShort('水雷屯', '坎', '震'), '101010': _HexagramShort('水火既济', '坎', '离'), '101110': _HexagramShort('泽火革', '兑', '离'), '101100': _HexagramShort('雷火丰', '震', '离'), '101000': _HexagramShort('地火明夷', '坤', '离'), '010000': _HexagramShort('地水师', '坤', '坎'), '001001': _HexagramShort('艮为山', '艮', '艮'), '101001': _HexagramShort('山火贲', '艮', '离'), '111001': _HexagramShort('山天大畜', '艮', '乾'), '110001': _HexagramShort('山泽损', '艮', '兑'), '110101': _HexagramShort('火泽睽', '离', '兑'), '110111': _HexagramShort('天泽履', '乾', '兑'), '110011': _HexagramShort('风泽中孚', '巽', '兑'), '001011': _HexagramShort('风山渐', '巽', '艮'), '100100': _HexagramShort('震为雷', '震', '震'), '000100': _HexagramShort('雷地豫', '震', '坤'), '010100': _HexagramShort('雷水解', '震', '坎'), '011100': _HexagramShort('雷风恒', '震', '巽'), '011000': _HexagramShort('地风升', '坤', '巽'), '011010': _HexagramShort('水风井', '坎', '巽'), '011110': _HexagramShort('泽风大过', '兑', '巽'), '100110': _HexagramShort('泽雷随', '兑', '震'), '011011': _HexagramShort('巽为风', '巽', '巽'), '111011': _HexagramShort('风天小畜', '巽', '乾'), '101011': _HexagramShort('风火家人', '巽', '离'), '100011': _HexagramShort('风雷益', '巽', '震'), '100111': _HexagramShort('天雷无妄', '乾', '震'), '100101': _HexagramShort('火雷噬嗑', '离', '震'), '100001': _HexagramShort('山雷颐', '艮', '震'), '011001': _HexagramShort('山风蛊', '艮', '巽'), '101101': _HexagramShort('离为火', '离', '离'), '001101': _HexagramShort('火山旅', '离', '艮'), '011101': _HexagramShort('火风鼎', '离', '巽'), '010101': _HexagramShort('火水未济', '离', '坎'), '010001': _HexagramShort('山水蒙', '艮', '坎'), '010011': _HexagramShort('风水涣', '巽', '坎'), '010111': _HexagramShort('天水讼', '乾', '坎'), '101111': _HexagramShort('天火同人', '乾', '离'), '000000': _HexagramShort('坤为地', '坤', '坤'), '100000': _HexagramShort('地雷复', '坤', '震'), '110000': _HexagramShort('地泽临', '坤', '兑'), '111000': _HexagramShort('地天泰', '坤', '乾'), '111100': _HexagramShort('雷天大壮', '震', '乾'), '111110': _HexagramShort('泽天夬', '兑', '乾'), '111010': _HexagramShort('水天需', '坎', '乾'), '000010': _HexagramShort('水地比', '坎', '坤'), '110110': _HexagramShort('兑为泽', '兑', '兑'), '010110': _HexagramShort('泽水困', '兑', '坎'), '000110': _HexagramShort('泽地萃', '兑', '坤'), '001110': _HexagramShort('泽山咸', '兑', '艮'), '001010': _HexagramShort('水山蹇', '坎', '艮'), '001000': _HexagramShort('地山谦', '坤', '艮'), '001100': _HexagramShort('雷山小过', '震', '艮'), '110100': _HexagramShort('雷泽归妹', '震', '兑'), };