import { initDb } from "@/lib/db";
import { safeSurveyRedirectUrl } from "@/lib/utils/safe-redirect";
import type { Survey } from "@/lib/db/models/survey";
import type { Workspace } from "@/lib/db/models/workspace";
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 public survey data by collector slug for the filler UI. */
export async function getPublicSurveyBySlug(
  slug: string
): Promise<FillerSurveyData | null> {
  const { Collector, Survey, Question, Workspace } = initDb();

  const collector = await Collector.findOne({
    where: { slug, isActive: true },
    include: [
      {
        model: Survey,
        as: "survey",
        where: { status: "active" },
        include: [
          {
            model: Question,
            as: "questions",
            separate: true,
            order: [["position", "ASC"]],
          },
          {
            model: Workspace,
            as: "workspace",
            attributes: ["isSuspended"],
          },
        ],
      },
    ],
  });

  if (!collector) return null;

  const survey = collector.get("survey") as Survey | undefined;
  if (!survey) return null;

  const workspace = survey.get("workspace") as Workspace | undefined;
  if (workspace?.isSuspended) 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: collector.id,
    surveyId: survey.id,
    slug: collector.slug,
    title: survey.title,
    welcomeScreenConfig: survey.welcomeScreenConfig,
    thankYouScreenConfig: normalizeThankYouConfig(survey.thankYouScreenConfig),
    redirectUrl: safeSurveyRedirectUrl(survey.redirectUrl),
    displayConfig: normalizeDisplayConfig(survey.displayConfig),
    questions,
  };
}
