import { initDb } from "@/lib/db";
import { getScopedSurvey } from "@/lib/queries/survey-queries";
import type { CollectorRow } from "@/types/filler";
import { slugify, randomSlugSuffix } from "@/lib/utils/slugify";

/** List collectors for a scoped survey. */
export async function getSurveyCollectors(
  surveyId: string,
  workspaceId: string
): Promise<CollectorRow[]> {
  const survey = await getScopedSurvey(surveyId, workspaceId);
  if (!survey) return [];

  const { Collector } = initDb();
  const collectors = await Collector.findAll({
    where: { surveyId },
    order: [["createdAt", "DESC"]],
  });

  return collectors.map((c) => ({
    id: c.id,
    type: c.type,
    slug: c.slug,
    isActive: c.isActive,
    config: c.config as Record<string, unknown> | null,
    createdAt: c.createdAt,
  }));
}

/** Get or create the primary web_link collector for a survey. */
export async function getOrCreateWebLinkCollector(
  surveyId: string,
  workspaceId: string,
  surveyTitle: string
): Promise<CollectorRow | null> {
  const survey = await getScopedSurvey(surveyId, workspaceId);
  if (!survey) return null;

  const { Collector } = initDb();
  let collector = await Collector.findOne({
    where: { surveyId, type: "web_link" },
  });

  if (!collector) {
    const baseSlug = slugify(surveyTitle) || "survey";
    collector = await Collector.create({
      surveyId,
      type: "web_link",
      slug: `${baseSlug}-${randomSlugSuffix()}`,
      isActive: true,
      config: {},
    });
  }

  return {
    id: collector.id,
    type: collector.type,
    slug: collector.slug,
    isActive: collector.isActive,
    config: collector.config as Record<string, unknown> | null,
    createdAt: collector.createdAt,
  };
}

/** Resolve survey title for a collector (for distribute page header). */
export async function getSurveyTitleForCollector(
  surveyId: string,
  workspaceId: string
): Promise<string | null> {
  const survey = await getScopedSurvey(surveyId, workspaceId);
  return survey?.title ?? null;
}
