import { z } from "zod";
import { Channel, Message, Ulid } from "./entities";

export const HealthResponse = z.object({
  status: z.literal("ok"),
  service: z.string(),
  time: z.string().datetime(),
});
export type HealthResponse = z.infer<typeof HealthResponse>;

export const CreateWorkspaceRequest = z.object({
  name: z.string().min(1).max(120),
  slug: z.string().regex(/^[a-z0-9-]{2,64}$/),
});
export type CreateWorkspaceRequest = z.infer<typeof CreateWorkspaceRequest>;

export const CreateChannelRequest = z.object({
  name: z.string().min(1).max(80),
  type: z.enum(["public", "private"]),
  topic: z.string().optional(),
});
export type CreateChannelRequest = z.infer<typeof CreateChannelRequest>;

export const ChannelsListResponse = z.object({
  channels: z.array(Channel),
});

export const ScrollbackQuery = z.object({
  afterSeq: z.coerce.number().int().nonnegative().optional(),
  beforeSeq: z.coerce.number().int().nonnegative().optional(),
  limit: z.coerce.number().int().min(1).max(200).default(50),
});
export type ScrollbackQuery = z.infer<typeof ScrollbackQuery>;

export const ScrollbackResponse = z.object({
  messages: z.array(Message),
});

export const ChannelIdParam = z.object({ channelId: Ulid });

export const PushSubscribeRequest = z.object({
  endpoint: z.string().url(),
  keys: z.object({
    p256dh: z.string().min(8),
    auth: z.string().min(8),
  }),
  userAgent: z.string().max(400).optional(),
});
export type PushSubscribeRequest = z.infer<typeof PushSubscribeRequest>;

export const PushUnsubscribeRequest = z.object({
  endpoint: z.string().url(),
});
export type PushUnsubscribeRequest = z.infer<typeof PushUnsubscribeRequest>;
