import {useProvidePaperNavigationService} from "@/components/mx-paper/usePaperNavigationServiceInjection";
import _ from "lodash";
import {fnPlaceholder} from "@/utils/uni-helper";

export const useProvideStepPaperNavigationService = (paperService, questionService) => {
    const {
        goToQuestion, commitPaper, hasNext, hasPrev, tryGoNext, tryGoPrev,
        hasNextStep, hasPrevStep, tryGoNextStep, tryGoPrevStep, questions
    } = paperService
    const {
        unansweredQuestions, doChunk
    } = questionService

    const overrides = {
        uncompletedCheckForQuit: async (navigator) => {
            // 1 当前没有题，可能位于欢迎页，或者结论页，可直接退出
            if (!questions.value.length) return
            // 2 同样保存答案
            await doChunk()
            // 3 完成的判定有变化，需要没有下一步，且全部已完成才能算完成。
            // PS：用逻辑保证第一步完成了才能进入下一步
            return new Promise((resolve, reject) => {
                if (unansweredQuestions.value.length) {
                    // a 还有未完成的题
                    navigator.open(unansweredQuestions.value, '您还有未做的题', {
                        left: '强制退出',
                        right: '继续做题',
                        onLeft: () => {
                            navigator.close()
                            resolve() // 允许用户继续执行后续逻辑
                        },
                        onRight: () => {
                            navigator.close()
                            goToQuestion(_.first(unansweredQuestions.value))
                            reject('操作终止，用户选择继续做题')
                        }
                    })
                } else if (hasNextStep.value) {
                    // b 还有未完成的部分
                    navigator.open([], '您还有未做的题', {
                        left: '强制退出',
                        right: '继续下一部分',
                        onLeft: () => {
                            navigator.close()
                            resolve() // 允许用户继续执行后续逻辑
                        },
                        onRight: () => {
                            navigator.close()
                            tryGoNextStep()
                            reject('操作终止，用户选择继续做题')
                        }
                    })
                } else {
                    // c 已经全部完成
                    navigator.open([], '您已经做完所有题，是否提交生成报告', {
                        left: '强制退出',
                        right: '生成报告',
                        onLeft: () => {
                            navigator.close()
                            resolve() // 允许用户继续执行后续逻辑
                        },
                        onRight: () => {
                            navigator.close()
                            commitPaper()
                            reject('操作终止，用户选择生成报告')
                        }
                    })
                }
            })
        },
        uncompletedCheckForSubmit: (navigator) => {
            // 彻底重写该方法，该方法在为step-paper-navigator提供按钮响应逻辑。
            // 因为和题库试卷交互有异，这里是要直接引导用户做完多个步骤的所有题，最后生成报告
            const prev = {left: '上一题', leftType: 'primary'}, next = {right: '下一题'}
            if (!questions.value.length) {
                // 没有题时静默不动，不能随意推动step，
                // 因为当前逻辑只关心当前step的题是否做完，如果多跳步骤就会漏掉检测，可能产生错误提交
                prev.onLeft = fnPlaceholder
                next.onRight = fnPlaceholder
                return {...prev, ...next}
            }

            if (hasPrev.value) {
                // 没有题时也默认走这个分支
                prev.onLeft = () => {
                    tryGoPrev()
                }
            } else {
                prev.onLeft = () => {
                    tryGoPrevStep()
                }
            }

            if (hasNext.value) {
                next.onRight = () => {
                    tryGoNext()
                }
            } else if (unansweredQuestions.value.length) {
                next.right = hasNextStep.value ? '下一题' : '生成报告'
                // 确保进入下一步之前完成了所有答题
                next.onRight = () => {
                    navigator.open(unansweredQuestions.value, '您还有未完成的题', {
                        left: '',
                        right: '去做题',
                        onRight: () => {
                            navigator.close()
                            goToQuestion(_.first(unansweredQuestions.value))
                        }
                    })
                }
            } else if (hasNextStep.value) {
                next.onRight = () => {
                    doChunk()
                    tryGoNextStep()
                }
            } else {
                next.right = '生成报告'
                next.onRight = () => {
                    doChunk()
                    commitPaper()
                }
            }

            return {...prev, ...next}
        }
    }

    return useProvidePaperNavigationService(paperService, questionService, overrides)
}