import { afterEach, describe, expect, it, vi } from 'vitest'
import { mkdtemp, readFile, rm } from 'node:fs/promises'
import os from 'node:os'
import path from 'node:path'
import { logTripAiEvent, tripAiRequestId } from '@/lib/observability/trip-ai-log'

let tempDirectory = ''

afterEach(async () => {
  vi.restoreAllMocks()
  delete process.env.TRIP_AI_LOG_FILE
  delete process.env.TRIP_AI_LOG_MAX_BYTES
  if (tempDirectory) await rm(tempDirectory, { recursive: true, force: true })
  tempDirectory = ''
})

describe('Trip AI structured logger', () => {
  it('keeps a valid incoming correlation id', () => {
    const request = new Request('https://workspace.test', {
      headers: { 'X-Trip-AI-Request-ID': 'trace-12345678' },
    })
    expect(tripAiRequestId(request)).toBe('trace-12345678')
  })

  it('redacts content and secrets while preserving useful counts', async () => {
    tempDirectory = await mkdtemp(path.join(os.tmpdir(), 'trip-ai-log-'))
    const output = path.join(tempDirectory, 'events.jsonl')
    process.env.TRIP_AI_LOG_FILE = output
    vi.spyOn(console, 'info').mockImplementation(() => undefined)

    await logTripAiEvent('test_event', {
      request_id: 'trace-12345678',
      question: 'private question',
      answer: 'private answer',
      authorization: 'Bearer secret',
      question_chars: 16,
      answer_chars: 14,
    })

    const record = JSON.parse((await readFile(output, 'utf8')).trim())
    expect(record.question).toBe('[REDACTED]')
    expect(record.answer).toBe('[REDACTED]')
    expect(record.authorization).toBe('[REDACTED]')
    expect(record.question_chars).toBe(16)
    expect(record.answer_chars).toBe(14)
  })
})
