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

/**
 * External Identity Repository — external_identities 表的 CRUD。
 * 类比 Better-Auth 的 account 表：一个 external_user 可关联多个 external_identity。
 */

export const externalIdentityRepo = {
  /** 按 (channelType, channelId, platformUserId) 精确查（身份解析快速路径） */
  findByChannelAndPlatformUser(channelType: string, channelId: string, platformUserId: string) {
    return getDb()
      .select()
      .from(externalIdentities)
      .where(
        and(
          eq(externalIdentities.channelType, channelType),
          eq(externalIdentities.channelId, channelId),
          eq(externalIdentities.platformUserId, platformUserId),
        ),
      )
      .get()
  },

  /** 列出某 external_user 的全部渠道身份 */
  listByExternalUser(externalUserId: string) {
    return getDb()
      .select()
      .from(externalIdentities)
      .where(eq(externalIdentities.externalUserId, externalUserId))
      .all()
  },

  /** 创建身份关联 */
  create(data: {
    id: string
    externalUserId: string
    channelType: string
    channelId?: string
    platformUserId: string
    platformName?: string
    platformAvatar?: string
  }) {
    getDb()
      .insert(externalIdentities)
      .values({
        id: data.id,
        externalUserId: data.externalUserId,
        channelType: data.channelType,
        channelId: data.channelId ?? '',
        platformUserId: data.platformUserId,
        platformName: data.platformName ?? '',
        platformAvatar: data.platformAvatar ?? '',
      })
      .run()
  },

  /** 更新渠道展示名/头像 */
  updatePlatformInfo(id: string, name: string, avatar: string) {
    getDb()
      .update(externalIdentities)
      .set({ platformName: name, platformAvatar: avatar, updatedAt: nowExpr() })
      .where(eq(externalIdentities.id, id))
      .run()
  },

  /** 删除某 external_user 的全部身份（删除外部用户时事务调用） */
  deleteByExternalUser(externalUserId: string) {
    getDb()
      .delete(externalIdentities)
      .where(eq(externalIdentities.externalUserId, externalUserId))
      .run()
  },
}
