import { DQRule } from '../models/dq-rules.model'
import { getNotNullDefault } from '../utils/getNotNullDefault'

describe('DC Validator - getNotNullDefault', () => {
  const dqRules: DQRule[] = [
    {
      BASE_COL: 'TEXT_COL',
      RULE_TYPE: 'NOTNULL',
      RULE_VALUE: 'default_text',
      X: 1
    },
    { BASE_COL: 'NUM_COL', RULE_TYPE: 'NOTNULL', RULE_VALUE: '42', X: 1 },
    { BASE_COL: 'EMPTY_RULE', RULE_TYPE: 'NOTNULL', RULE_VALUE: '  ', X: 1 },
    {
      BASE_COL: 'OTHER_COL',
      RULE_TYPE: 'HARDSELECT',
      RULE_VALUE: 'some_value',
      X: 1
    }
  ]

  it('should return string value for text columns', () => {
    expect(getNotNullDefault('TEXT_COL', dqRules, 'text')).toEqual(
      'default_text'
    )
  })

  it('should return number for numeric columns when RULE_VALUE is numeric', () => {
    expect(getNotNullDefault('NUM_COL', dqRules, 'numeric')).toEqual(42)
  })

  it('should return string for numeric columns when RULE_VALUE is not numeric', () => {
    const rulesWithNonNumeric: DQRule[] = [
      {
        BASE_COL: 'NUM_COL',
        RULE_TYPE: 'NOTNULL',
        RULE_VALUE: 'not_a_number',
        X: 1
      }
    ]
    expect(
      getNotNullDefault('NUM_COL', rulesWithNonNumeric, 'numeric')
    ).toEqual('not_a_number')
  })

  it('should return undefined for empty RULE_VALUE', () => {
    expect(getNotNullDefault('EMPTY_RULE', dqRules, 'text')).toBeUndefined()
  })

  it('should return undefined for columns without NOTNULL rule', () => {
    expect(getNotNullDefault('OTHER_COL', dqRules, 'text')).toBeUndefined()
  })

  it('should return undefined for non-existent columns', () => {
    expect(getNotNullDefault('MISSING_COL', dqRules, 'text')).toBeUndefined()
  })

  it('should return undefined for empty dqRules array', () => {
    expect(getNotNullDefault('TEXT_COL', [], 'text')).toBeUndefined()
  })

  it('should return string when colType is undefined', () => {
    expect(getNotNullDefault('NUM_COL', dqRules, undefined)).toEqual('42')
  })
})
