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

const mockCreateInvoiceFromTemplate = vi.fn()

vi.mock('../src/middleware/guards', () => ({
  requirePermission: () => async (_c: unknown, next: () => Promise<void>) => next(),
}))

vi.mock('../src/middleware/auth', () => ({
  authMiddleware: async (_c: unknown, next: () => Promise<void>) => next(),
}))

vi.mock('../src/middleware/require-module-enabled', () => ({
  requireModuleEnabled: () => async (_c: unknown, next: () => Promise<void>) => next(),
}))

vi.mock('../src/middleware/bump-financials-version', () => ({
  bumpFinancialsVersionOnWrite: async (_c: unknown, next: () => Promise<void>) => next(),
}))

vi.mock('@zync/db/queries', async () => {
  const actual = await vi.importActual<Record<string, unknown>>('@zync/db/queries')
  return {
    ...actual,
    createInvoiceFromTemplate: (...args: unknown[]) => mockCreateInvoiceFromTemplate(...args),
  }
})

import { invoiceRoutes } from '../src/routes/invoices/index'

function appForInvoices(session: Record<string, unknown>) {
  const app = new Hono<AppEnv>()
  app.use('*', async (c, next) => {
    c.set('session', session)
    c.set('db', {})
    await next()
  })
  app.route('/api/invoices', invoiceRoutes)
  return app
}

describe('invoice draft library route aliases', () => {
  beforeEach(() => {
    vi.clearAllMocks()
    mockCreateInvoiceFromTemplate.mockResolvedValue({
      id: 'draft-1',
      customerId: '11111111-1111-1111-1111-111111111111',
      currency: 'ILS',
      total: '1200.00',
    })
  })

  it('accepts POST /api/invoices/from-template/:id with snake_case customer_id', async () => {
    const res = await appForInvoices({
      type: 'user',
      sub: 'user-1',
      tid: 'tenant-1',
      permissions: ['invoices:write'],
    }).request(
      '/api/invoices/from-template/template-1',
      {
        method: 'POST',
        body: JSON.stringify({
          customer_id: '11111111-1111-1111-1111-111111111111',
        }),
        headers: { 'content-type': 'application/json' },
      },
      {} as AppEnv['Bindings'],
    )

    expect(res.status).toBe(201)
    expect(mockCreateInvoiceFromTemplate).toHaveBeenCalledWith(
      {},
      'tenant-1',
      'user-1',
      'template-1',
      { customerId: '11111111-1111-1111-1111-111111111111' },
    )
  })
})
