import { getDb } from '../client'
import { externalUsers } from '../schema'
import { eq, and, desc } from 'drizzle-orm'
import { nowExpr } from '../shared/dialect-helpers'

/**
 * External User Repository — external_users 表的 CRUD。
 */

export const externalUserRepo = {
  /** 按 id 查 */
  findById(id: string) {
    return getDb().select().from(externalUsers).where(eq(externalUsers.id, id)).get()
  },

  /** 按 owner + phone 查（跨渠道关联用） */
  findByOwnerAndPhone(ownerUserId: string, phone: string) {
    if (!phone) return undefined
    return getDb()
      .select()
      .from(externalUsers)
      .where(and(eq(externalUsers.ownerUserId, ownerUserId), eq(externalUsers.phone, phone)))
      .get()
  },

  /** 列出 owner 的全部外部用户（按 last_active_at 倒序） */
  listByOwner(ownerUserId: string) {
    return getDb()
      .select()
      .from(externalUsers)
      .where(eq(externalUsers.ownerUserId, ownerUserId))
      .orderBy(desc(externalUsers.lastActiveAt))
      .all()
  },

  /** 创建外部用户 */
  create(data: {
    id: string
    ownerUserId: string
    displayName?: string
    avatarUrl?: string
    phone?: string
  }) {
    getDb()
      .insert(externalUsers)
      .values({
        id: data.id,
        ownerUserId: data.ownerUserId,
        displayName: data.displayName ?? '',
        avatarUrl: data.avatarUrl ?? '',
        phone: data.phone || null,
      })
      .run()
    return this.findById(data.id)
  },

  /** 更新字段并刷新 updated_at */
  updateFields(id: string, fields: Partial<typeof externalUsers.$inferInsert>) {
    getDb()
      .update(externalUsers)
      .set({ ...fields, updatedAt: nowExpr() })
      .where(eq(externalUsers.id, id))
      .run()
    return this.findById(id)
  },

  /** 刷新 last_active_at（任意渠道活动时调用） */
  touchActive(id: string) {
    getDb()
      .update(externalUsers)
      .set({ lastActiveAt: nowExpr(), updatedAt: nowExpr() })
      .where(eq(externalUsers.id, id))
      .run()
  },

  /** 删除（级联 external_identities 由 service 事务承担） */
  deleteById(id: string) {
    getDb().delete(externalUsers).where(eq(externalUsers.id, id)).run()
  },
}
