import { getDb } from '../client'
import { messages } from '../schema'
import { eq, asc, sql } from 'drizzle-orm'

/**
 * Message Repository。封装 messages 表的所有查询。
 * messages 无独立删除——其生命周期跟随 session，由 sessionRepo.deleteById 事务级联。
 */

export const messageRepo = {
  /** 列出会话的所有消息，按时间正序 */
  listBySession(sessionId: string) {
    return getDb()
      .select({
        id: messages.id,
        role: messages.role,
        content: messages.content,
        createdAt: messages.createdAt,
      })
      .from(messages)
      .where(eq(messages.sessionId, sessionId))
      .orderBy(asc(messages.createdAt))
      .all()
  },

  /** 列出会话消息（不含 user 消息 id，用于历史构建） */
  listRoleContentBySession(sessionId: string, excludeId?: string) {
    const conds = excludeId
      ? [eq(messages.sessionId, sessionId), sql`${messages.id} != ${excludeId}`]
      : [eq(messages.sessionId, sessionId)]
    return getDb()
      .select({ role: messages.role, content: messages.content })
      .from(messages)
      .where(sql.join(conds, sql` AND `))
      .orderBy(asc(messages.createdAt))
      .all()
  },

  /** 追加消息 */
  create(data: { id: string; sessionId: string; role: 'user' | 'assistant'; content: string }) {
    getDb()
      .insert(messages)
      .values({
        id: data.id,
        sessionId: data.sessionId,
        role: data.role,
        content: data.content,
      })
      .run()
  },

  /** 按 id 删除单条消息 */
  deleteById(id: string) {
    getDb().delete(messages).where(eq(messages.id, id)).run()
  },

  /** 删除会话的所有消息（保留 session，用于 clear 操作） */
  deleteBySession(sessionId: string) {
    getDb().delete(messages).where(eq(messages.sessionId, sessionId)).run()
  },

  /** 统计会话消息数 */
  countBySession(sessionId: string): number {
    const row = getDb()
      .select({ c: sql<number>`count(*)` })
      .from(messages)
      .where(eq(messages.sessionId, sessionId))
      .get()
    return row?.c ?? 0
  },
}
