import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { safeOperationDetail } from '@/lib/domain/operation-log'

const mocks = vi.hoisted(() => ({
  createAdminClient: vi.fn(),
  sendPlatformEmail: vi.fn(),
  logOperationEvent: vi.fn(),
}))
vi.mock('server-only', () => ({}))
vi.mock('@/lib/supabase/admin', () => ({ createAdminClient: mocks.createAdminClient }))
vi.mock('@/lib/email/send', () => ({ sendPlatformEmail: mocks.sendPlatformEmail }))
vi.mock('@/lib/observability/operation-events', () => ({ logOperationEvent: mocks.logOperationEvent }))

import { sendPermitDimensionAlerts } from '@/lib/data/permit-dimension-alert'
import type { ComputedWarning } from '@/lib/domain/warnings'
import type { Permit, Trip } from '@/types/db'

beforeEach(() => vi.stubEnv('WORKSPACE_DIMENSION_ALERTS_ENABLED', 'true'))
afterEach(() => { vi.clearAllMocks(); vi.unstubAllEnvs() })

describe('operations logging', () => {
  it('does not reserve or send a dimension email while paused', async () => {
    vi.stubEnv('WORKSPACE_DIMENSION_ALERTS_ENABLED', 'false')
    const result = await sendPermitDimensionAlerts({
      trip: { id: 'trip-1', ref_code: 'HH-20102137' } as Trip,
      permit: { id: 'permit-1', state_code: 'SC' } as Permit,
      warnings: [{ kind: 'dimension_mismatch', severity: 'danger', message: 'SC: permit width is smaller' }],
      origin: 'https://heavyhaulagent.com',
    })
    expect(result).toEqual({ sent: 0, skipped: 0, failed: 0 })
    expect(mocks.createAdminClient).not.toHaveBeenCalled()
    expect(mocks.sendPlatformEmail).not.toHaveBeenCalled()
    expect(mocks.logOperationEvent).toHaveBeenCalledWith(expect.objectContaining({
      event: 'dimension_alert_checked', outcome: 'skipped',
      detail: expect.objectContaining({ reason: 'dimension_alert_paused', mismatch_count: 1 }),
    }))
  })
  it('redacts sensitive fields and bounds stored values', () => {
    expect(safeOperationDetail({ secret_token: 'abc', permit_url: 'https://example.com/private', reason: 'x'.repeat(350) }))
      .toEqual({ secret_token: '[REDACTED]', permit_url: '[REDACTED]', reason: 'x'.repeat(300) })
  })

  it('records that a matching permit required no alert', async () => {
    const result = await sendPermitDimensionAlerts({
      trip: { id: 'trip-1', ref_code: 'HH-20102137' } as Trip,
      permit: { id: 'permit-1', state_code: 'SC' } as Permit,
      warnings: [],
      origin: 'https://heavyhaulagent.com',
    })
    expect(result).toEqual({ sent: 0, skipped: 0, failed: 0 })
    expect(mocks.createAdminClient).not.toHaveBeenCalled()
    expect(mocks.logOperationEvent).toHaveBeenCalledWith(expect.objectContaining({
      area: 'permit', event: 'dimension_alert_checked', outcome: 'skipped',
      detail: expect.objectContaining({ reason: 'no_dimension_mismatch', mismatch_count: 0 }),
    }))
  })

  it('records why a dimension mismatch had no recipients', async () => {
    const participants = [{ email: 'dispatch@example.com', role: 'dispatcher', status: 'imported', user_id: null }]
    mocks.createAdminClient.mockReturnValue({
      from: vi.fn(() => ({ select: () => ({ eq: () => ({ in: async () => ({ data: participants, error: null }) }) }) })),
    })
    const warnings: ComputedWarning[] = [{ kind: 'dimension_mismatch', severity: 'danger', message: 'SC: permit width is smaller' }]
    const result = await sendPermitDimensionAlerts({
      trip: { id: 'trip-1', ref_code: 'HH-20102137' } as Trip,
      permit: { id: 'permit-1', state_code: 'SC' } as Permit,
      warnings,
      origin: 'https://heavyhaulagent.com',
    })

    expect(result).toEqual({ sent: 0, skipped: 0, failed: 0 })
    expect(mocks.sendPlatformEmail).not.toHaveBeenCalled()
    expect(mocks.logOperationEvent).toHaveBeenCalledWith(expect.objectContaining({
      area: 'permit', event: 'dimension_alert_checked', outcome: 'skipped',
      detail: expect.objectContaining({ reason: 'no_eligible_recipients', mismatch_count: 1, imported_contacts: 1 }),
    }))
  })

  it('records a successful alert delivery with its recipient count', async () => {
    mocks.createAdminClient.mockReturnValue({
      from: vi.fn((table: string) => table === 'trip_participants'
        ? { select: () => ({ eq: () => ({ in: async () => ({ data: [{ email: 'broker@example.com', role: 'broker', status: 'active', user_id: null }], error: null }) }) }) }
        : { insert: () => ({ select: () => ({ single: async () => ({ data: { id: 'reservation-1' }, error: null }) }) }), update: () => ({ eq: async () => ({ error: null }) }) }),
    })
    mocks.sendPlatformEmail.mockResolvedValue({ status: 'sent', messageId: 'message-1' })
    const result = await sendPermitDimensionAlerts({
      trip: { id: 'trip-1', ref_code: 'HH-20102137' } as Trip,
      permit: { id: 'permit-1', state_code: 'SC', permit_number: 'SC-123' } as Permit,
      warnings: [{ kind: 'dimension_mismatch', severity: 'danger', message: 'SC: permit width is smaller' }],
      origin: 'https://heavyhaulagent.com',
    })

    expect(result).toEqual({ sent: 1, skipped: 0, failed: 0 })
    expect(mocks.logOperationEvent).toHaveBeenCalledWith(expect.objectContaining({
      area: 'permit', event: 'dimension_alert_checked', outcome: 'success',
      detail: expect.objectContaining({ reason: 'sent', eligible_recipients: 1, sent: 1 }),
    }))
  })
})
