/**
 * Contract settings routes — settings-contracts (wave-13, P165).
 * Mounted at /api/settings/contracts.
 *
 * GET  / → ContractSettings (requires users:manage)
 * PATCH / → ContractSettings (requires users:manage)
 *   - E-signature-only fields are gated Business+:
 *     contract_default_signing_order, contract_require_email_verification,
 *     contract_reminder_first_days, contract_reminder_followup_days,
 *     contract_reminder_max_count
 *   - Contract defaults and renewal-reminder fields are available to all tiers.
 */
import { Hono } from 'hono'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requirePermission } from '../../middleware/guards'
import {
  getContractSettings,
  updateContractSettings,
  CrossTenantTemplateError,
} from '@zync/db/queries'
import { updateContractSettingsSchema } from '@zync/types'

// E-signature fields are gated Business+
const ESIG_FIELDS = new Set([
  'contract_default_signing_order',
  'contract_require_email_verification',
  'contract_reminder_first_days',
  'contract_reminder_followup_days',
  'contract_reminder_max_count',
])

const BUSINESS_PLUS_TIERS = new Set(['business', 'enterprise', 'white_label'])

export const contractSettingsRoute = new Hono<AppEnv>()

contractSettingsRoute.use('*', authMiddleware)

// ── GET /api/settings/contracts ───────────────────────────────────────────────

contractSettingsRoute.get('/', requirePermission('users:manage'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const db = c.get('db')
  const settings = await getContractSettings(db, session.tid)
  return c.json(settings, 200)
})

// ── PATCH /api/settings/contracts ────────────────────────────────────────────

contractSettingsRoute.patch('/', requirePermission('users:manage'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const body = await c.req.json().catch(() => null)
  const parsed = updateContractSettingsSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
  }

  // Enforce Business+ gate for e-signature-only fields
  const tenantTier = session.tier ?? 'freelancer'
  const isBusinessPlus = BUSINESS_PLUS_TIERS.has(tenantTier)
  if (!isBusinessPlus) {
    const patchKeys = Object.keys(parsed.data)
    const blockedKeys = patchKeys.filter((k) => ESIG_FIELDS.has(k))
    if (blockedKeys.length > 0) {
      return c.json(
        {
          error: 'Upgrade required',
          requiredTier: 'business',
          fields: blockedKeys,
        },
        403,
      )
    }
  }

  const db = c.get('db')
  try {
    const updated = await updateContractSettings(db, session.tid, session.sub, parsed.data)
    return c.json(updated, 200)
  } catch (err) {
    if (err instanceof CrossTenantTemplateError) {
      return c.json({ error: err.message }, 422)
    }
    throw err
  }
})
