import { SupportUploadFileTypes } from '@/app/components/workflow/types'
import { TransferMethod } from '@/types/app'
import { buildInitialFeatures, buildTriggerStatusMap, coerceReplayUserInputs } from '../utils'

describe('workflow-app utils', () => {
  it('should map trigger statuses to enabled and disabled states', () => {
    expect(
      buildTriggerStatusMap([
        { node_id: 'node-1', status: 'enabled' },
        { node_id: 'node-2', status: 'disabled' },
        { node_id: 'node-3', status: 'paused' },
      ]),
    ).toEqual({
      'node-1': 'enabled',
      'node-2': 'disabled',
      'node-3': 'disabled',
    })
  })

  it('should coerce replay run inputs, omit sys keys, and stringify complex values', () => {
    expect(
      coerceReplayUserInputs({
        'sys.query': 'hidden',
        query: 'hello',
        count: 3,
        enabled: true,
        nullable: null,
        metadata: { nested: true },
      }),
    ).toEqual({
      query: 'hello',
      count: 3,
      enabled: true,
      nullable: '',
      metadata: '{"nested":true}',
    })
    expect(coerceReplayUserInputs('invalid')).toBeNull()
    expect(coerceReplayUserInputs(null)).toBeNull()
  })

  it('should build initial features with file-upload and feature fallbacks', () => {
    const result = buildInitialFeatures(
      {
        file_upload: {
          enabled: true,
          allowed_file_types: [SupportUploadFileTypes.image],
          allowed_file_extensions: ['.png'],
          allowed_file_upload_methods: [TransferMethod.local_file],
          number_limits: 2,
          image: {
            enabled: true,
            number_limits: 5,
            transfer_methods: [TransferMethod.remote_url],
          },
        },
        opening_statement: 'hello',
        suggested_questions: ['Q1'],
        suggested_questions_after_answer: { enabled: true },
        speech_to_text: { enabled: true },
        text_to_speech: { enabled: true },
        retriever_resource: { enabled: true },
        sensitive_word_avoidance: { enabled: true },
      },
      { enabled: true } as never,
    )

    expect(result).toMatchObject({
      file: {
        enabled: true,
        allowed_file_types: [SupportUploadFileTypes.image],
        allowed_file_extensions: ['.png'],
        allowed_file_upload_methods: [TransferMethod.local_file],
        number_limits: 2,
        fileUploadConfig: { enabled: true },
        image: {
          enabled: true,
          number_limits: 5,
          transfer_methods: [TransferMethod.remote_url],
        },
      },
      opening: {
        enabled: true,
        opening_statement: 'hello',
        suggested_questions: ['Q1'],
      },
      suggested: { enabled: true },
      speech2text: { enabled: true },
      text2speech: { enabled: true },
      citation: { enabled: true },
      moderation: { enabled: true },
    })
  })
})
