import { Hono } from 'hono'
import { getContractTenantScoped } from '@zync/db/queries'
import type { AppEnv } from '../../types'
import { portalAuthMiddleware, type PortalAuthVariables } from '../../middleware/portalAuth'
import { requirePortalVisibility } from './visibility'
import { signKbUrl } from '../../lib/kb-storage'

type PortalDataEnv = {
  Bindings: AppEnv['Bindings']
  Variables: PortalAuthVariables
}

export const portalContractsRoutes = new Hono<PortalDataEnv>()

portalContractsRoutes.use('*', portalAuthMiddleware)

portalContractsRoutes.get('/:id', async (c) => {
  const visibilityError = await requirePortalVisibility(c, 'show_contracts')
  if (visibilityError) return visibilityError
  const portal = c.get('portal')
  const db = c.get('db')
  const contract = await getContractTenantScoped(db, c.req.param('id'), portal.tenantId)
  if (!contract || contract.customerId !== portal.customerId || contract.status === 'draft') {
    return c.json({ error: 'Not found' }, 404)
  }

  const signedPdfUrl = contract.signedPdfR2Key
    ? await signKbUrl(c.env, contract.signedPdfR2Key, 900).catch(() => null)
    : null

  return c.json({
    contract: {
      id: contract.id,
      title: contract.title,
      status: contract.status,
      content: contract.content,
      signedAt: contract.signedAt?.toISOString() ?? null,
      sentAt: contract.sentAt?.toISOString() ?? null,
      signedPdfUrl,
    },
  }, 200)
})
