import { z } from "zod";

const safeHeaderValue = z
  .string()
  .max(998)
  .refine((value) => !/[\r\n]/.test(value), "Header values cannot contain line breaks");

export const ComposeMessageSchema = z
  .object({
    mailbox_id: z.string().min(1).max(64),
    to: z.array(z.email()).min(1).max(50),
    cc: z.array(z.email()).max(50).default([]),
    bcc: z.array(z.email()).max(50).default([]),
    subject: safeHeaderValue.max(500),
    text: z.string().min(1).max(200_000),
    in_reply_to: safeHeaderValue.optional(),
    references: z.array(safeHeaderValue).max(100).default([]),
  })
  .superRefine((value, ctx) => {
    const recipients = value.to.length + value.cc.length + value.bcc.length;
    if (recipients > 50) {
      ctx.addIssue({
        code: "custom",
        path: ["to"],
        message: "A message may have at most 50 recipients",
      });
    }
  });

export type ComposeMessage = z.infer<typeof ComposeMessageSchema>;

export const SearchMailSchema = z.object({
  mailbox_id: z.string().min(1).max(64),
  folder: z.string().min(1).max(512).default("INBOX"),
  text: z.string().min(1).max(500).optional(),
  from: z.string().min(1).max(320).optional(),
  to: z.string().min(1).max(320).optional(),
  subject: z.string().min(1).max(500).optional(),
  since: z.iso.date().optional(),
  before: z.iso.date().optional(),
  unread_only: z.boolean().default(false),
  flagged_only: z.boolean().default(false),
  before_uid: z.number().int().positive().optional(),
  limit: z.number().int().min(1).max(50).default(20),
});

export type SearchMailInput = z.infer<typeof SearchMailSchema>;
