import { parseJsonColumn } from "@/lib/utils/parse-json-column";

export type SurveyLayoutMode = "one_per_page" | "single_page" | "grouped";

export interface SurveyDisplayConfig {
  layout: SurveyLayoutMode;
  /** After these question IDs, start a new page (grouped layout only). */
  pageBreakAfterIds: string[];
}

export const DEFAULT_DISPLAY_CONFIG: SurveyDisplayConfig = {
  layout: "one_per_page",
  pageBreakAfterIds: [],
};

export function normalizeDisplayConfig(raw: unknown): SurveyDisplayConfig {
  const obj = parseJsonColumn<Partial<SurveyDisplayConfig>>(raw);
  const layout = obj?.layout;
  const valid =
    layout === "one_per_page" ||
    layout === "single_page" ||
    layout === "grouped";

  return {
    layout: valid ? layout : "one_per_page",
    pageBreakAfterIds: Array.isArray(obj?.pageBreakAfterIds)
      ? obj.pageBreakAfterIds.filter((id): id is string => typeof id === "string")
      : [],
  };
}

/** Insert a page break after every N questions (not after the last). */
export function breaksEveryN(questionIds: string[], n: number): string[] {
  if (n < 1) return [];
  const breaks: string[] = [];
  questionIds.forEach((id, i) => {
    if ((i + 1) % n === 0 && i < questionIds.length - 1) {
      breaks.push(id);
    }
  });
  return breaks;
}

/** Default grouped layout: a new page after every 2 questions. */
export function defaultGroupedBreaks(questionIds: string[]): string[] {
  return breaksEveryN(questionIds, 2);
}

/** Split questions into pages using "new page after this question" IDs. */
export function splitQuestionsByPageBreaks<T extends { id: string }>(
  questions: T[],
  pageBreakAfterIds: string[]
): T[][] {
  if (questions.length === 0) return [];
  const breakSet = new Set(pageBreakAfterIds);
  const pages: T[][] = [];
  let current: T[] = [];

  questions.forEach((q, i) => {
    current.push(q);
    const isLast = i === questions.length - 1;
    if (breakSet.has(q.id) && !isLast) {
      pages.push(current);
      current = [];
    }
  });

  if (current.length) pages.push(current);
  return pages;
}
