import { z } from "zod";
import { Role, Ulid, User, Workspace, WorkspaceMember } from "./entities";

export const WorkspaceSummary = Workspace.extend({ role: Role });
export type WorkspaceSummary = z.infer<typeof WorkspaceSummary>;

export const MyWorkspacesResponse = z.object({ workspaces: z.array(WorkspaceSummary) });

export const MemberWithUser = z.object({
  member: WorkspaceMember,
  user: User,
});
export type MemberWithUser = z.infer<typeof MemberWithUser>;

export const MemberDirectoryResponse = z.object({ members: z.array(MemberWithUser) });

export const CreateInviteRequest = z.object({
  email: z.string().email(),
  role: Role.default("member"),
  expiresInHours: z.number().int().min(1).max(24 * 30).default(72),
  maxUses: z.number().int().min(1).max(10_000).default(1),
});
export type CreateInviteRequest = z.infer<typeof CreateInviteRequest>;

export const InviteResponse = z.object({
  id: Ulid,
  token: z.string().optional(), // raw token for email/link path; omitted once consumed from UI when userExists
  role: Role,
  expiresAt: z.string().datetime(),
  maxUses: z.number().int(),
  userExists: z.boolean(),
  notified: z.boolean(),
  alreadyMember: z.boolean().optional(),
});
export type InviteResponse = z.infer<typeof InviteResponse>;

export const AcceptInviteRequest = z.object({ token: z.string().min(1) });
export const AcceptInviteByIdRequest = z.object({ inviteId: Ulid });
export const DeclineInviteByIdRequest = z.object({ inviteId: Ulid });

export const PendingInvite = z.object({
  id: Ulid,
  workspaceId: Ulid,
  workspaceName: z.string(),
  workspaceSlug: z.string(),
  role: Role,
  invitedByName: z.string().nullable(),
  expiresAt: z.string().datetime(),
  createdAt: z.string().datetime(),
});
export type PendingInvite = z.infer<typeof PendingInvite>;

export const PendingInvitesResponse = z.object({ invites: z.array(PendingInvite) });

export const AppNotification = z.object({
  id: Ulid,
  type: z.string(),
  title: z.string(),
  body: z.string(),
  payload: z.record(z.unknown()),
  readAt: z.string().datetime().nullable(),
  createdAt: z.string().datetime(),
});
export type AppNotification = z.infer<typeof AppNotification>;

export const NotificationsResponse = z.object({ notifications: z.array(AppNotification) });

export const ChangeMemberRoleRequest = z.object({ role: Role });
export const TransferOwnershipRequest = z.object({ newOwnerUserId: Ulid });

export const UpdateWorkspaceSettingsRequest = z.object({
  name: z.string().min(1).max(120).optional(),
  retentionDays: z.number().int().nonnegative().nullable().optional(),
});

const TimeOfDay = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/);

export const SetStatusRequest = z.object({
  text: z.string().trim().max(100),
  emoji: z.string().trim().max(64).optional().default("💬"),
  expiresAt: z.string().datetime().nullable().optional().default(null),
  pauseNotifications: z.boolean().optional().default(false),
});
export type SetStatusRequest = z.infer<typeof SetStatusRequest>;

export const SetAvailabilityRequest = z.object({ mode: z.enum(["auto", "away", "available"]) });

export const SetStatusContextRequest = z.object({
  focusModeEnabled: z.boolean().optional(),
  inConnect: z.boolean().optional(),
});

export const UpdateAutomaticStatusPreferencesRequest = z.object({
  connect: z.boolean(),
  focus: z.boolean(),
  outsideWorkingHours: z.boolean(),
  workHoursStart: TimeOfDay,
  workHoursEnd: TimeOfDay,
  workingDays: z.array(z.number().int().min(0).max(6)).min(1).max(7),
});
export type UpdateAutomaticStatusPreferencesRequest = z.infer<typeof UpdateAutomaticStatusPreferencesRequest>;

export const CreateScheduledStatusRequest = z.object({
  text: z.string().trim().min(1).max(100),
  emoji: z.string().trim().min(1).max(64).default("💬"),
  startsAt: z.string().datetime(),
  endsAt: z.string().datetime(),
  pauseNotifications: z.boolean().optional().default(false),
});
export type CreateScheduledStatusRequest = z.infer<typeof CreateScheduledStatusRequest>;
