<script setup lang="ts">
import { ModalsContainer, useModal } from "vue-final-modal";
import ResultModal from "~/components/ResultModal.vue";

definePageMeta({ middleware: ["result"] });

const examStore = useExamStore();

const points = ref<number>(0);

examStore.result.basic.forEach((answer) => {
  if (answer.chosen_is_correct) {
    points.value += answer.question?.liczba_pkt ?? 0;
  }
});
examStore.result.advanced.forEach((answer) => {
  if (answer.chosen_is_correct) {
    points.value += answer.question?.liczba_pkt ?? 0;
  }
});

const resultTrueFalse = ref(points.value >= 68 ? "pozytywny" : "negatywny");

const countBasic = ref(0);
const countAdvanced = ref(0);

const resultQuestionBasic = computed<ResultType<BasicQuestion> | undefined>(
  () => examStore.result.basic.at(countBasic.value)
);
const resultQuestionAdvanced = computed<
  ResultType<AdvancedQuestion> | undefined
>(() => examStore.result.advanced.at(countAdvanced.value));

const questionBasic = computed<BasicQuestion | undefined>(
  () => resultQuestionBasic.value?.question
);
const questionAdvanced = computed<AdvancedQuestion | undefined>(
  () => resultQuestionAdvanced.value?.question
);

const now = ref("basic");

const question = computed(() => {
  if (now.value == "basic") {
    return questionBasic.value;
  } else if (now.value == "advanced") {
    return questionAdvanced.value;
  } else {
    return;
  }
});

const tak_nie_model = computed(() =>
  resultQuestionBasic.value?.chosen_answer.toLowerCase()
);
const abc_model = computed(() =>
  resultQuestionAdvanced.value?.chosen_answer.toLowerCase()
);

const media = computed(() => {
  const mediaSplit = question.value?.media?.split(".");
  return {
    fileType: mediaSplit?.pop()?.toLowerCase(),
    fileName: mediaSplit?.join("."),
    ogName: question.value?.media,
  };
});

const { open, close } = useModal({
  component: ResultModal,
  attrs: {
    title: "Egzamin teorytyczny",
    onClose() {
      close();
    },
    onHomepage() {
      return navigateTo("/");
    },
    onNewExam() {
      return navigateTo("/exam");
    },
  },
  slots: {
    points: `${points.value}`,
    resultTrueFalse: resultTrueFalse,
  },
});
open();

function changeNow(to: string) {
  now.value = to;
}

function changeCount(num: number) {
  if (now.value == "basic") {
    countBasic.value = num;
  } else if (now.value == "advanced") {
    countAdvanced.value = num;
  }
}

function nav(route: string) {
  return navigateTo(route);
}
</script>

<template>
  <div>
    <ModalsContainer />
    <div>
      <div class="grid grid-cols-4 min-h-dvh">
        <div class="col-span-3 flex flex-col gap-4">
          <TopBar
            :points="question?.liczba_pkt"
            :category="examStore.category"
          />
          <Media :media="media" />
          <BasicQuestionBlock
            v-if="now == 'basic'"
            :question="questionBasic"
            v-model="tak_nie_model"
            class="select-none z-[-1]"
          />
          <AdvancedQuestionBlock
            v-else-if="now == 'advanced'"
            :question="questionAdvanced"
            v-model="abc_model"
            class="select-none z-[-1]"
          />
        </div>

        <RightBarResult
          :result="examStore.result"
          :question="question"
          :question-basic="questionBasic"
          :question-advanced="questionAdvanced"
          :count-basic="countBasic"
          :count-advanced="countAdvanced"
          :now="now"
          @change-now="changeNow"
          @change-count="changeCount"
          @nav="nav"
        />
      </div>
    </div>
  </div>
</template>