import { z } from "zod";
import { Types } from "mongoose";

const objectIdSchema = z
  .string()
  .min(1, "ID is required")
  .refine((id) => Types.ObjectId.isValid(id), "Invalid ObjectId");

export const createConversationSchema = z.object({
  userId: objectIdSchema,
});

export const conversationListSchema = z.object({
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().max(100).default(20),
});

export const conversationIdParamSchema = z.object({
  conversationId: objectIdSchema,
});

export const messageListSchema = z.object({
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().max(100).default(50),
  before: z
    .string()
    .optional()
    .refine(
      (v) => !v || Types.ObjectId.isValid(v),
      "Invalid before cursor ObjectId",
    ),
});

export const sendMessageBodySchema = z
  .object({
    conversationId: objectIdSchema,
    text: z.string().trim().max(2000).optional().default(""),
    media: z
      .array(
        z.object({
          url: z.string().trim().min(1),
          type: z.enum(["image", "video", "file"]).optional(),
          mimeType: z.string().trim().optional(),
          fileName: z.string().trim().optional(),
        }),
      )
      .max(10)
      .optional()
      .default([]),
  })
  .refine(
    (v) => (v.text && v.text.length > 0) || (v.media && v.media.length > 0),
    { message: "Provide text and/or media" },
  );
