import { initDb } from "@/lib/db";
import type { Question } from "@/lib/db/models/question";
import type { FillerSurveyData, FillerQuestion, FillerLogicRule } from "@/types/filler";
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";

/** Load survey data by surveyId for preview — bypasses active/collector checks. */
export async function getPreviewSurveyById(
  surveyId: string,
  workspaceId: string
): Promise<FillerSurveyData | 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: FillerQuestion[] = rawQuestions.map((q) => {
    const logicRules: FillerLogicRule[] = rulesByQuestion.get(q.id) ?? [];

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

  return {
    collectorId: "preview",
    surveyId: survey.id,
    slug: `preview-${survey.id}`,
    title: survey.title,
    welcomeScreenConfig: survey.welcomeScreenConfig,
    thankYouScreenConfig: normalizeThankYouConfig(survey.thankYouScreenConfig),
    redirectUrl: null,
    displayConfig: normalizeDisplayConfig(survey.displayConfig),
    questions,
  };
}
