import { describe, expect, it, vi } from 'vitest'
import { Hono } from 'hono'
import type { SessionPayload } from '@zync/types'
import type { AppEnv } from '../src/types'

const mockListSequences = vi.fn()

vi.mock('../src/middleware/auth', () => ({
  authMiddleware: async (
    c: { set: (key: string, value: unknown) => void },
    next: () => Promise<void>,
  ) => {
    c.set('session', {
      sub: 'user-1',
      tid: 'tenant-1',
      role: 'OWNER',
      permissions: ['marketing:read', 'marketing:write'],
      tier: 'business',
      type: 'user',
      v: 1,
      enforce_2fa: false,
      two_factor_verified: true,
      exp: Math.floor(Date.now() / 1000) + 3600,
      iat: Math.floor(Date.now() / 1000),
    } satisfies SessionPayload)
    await next()
  },
}))

vi.mock('cloudflare:sockets', () => ({
  connect: vi.fn(),
}))

vi.mock('@zync/db/queries', async () => {
  const actual = await vi.importActual<typeof import('@zync/db/queries')>('@zync/db/queries')
  return {
    ...actual,
    createDb: vi.fn(() => ({})),
    listSequences: (...args: unknown[]) => mockListSequences(...args),
  }
})

import { routes } from '../src/routes'

function appWithRoutes() {
  const app = new Hono<AppEnv>()
  app.route('/api', routes)
  return app
}

describe('email sequences route surface', () => {
  it('serves the spec path GET /api/sequences', async () => {
    mockListSequences.mockResolvedValueOnce([])

    const res = await appWithRoutes().request('/api/sequences', { method: 'GET' }, {} as AppEnv['Bindings'])

    expect(res.status).toBe(200)
    expect(mockListSequences).toHaveBeenCalled()
  })
})
