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

/**
 * WebhookToken Repository。封装 webhook_tokens 表的所有查询。
 *
 * 设计约定：
 * - 返回类型由 drizzle 推断，消费方不再写 `as Record<string, unknown>`
 * - 动态字段 UPDATE 在本仓库内完成布尔→整数的归一化
 * - 时间刷新统一用 nowExpr()
 *
 * 来源路由：
 *   - GET/POST /api/webhook-tokens
 *   - DELETE/PATCH /api/webhook-tokens/[id]
 *   - lib/webhook/handler.ts（token 校验）
 */

/** PATCH 可更新字段。enabled 在路由层是 boolean，落库前归一化为 0/1。 */
export interface WebhookTokenUpdateFields {
  name?: string
  enabled?: boolean
}

export const webhookTokenRepo = {
  /** 列出用户的所有 webhook token，按 created_at 倒序（GET /api/webhook-tokens） */
  listByOwner(ownerUserId: string) {
    return getDb()
      .select({
        id: webhookTokens.id,
        name: webhookTokens.name,
        token: webhookTokens.token,
        enabled: webhookTokens.enabled,
        createdAt: webhookTokens.createdAt,
        updatedAt: webhookTokens.updatedAt,
      })
      .from(webhookTokens)
      .where(eq(webhookTokens.ownerUserId, ownerUserId))
      .orderBy(desc(webhookTokens.createdAt))
      .all()
  },

  /** 按 token 查启用中的记录（lib/webhook/handler.ts 的鉴权查询） */
  findEnabledByToken(token: string) {
    return getDb()
      .select({
        id: webhookTokens.id,
      })
      .from(webhookTokens)
      .where(and(eq(webhookTokens.token, token), eq(webhookTokens.enabled, 1)))
      .get()
  },

  /** 按 id + owner 查（PATCH/DELETE 前的存在性校验） */
  findByIdAndOwner(id: string, ownerUserId: string) {
    return getDb()
      .select()
      .from(webhookTokens)
      .where(and(eq(webhookTokens.id, id), eq(webhookTokens.ownerUserId, ownerUserId)))
      .get()
  },

  /** 按 id 查（不限 owner，内部用） */
  findById(id: string) {
    return getDb().select().from(webhookTokens).where(eq(webhookTokens.id, id)).get()
  },

  /** 创建 webhook token。enabled 在 schema 层默认 1，这里与原 INSERT 保持一致 */
  create(data: { id: string; name: string; token: string; ownerUserId: string }) {
    getDb()
      .insert(webhookTokens)
      .values({
        id: data.id,
        name: data.name,
        token: data.token,
        ownerUserId: data.ownerUserId,
      })
      .run()
    return this.findById(data.id)
  },

  /** 更新指定字段并刷新 updated_at（PATCH /api/webhook-tokens/[id]） */
  updateFields(id: string, ownerUserId: string, fields: WebhookTokenUpdateFields) {
    const set: Partial<typeof webhookTokens.$inferInsert> = {}
    if (fields.name !== undefined) set.name = fields.name
    if (fields.enabled !== undefined) set.enabled = fields.enabled ? 1 : 0
    getDb()
      .update(webhookTokens)
      .set({ ...set, updatedAt: nowExpr() })
      .where(and(eq(webhookTokens.id, id), eq(webhookTokens.ownerUserId, ownerUserId)))
      .run()
    return this.findByIdAndOwner(id, ownerUserId)
  },

  /** 按 id + owner 删除（DELETE /api/webhook-tokens/[id]） */
  deleteByIdAndOwner(id: string, ownerUserId: string) {
    getDb()
      .delete(webhookTokens)
      .where(and(eq(webhookTokens.id, id), eq(webhookTokens.ownerUserId, ownerUserId)))
      .run()
  },
}
