import { initDb } from "@/lib/db";
import type { Question } from "@/lib/db/models/question";
import type { BuilderSurvey, BuilderQuestion, BuilderLogicRule } from "@/types/builder";
import type { QuestionOptionsConfig, QuestionValidationConfig } from "@/types";
import { parseJsonColumn } from "@/lib/utils/parse-json-column";
import { loadLogicRulesByQuestionIds } from "@/lib/queries/logic-queries";
import { normalizeDisplayConfig } from "@/lib/utils/survey-display";
import { normalizeThankYouConfig } from "@/lib/utils/thank-you-screen";

/** Fetch full survey data for the builder canvas. */
export async function getBuilderSurvey(
  surveyId: string,
  workspaceId: string
): Promise<BuilderSurvey | null> {
  const { Survey, Question } = initDb();

  const survey = await Survey.findOne({
    where: { id: surveyId, workspaceId },
    include: [
      {
        model: Question,
        as: "questions",
        separate: true,
        order: [["position", "ASC"]],
      },
    ],
  });

  if (!survey) return null;

  const rawQuestions = (survey.get("questions") as Question[] | undefined) ?? [];
  const rulesByQuestion = await loadLogicRulesByQuestionIds(
    rawQuestions.map((q) => q.id)
  );

  const questions: BuilderQuestion[] = rawQuestions.map((q) => {
    const logicRules: BuilderLogicRule[] = rulesByQuestion.get(q.id) ?? [];

    return {
      id: q.id,
      type: q.type,
      title: q.title,
      position: q.position,
      isRequired: q.isRequired,
      validationConfig: parseJsonColumn<QuestionValidationConfig>(
        q.validationConfig
      ),
      optionsConfig: parseJsonColumn<QuestionOptionsConfig>(q.optionsConfig),
      randomizeOptions: q.randomizeOptions,
      logicRules,
    };
  });

  return {
    id: survey.id,
    title: survey.title,
    description: survey.description,
    status: survey.status,
    welcomeScreenConfig: survey.welcomeScreenConfig,
    thankYouScreenConfig: normalizeThankYouConfig(survey.thankYouScreenConfig),
    displayConfig: normalizeDisplayConfig(survey.displayConfig),
    questions,
  };
}
