import { useCallback, useDebugValue, useEffect, useMemo, useState } from "react";
import { enqueueSnackbar } from "notistack";
import moment from "moment";

import { isResultQuestionEmpty } from "@/components/ViewPublicationPage/tools/checkEmptyData";
import { changeNextLoading, quizStepDec, quizStepInc, useQuizStore } from "@/stores/useQuizStore";

import { useQuizViewStore } from "@stores/quizView";

import { useVkMetricsGoals } from "@/utils/hooks/metrics/useVkMetricsGoals";
import { useYandexMetricsGoals } from "@/utils/hooks/metrics/useYandexMetricsGoals";
import { useQuestionTimer } from "./useQuestionTimer";

export function useAIQuiz() {
  //Получаем инфо о квизе и список вопросов.
  const { settings, questions, quizId, cnt, quizStep, preview } = useQuizStore();

  //Список ответов на вопрос. Мы записываем ответы локально, параллельно отправляя на бек информацию о ответах
  const answers = useQuizViewStore((state) => state.answers);

  //Текущий шаг "startpage" | "question" | "contactform"
  const setCurrentQuizStep = useQuizViewStore((state) => state.setCurrentQuizStep);
  //Получение возможности управлять состоянием метрик
  const vkMetrics = useVkMetricsGoals(settings.cfg.vkMetricsNumber);
  const yandexMetrics = useYandexMetricsGoals(settings.cfg.yandexMetricsNumber);

  const currentQuestion = useMemo(() => {
    const calcQuestion = questions[quizStep];
    if (calcQuestion) {
      vkMetrics.questionPassed(calcQuestion.id);
      yandexMetrics.questionPassed(calcQuestion.id);

      return calcQuestion;
    } else return questions[questions.length - 1];
  }, [questions, quizStep]);

  useEffect(() => {
    if (currentQuestion.type === "result") showResult();
    if (currentQuestion) changeNextLoading(false);
  }, [currentQuestion, questions]);

  //Показать визуалом юзеру результат
  const showResult = useCallback(() => {
    if (currentQuestion?.type !== "result") throw new Error("Current question is not result");

    //Смотрим по настройкам показывать ли вообще форму контактов. Показывать ли страницу результатов до или после формы контактов (ФК)
    if (
      settings.cfg.showfc !== false &&
      (settings.cfg.resultInfo.showResultForm === "after" || isResultQuestionEmpty(currentQuestion))
    )
      setCurrentQuizStep("contactform");
  }, [currentQuestion, setCurrentQuizStep, settings.cfg.resultInfo.showResultForm, settings.cfg.showfc]);

  //рычаг управления из визуала в этот контроллер

  const showResultAfterContactForm = useCallback(() => {
    if (currentQuestion?.type !== "result") throw new Error("Current question is not result");
    if (isResultQuestionEmpty(currentQuestion)) return;

    setCurrentQuizStep("question");
  }, [currentQuestion, setCurrentQuizStep]);

  //рычаг управления из визуала в этот контроллер
  const moveToPrevQuestion = useCallback(() => {
    if (quizStep > 0 && !questions[quizStep - 1]) throw new Error("Previous question not found");

    if (settings.status === "ai" && quizStep > 0) quizStepDec();
  }, [quizStep]);

  //рычаг управления из визуала в этот контроллер
  const moveToNextQuestion = useCallback(async () => {
    changeNextLoading(true);
    quizStepInc();
  }, [quizStep, changeNextLoading, quizStepInc]);

  //рычаг управления из визуала в этот контроллер
  const setQuestion = useCallback((_: string) => {}, []);

  //Анализ дисаблить ли кнопки навигации
  const isPreviousButtonEnabled = settings.cfg?.backBlocked ? false : quizStep > 0;

  //Анализ дисаблить ли кнопки навигации
  const isNextButtonEnabled = useMemo(() => {
    const hasAnswer = answers.some(({ questionId }) => questionId === currentQuestion.id);

    if ("required" in currentQuestion.content && currentQuestion.content.required) {
      return hasAnswer;
    }

    return quizStep < cnt;
  }, [answers, currentQuestion]);

  useDebugValue({
    CurrentQuestionIndex: quizStep,
    currentQuestion: currentQuestion,
    prevQuestion: questions[quizStep + 1],
    nextQuestion: questions[quizStep - 1],
  });

  // Таймер авто-перехода между вопросами (AI)
  useQuestionTimer({
    enabled: Boolean(settings.questionTimerEnabled),
    seconds: settings.cfg.time_of_passing ?? 0,
    quizId,
    preview,
    currentQuestion,
    onNext: () => {
      moveToNextQuestion();
    },
  });

  return {
    currentQuestion,
    currentQuestionStepNumber: null,
    nextQuestion: undefined,
    isNextButtonEnabled,
    isPreviousButtonEnabled,
    moveToPrevQuestion,
    moveToNextQuestion,
    showResultAfterContactForm,
    setQuestion,
  };
}
