import { describe, expect, it } from 'vitest'
import { runEnvList } from './run-list'

const stub = (overrides: Record<string, string> = {}) => (name: string) => overrides[name]

describe('runEnvList', () => {
  it('text: header is NAME VALUE DESCRIPTION', () => {
    const out = runEnvList({ lookup: stub() })
    expect(out.split('\n')[0]).toMatch(/^NAME\s+VALUE\s+DESCRIPTION$/)
  })

  it('text: <unset> for unset non-sensitive var', () => {
    const out = runEnvList({ lookup: stub() })
    const hostLine = out.split('\n').find(l => l.startsWith('DIFY_HOST'))!
    expect(hostLine).toContain('<unset>')
  })

  it('text: prints actual value for set non-sensitive var', () => {
    const out = runEnvList({ lookup: stub({ DIFY_HOST: 'https://acme' }) })
    const hostLine = out.split('\n').find(l => l.startsWith('DIFY_HOST'))!
    expect(hostLine).toContain('https://acme')
  })

  it('text: <set> for set sensitive var (token never echoed)', () => {
    const out = runEnvList({ lookup: stub({ DIFY_TOKEN: 'dfoa_secret' }) })
    const tokLine = out.split('\n').find(l => l.startsWith('DIFY_TOKEN'))!
    expect(tokLine).toContain('<set>')
    expect(tokLine).not.toContain('dfoa_secret')
  })

  it('text: <unset> for unset sensitive var', () => {
    const out = runEnvList({ lookup: stub() })
    const tokLine = out.split('\n').find(l => l.startsWith('DIFY_TOKEN'))!
    expect(tokLine).toContain('<unset>')
  })

  it('text: rows are sorted alphabetically by name', () => {
    const out = runEnvList({ lookup: stub() })
    const lines = out.trim().split('\n').slice(1).map(l => l.split(/\s+/)[0])
    const sorted = [...lines].sort()
    expect(lines).toEqual(sorted)
  })

  it('json: emits array with name/description/sensitive/value fields', () => {
    const out = runEnvList({ json: true, lookup: stub({ DIFY_HOST: 'https://acme', DIFY_TOKEN: 'dfoa_x' }) })
    const parsed = JSON.parse(out) as Array<{ name: string, sensitive: boolean, value: string }>
    expect(parsed.length).toBeGreaterThan(0)
    const host = parsed.find(r => r.name === 'DIFY_HOST')!
    expect(host.sensitive).toBe(false)
    expect(host.value).toBe('https://acme')
    const tok = parsed.find(r => r.name === 'DIFY_TOKEN')!
    expect(tok.sensitive).toBe(true)
    expect(tok.value).toBe('<set>')
  })

  it('json: trailing newline matches Go encoder.Encode', () => {
    const out = runEnvList({ json: true, lookup: stub() })
    expect(out.endsWith('\n')).toBe(true)
  })
})
