import { z } from 'zod';

/**
 * 消息角色（只有 user 和 assistant，不存储 tool/system）
 */
export const MessageRoleSchema = z.enum(['user', 'assistant']);
export type MessageRole = z.infer<typeof MessageRoleSchema>;

/**
 * 消息 Info Schema（不含内容，内容在 Parts 中）
 */
export const MessageInfoSchema = z.object({
  id: z.string(),
  sessionId: z.string(),
  role: MessageRoleSchema,
  // assistant 消息指向对应的 user 消息
  parentId: z.string().optional(),
  createdAt: z.number(), // Unix timestamp in milliseconds
  // Part IDs 列表（按顺序）
  partIds: z.array(z.string()),
  // 元数据
  metadata: z
    .object({
      // 模型信息
      model: z.string().optional(),
      // 步骤索引（如果是多步骤响应）
      stepIndex: z.number().optional(),
      // 是否被压缩
      compacted: z.boolean().optional(),
    })
    .optional(),
});
export type MessageInfo = z.infer<typeof MessageInfoSchema>;

/**
 * 消息（含 Parts 内容，用于运行时）
 */
export interface Message extends Omit<MessageInfo, 'partIds'> {
  parts: import('./parts.js').Part[];
}

/**
 * 生成消息 ID
 * 使用降序 ID，最新的消息在前面（方便列表查询）
 */
export function generateMessageId(): string {
  const timestamp = Date.now();
  const random = Math.random().toString(36).substring(2, 8);
  // 使用最大时间戳减去当前时间戳，实现降序
  const invertedTimestamp = 9999999999999 - timestamp;
  return `msg_${invertedTimestamp}_${random}`;
}

/**
 * 从消息 ID 提取时间戳
 */
export function getTimestampFromMessageId(messageId: string): number {
  const match = messageId.match(/^msg_(\d+)_/);
  if (!match) return 0;
  const invertedTimestamp = parseInt(match[1], 10);
  return 9999999999999 - invertedTimestamp;
}

/**
 * 创建消息 Info
 */
export function createMessageInfo(
  sessionId: string,
  role: MessageRole,
  partIds: string[] = [],
  options?: {
    parentId?: string;
    metadata?: MessageInfo['metadata'];
  }
): MessageInfo {
  return {
    id: generateMessageId(),
    sessionId,
    role,
    parentId: options?.parentId,
    createdAt: Date.now(),
    partIds,
    metadata: options?.metadata,
  };
}
