import { z } from "zod";

export const questionTypeSchema = z.enum([
  "multiple_choice",
  "checkbox",
  "rating",
  "nps",
  "open_text",
  "matrix",
  "file_upload",
  "dropdown",
  "date_time",
]);

export const optionsConfigSchema = z
  .object({
    choices: z.array(z.string()).optional(),
    minRating: z.number().optional(),
    maxRating: z.number().optional(),
    rows: z.array(z.string()).optional(),
    columns: z.array(z.string()).optional(),
    placeholder: z.string().optional(),
    allowMultiple: z.boolean().optional(),
  })
  .optional()
  .nullable();

export const validationConfigSchema = z
  .object({
    minLength: z.number().optional(),
    maxLength: z.number().optional(),
    maxFileSizeMb: z.number().optional(),
    allowedFileTypes: z.array(z.string()).optional(),
    responseType: z.enum(["text", "number", "email", "regex"]).optional(),
    regexPattern: z.string().optional(),
    minSelections: z.number().optional(),
    maxSelections: z.number().optional(),
  })
  .optional()
  .nullable();

export const createQuestionSchema = z.object({
  surveyId: z.string().uuid(),
  type: questionTypeSchema,
});

export const updateQuestionSchema = z
  .object({
    surveyId: z.string().uuid(),
    questionId: z.string().uuid(),
    title: z.string().min(1).max(2000).optional(),
    isRequired: z.boolean().optional(),
    randomizeOptions: z.boolean().optional(),
    optionsConfig: optionsConfigSchema,
    validationConfig: validationConfigSchema,
  })
  .refine(
    (data) => {
      const { minRating, maxRating } = data.optionsConfig ?? {};
      if (minRating == null || maxRating == null) return true;
      return minRating < maxRating;
    },
    { message: "Minimum rating must be less than maximum rating", path: ["optionsConfig"] }
  );

export const reorderQuestionsSchema = z.object({
  surveyId: z.string().uuid(),
  orderedIds: z.array(z.string().uuid()).min(1),
});

export const deleteQuestionSchema = z.object({
  surveyId: z.string().uuid(),
  questionId: z.string().uuid(),
});

export const logicRuleSchema = z.object({
  surveyId: z.string().uuid(),
  questionId: z.string().uuid(),
  conditionType: z.enum(["equals", "not_equals", "any_answer"]),
  conditionValue: z.string().nullable().optional(),
  action: z.enum(["skip_to_question", "end_survey"]),
  targetQuestionId: z.string().uuid().nullable().optional(),
});

export const updateSurveyWelcomeSchema = z.object({
  surveyId: z.string().uuid(),
  title: z.string().min(1).max(500),
  description: z.string().max(2000).optional(),
});

export const publishSurveySchema = z.object({
  surveyId: z.string().uuid(),
});

export const updateSurveyDisplaySchema = z.object({
  surveyId: z.string().uuid(),
  layout: z.enum(["one_per_page", "single_page", "grouped"]),
  pageBreakAfterIds: z.array(z.string().uuid()).optional(),
});

export const updateSurveyThankYouSchema = z.object({
  surveyId: z.string().uuid(),
  emoji: z.string().max(16).optional(),
  title: z.string().min(1).max(200),
  description: z.string().max(2000).optional(),
  variants: z
    .array(
      z.object({
        id: z.string().min(1).max(80),
        questionId: z.string().uuid(),
        conditionType: z.enum(["equals", "not_equals", "any_answer"]),
        conditionValue: z.string().max(500).nullable(),
        emoji: z.string().max(16),
        title: z.string().min(1).max(200),
        description: z.string().max(2000),
      })
    )
    .max(12)
    .optional(),
});
