/**
 * Customer communications API routes — customers module (Task 7).
 *
 * GET  /api/customers/:id/communications   list (cursor-paginated, newest-first)
 * POST /api/customers/:id/communications   create: send outbound email OR save internal note
 *
 * Outbound email (direction=outbound, channel=email): enqueues send via adapter + persists row.
 * Internal note (direction=internal, channel=note): persists row only, no send.
 */
import { Hono } from 'hono'
import { appendCustomerCommunication, listCommunications } from '@zync/db/queries'
import type { AppEnv } from '../../types'
import { requirePermission } from '../../middleware/guards'
import { createCommunicationSchema } from '../../schemas/customers'
import { sendCustomerEmail } from '../../adapters/email-customers'

export const communicationsRoute = new Hono<AppEnv>()

// GET /api/customers/:id/communications
communicationsRoute.get(
  '/:id/communications',
  requirePermission('customers:read'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const url = new URL(c.req.url)
    const cursor = url.searchParams.get('cursor') ?? undefined
    const limitParam = url.searchParams.get('limit')
    const limit = limitParam ? Math.min(parseInt(limitParam, 10) || 50, 100) : 50

    const db = c.get('db')
    const page = await listCommunications(db, session.tid, c.req.param('id'), {
      cursor,
      limit,
    })
    return c.json(page, 200)
  },
)

// POST /api/customers/:id/communications
communicationsRoute.post(
  '/:id/communications',
  requirePermission('customers:write'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const parsed = createCommunicationSchema.safeParse(await c.req.json())
    if (!parsed.success) {
      return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 400)
    }

    const { direction, channel, subject, body, toAddress } = parsed.data
    const customerId = c.req.param('id')
    const tenantId = session.tid

    // Outbound email: send via adapter then persist
    if (direction === 'outbound' && channel === 'email') {
      await sendCustomerEmail(c.env, {
        to: toAddress!,
        subject: subject ?? '(no subject)',
        body: body ?? '',
        tenantId,
        customerId,
        sentBy: session.sub,
      })
    }

    const db = c.get('db')
    const communication = await appendCustomerCommunication(db, tenantId, customerId, {
      direction,
      channel,
      subject: subject ?? null,
      body: body ?? null,
      fromAddress: null, // tenant sending address resolved by email adapter
      toAddress: toAddress ?? null,
      relatedId: null,
      relatedType: null,
      createdBy: session.sub,
    })

    return c.json(communication, 201)
  },
)
