import { AnyTypedQuizQuestion, QuestionBranchingRuleMain } from "@frontend/squzanswerer";
import { Quiz } from "@model/quiz/quiz";
import { getQuestionByContentId, updateQuestion } from "@root/questions/actions";
import { WhyCantCreatePublic } from "@root/uiTools/store";

export const checkQuestionHint = (
  questions: AnyTypedQuizQuestion[],
  quiz: Quiz
): Record<string, WhyCantCreatePublic> => {
  const problems: any = {};

  if (quiz.config.startpageType === null)
    problems.quiz = {
      name: "quiz",
      problems: ["Не выбран тип стартовой страницы"],
    };

  const pushProblem = (id: string, problem: string, title: string) => {
    //Если первый вопрос с проблемой - создаём запись. Если не первый - добавляем проблему
    if (id in problems) {
      problems[id].problems.push(problem);
    } else {
      problems[id] = {
        name: title,
        problems: [problem],
      };
    }
  };

  questions.forEach((question: AnyTypedQuizQuestion) => {
    //Если не участвует в ветвлении, или безтиповый, или резулт - он нам не интересен
    if (question.type === null || question.type === "result" || question.content.rule.parentId?.length === 0) return;

    if (
      question?.type === "date" ||
      question?.type === "text" ||
      question?.type === "number" ||
      question?.type === "page"
    ) {
      //Если у вопроса типа страница, ползунок, своё поле для ввода и дата есть ребёнок, но нет дефолта - молча его добавляем.

      if (question.content.rule.children.length === 1 && question.content.rule.default.length === 0)
        updateQuestion(question.id, (q) => {
          question.content.rule.default = question.content.rule.children[0];
        });
    } else {
      //если есть дети, но нет дефолта - логическая ошибка. Так нельзя
      if (question.content.rule.children.length > 0 && question.content.rule.default.length === 0) {
        pushProblem(question.content.id, "Не выбран дефолтный вопрос", question.title);
      }
    }

    //Rules вопроса не должны совпадать
    const buffer: QuestionBranchingRuleMain[] = [];
    question.content.rule.main.forEach((condition: QuestionBranchingRuleMain) => {
      buffer.forEach((oldCondition: QuestionBranchingRuleMain) => {
        if (areRulesEqual(condition.rules, oldCondition.rules)) {
          const currentQuestion = getQuestionByContentId(condition.next);
          const oldQuestions = getQuestionByContentId(oldCondition.next);

          if (!currentQuestion?.type || !oldQuestions?.type) {
            return;
          }

          pushProblem(
            question.content.id,
            `У вопроса "${currentQuestion.title || "noname №" + currentQuestion.page}" и "${
              oldQuestions.title || "noname №" + oldQuestions.page
            }" одинаковые условия ветвления`,
            question.title
          );
        }
      });
      buffer.push(condition);
    });
  });

  return problems;
};

const areRulesEqual = (first: any, second: any) => {
  const firstArray = first[0].answers;
  const secondArray = second[0].answers;
  if (firstArray.length === secondArray.length) {
    if (firstArray.length > 1) {
      if (firstArray.every((element: any, index: number) => element === secondArray[index]) && first.or === second.or)
        return true;
    } else {
      if (firstArray[0] === secondArray[0]) return true;
    }
  }
  return false;
};
