import { sqliteTable, text, uniqueIndex, index } from 'drizzle-orm/sqlite-core'
import { sql } from 'drizzle-orm'

/**
 * 外部用户实体表。
 *
 * 一个外部用户 = 一个与 Forge Agent 对话的最终用户（非 owner）。
 * 归属于发现/管理他的 owner（ownerUserId），实现租户隔离。
 * 可关联多个渠道身份（飞书/小程序/H5/...），通过 external_identities 表。
 *
 * 跨渠道关联：同一 owner 下 phone 非空时唯一，作为跨渠道关联的主键。
 * phone 为 NULL 表示未关联（多个 NULL 不冲突）。
 */
export const externalUsers = sqliteTable(
  'external_users',
  {
    id: text('id').primaryKey(),
    ownerUserId: text('owner_user_id').notNull(),
    displayName: text('display_name').notNull().default(''),
    avatarUrl: text('avatar_url').notNull().default(''),
    /** 跨渠道关联键。NULL = 未关联。同一 owner 下 phone 非空时唯一。 */
    phone: text('phone'),
    status: text('status', { enum: ['active', 'blocked'] }).notNull().default('active'),
    /** JSON 扩展字段：标签、备注、来源等，避免频繁加列 */
    metadata: text('metadata').notNull().default('{}'),
    createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),
    updatedAt: text('updated_at').notNull().default(sql`(datetime('now'))`),
    /** 跨渠道最后活跃时间，任意渠道活动时刷新 */
    lastActiveAt: text('last_active_at').notNull().default(''),
  },
  (t) => ({
    ownerActiveIdx: index('idx_external_users_owner').on(t.ownerUserId, t.lastActiveAt),
    /** 部分唯一索引：只在 phone 非空时生效，避免多个未关联用户的空值冲突 */
    ownerPhoneIdx: uniqueIndex('idx_external_users_owner_phone').on(t.ownerUserId, t.phone).where(sql`${t.phone} IS NOT NULL`),
  }),
)

export type ExternalUser = typeof externalUsers.$inferSelect
export type NewExternalUser = typeof externalUsers.$inferInsert
