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

/**
 * Marketplace Repository。封装 marketplace_templates 表的所有查询。
 *
 * 设计约定：
 * - 返回类型由 drizzle 推断，消费方不再写 `as Record<string, unknown>`
 * - 改名/删除均带 owner 校验（owner-only 语义）
 * - 时间刷新统一用 nowExpr()
 *
 * 来源路由：
 *   - GET/POST /api/marketplace
 *   - PATCH/DELETE /api/marketplace/[id]
 *   - POST /api/marketplace/save-from-workspace
 */

export const marketplaceRepo = {
  /** 列出 owner 的所有模板，按 updated_at 倒序（GET /api/marketplace） */
  listByOwner(ownerUserId: string) {
    return getDb()
      .select()
      .from(marketplaceTemplates)
      .where(eq(marketplaceTemplates.ownerUserId, ownerUserId))
      .orderBy(desc(marketplaceTemplates.updatedAt))
      .all()
  },

  /** 按 id 查（POST 创建后回读） */
  findById(id: string) {
    return getDb()
      .select()
      .from(marketplaceTemplates)
      .where(eq(marketplaceTemplates.id, id))
      .get()
  },

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

  /** 创建模板（POST /api/marketplace、save-from-workspace） */
  create(data: { id: string; name: string; ownerUserId: string }) {
    getDb()
      .insert(marketplaceTemplates)
      .values({
        id: data.id,
        name: data.name,
        ownerUserId: data.ownerUserId,
      })
      .run()
    return this.findById(data.id)
  },

  /** 改名（PATCH /api/marketplace/[id]，owner-only），返回更新后的行 */
  rename(id: string, ownerUserId: string, name: string) {
    getDb()
      .update(marketplaceTemplates)
      .set({ name, updatedAt: nowExpr() })
      .where(
        and(
          eq(marketplaceTemplates.id, id),
          eq(marketplaceTemplates.ownerUserId, ownerUserId),
        ),
      )
      .run()
    return this.findById(id)
  },

  /** 刷新 updated_at（文件写入后通知模板变更，owner-scoped 防越权） */
  touch(id: string, ownerUserId: string) {
    getDb()
      .update(marketplaceTemplates)
      .set({ updatedAt: nowExpr() })
      .where(
        and(
          eq(marketplaceTemplates.id, id),
          eq(marketplaceTemplates.ownerUserId, ownerUserId),
        ),
      )
      .run()
  },

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