import { eq } from 'drizzle-orm'
import type { Querier, Transaction } from '@platform-modules/db'
import type { Actor } from '@platform-modules/commerce-orders'
import {
  CommissionRateError,
  VendorAuthorizationError,
  VendorNotFoundError,
} from './errors.js'
import { vendor, type MarketplaceDbSchema } from './schema.js'
import { UUID_RE } from './types.js'

export async function resolveCommissionRate(
  q: Querier<MarketplaceDbSchema>,
  vendorId: string,
): Promise<number> {
  if (!UUID_RE.test(vendorId)) throw new VendorNotFoundError({ vendorId })

  const [row] = await q.select({ commissionBps: vendor.commissionBps }).from(vendor).where(eq(vendor.id, vendorId)).limit(1)
  if (!row) throw new VendorNotFoundError({ vendorId })
  return row.commissionBps
}

export async function setVendorCommissionRate(
  tx: Transaction<MarketplaceDbSchema>,
  vendorId: string,
  admin: Actor,
  bps: number,
): Promise<void> {
  if (!admin.isAdmin) throw new VendorAuthorizationError()
  // bps lands in an integer() column — reject fractional/NaN before it truncates silently.
  if (!Number.isInteger(bps) || bps < 0 || bps > 10000) throw new CommissionRateError({ bps })
  if (!UUID_RE.test(vendorId)) throw new VendorNotFoundError({ vendorId })

  const [row] = await tx.select({ id: vendor.id }).from(vendor).where(eq(vendor.id, vendorId)).limit(1)
  if (!row) throw new VendorNotFoundError({ vendorId })

  await tx
    .update(vendor)
    .set({ commissionBps: bps, updatedAt: new Date() })
    .where(eq(vendor.id, vendorId))
}
