import { createCompanyLeaveProgramContext } from './context'; import type { CompanyLeaveProgramContext, CompanyLeaveProgramResult, CompanyLeaveProgramDefinition, CompanyLeaveProgramDefinitionConfig, PolicyCondition, } from './types'; function asArray(value: PolicyCondition | PolicyCondition[] | undefined): PolicyCondition[] { if (value === undefined) { return []; } return Array.isArray(value) ? value : [value]; } export function defineCompanyLeaveProgram( config: CompanyLeaveProgramDefinitionConfig, ): CompanyLeaveProgramDefinition { const dependsOn = config.dependsOn === undefined ? [] : [...config.dependsOn]; const capabilities = config.capabilities === undefined ? [] : [...config.capabilities]; return { contractVersion: 'company_leave_program.v1', code: config.code, displayName: config.displayName, jurisdiction: { ...config.jurisdiction }, dependsOn, toResult( context: CompanyLeaveProgramContext = createCompanyLeaveProgramContext(), ): CompanyLeaveProgramResult { const result = config.evaluate(context); return { contractVersion: 'company_leave_program.v1', program: { code: config.code, displayName: config.displayName, ...(config.description === undefined ? {} : { description: config.description }), programKind: config.programKind ?? 'COMPANY_POLICY', jurisdiction: { ...config.jurisdiction }, dependsOn, capabilities, }, appliesTo: asArray(config.appliesTo?.(context)), eligibility: { conditions: result.conditions, requiredEvidence: result.requiredEvidence, }, ...(result.entitlement === undefined ? {} : { entitlement: result.entitlement }), pay: result.pay, requirements: result.requirements, jobProtection: result.jobProtection, diagnostics: result.diagnostics, }; }, }; }