import { z } from "zod";

/** User-level OAuth / BYOK connections (Settings → Connected accounts). */
export const ConnectedAccountProvider = z.enum(["google_calendar", "outlook_calendar", "zoom", "openai"]);
export type ConnectedAccountProvider = z.infer<typeof ConnectedAccountProvider>;

export const OAuthAccountProvider = z.enum(["google_calendar", "outlook_calendar", "zoom"]);
export type OAuthAccountProvider = z.infer<typeof OAuthAccountProvider>;

export const RewriteTone = z.enum(["professional", "friendly", "concise", "formal", "casual"]);
export type RewriteTone = z.infer<typeof RewriteTone>;

export const RewriteMode = z.enum(["rewrite", "proofread"]);
export type RewriteMode = z.infer<typeof RewriteMode>;

export const ConnectedAccountStatus = z.object({
  provider: ConnectedAccountProvider,
  connected: z.boolean(),
  accountEmail: z.string().nullable().optional(),
  accountLabel: z.string().nullable().optional(),
  secretLast4: z.string().nullable().optional(),
  /** False when the server lacks client id/secret for this OAuth provider. */
  configured: z.boolean(),
});
export type ConnectedAccountStatus = z.infer<typeof ConnectedAccountStatus>;

export const ListConnectedAccountsResponse = z.object({
  integrations: z.array(ConnectedAccountStatus),
});

export const SaveOpenAiKeyRequest = z.object({
  apiKey: z.string().min(8).max(256),
});

export const RewriteMessageRequest = z.object({
  text: z.string().min(1).max(8_000),
  tone: RewriteTone.default("professional"),
  mode: RewriteMode.default("rewrite"),
});
export type RewriteMessageRequest = z.infer<typeof RewriteMessageRequest>;

export const RewriteMessageResponse = z.object({
  text: z.string(),
});

export const StartOAuthRequest = z.object({
  provider: OAuthAccountProvider,
  /** Where to send the browser after OAuth completes (relative path OK). */
  returnTo: z.string().max(500).optional(),
});

export const StartOAuthResponse = z.object({
  url: z.string().url(),
});

export const ExternalCalendarEvent = z.object({
  id: z.string(),
  provider: OAuthAccountProvider,
  title: z.string(),
  startsAt: z.string().datetime(),
  endsAt: z.string().datetime(),
  allDay: z.boolean(),
  location: z.string().nullable(),
  htmlLink: z.string().nullable(),
});
export type ExternalCalendarEvent = z.infer<typeof ExternalCalendarEvent>;

export const ListExternalEventsQuery = z.object({
  from: z.string().datetime(),
  to: z.string().datetime(),
});

export const CreateZoomMeetingRequest = z.object({
  topic: z.string().min(1).max(200),
  startsAt: z.string().datetime(),
  durationMinutes: z.number().int().min(5).max(24 * 60).default(30),
  timezone: z.string().min(1).max(64).optional(),
});
export type CreateZoomMeetingRequest = z.infer<typeof CreateZoomMeetingRequest>;

export const CreateZoomMeetingResponse = z.object({
  joinUrl: z.string().url(),
  meetingId: z.union([z.string(), z.number()]),
  startUrl: z.string().url().optional(),
});

export const DisconnectConnectedAccountRequest = z.object({
  provider: ConnectedAccountProvider,
});
