import { describe, expect, it } from 'vitest'
import { evaluateConditionalLogic, validateConditionalDependencies } from './conditional.js'
import type { AnyFieldDefinition } from './schema.js'

const field=(type:AnyFieldDefinition['type'],key:string,conditionalLogic?:AnyFieldDefinition['conditionalLogic']):AnyFieldDefinition=>({type,key,name:key,label:key,settings:type==='number'?{}:{},...(conditionalLogic?{conditionalLogic}:{})} as AnyFieldDefinition)

describe('conditional rules',()=>{
  it('uses OR groups, AND members, repeated any/all, and missing-path semantics',()=>{
    const values={status:'draft',rows:[{rowId:'1',values:{score:2}},{rowId:'2',values:{score:8}}]}
    expect(evaluateConditionalLogic([
      [{fieldPath:['status'],operator:'eq',value:'published'}],
      [{fieldPath:['rows','score'],operator:'gte',value:8},{fieldPath:['missing'],operator:'empty'}],
    ],values)).toBe(true)
    expect(evaluateConditionalLogic([[{fieldPath:['rows','score'],operator:'gte',value:2,quantifier:'all'}]],values)).toBe(true)
    expect(evaluateConditionalLogic([[{fieldPath:['rows','score'],operator:'gt',value:2,quantifier:'all'}]],values)).toBe(false)
    expect(evaluateConditionalLogic([[{fieldPath:['missing'],operator:'neq',value:'x'}]],values)).toBe(true)
  })

  it('rejects operator/type mismatches and dependency cycles',()=>{
    expect(()=>validateConditionalDependencies([field('text','a',[[{fieldPath:['b'],operator:'gt',value:1}]]),field('text','b')])).toThrowError(expect.objectContaining({name:'FieldValidationError'}))
    expect(()=>validateConditionalDependencies([field('text','a',[[{fieldPath:['b'],operator:'eq',value:'x'}]]),field('text','b',[[{fieldPath:['a'],operator:'eq',value:'x'}]])])).toThrowError(expect.objectContaining({detail:'contains a dependency cycle'}))
  })
})
