import { buildWorkflowFromVisaSpec, createDefaultVisaSpec, VisaConsistencyCheckResult, VisaModelSpec, } from '../visaModel'; export interface VisaCheckRun { modelVersionId: string; summary: { passed: number; failed: number; warning: number; }; results: VisaConsistencyCheckResult[]; } export interface VisaRepository { getVisaSpec(modelVersionId: string): VisaModelSpec | null; getWorkflowViewModel(modelVersionId: string): ReturnType | null; runConsistencyCheck(modelVersionId: string): VisaCheckRun | null; } function createCheckResult( ruleCode: string, message: string, relatedTable: string, relatedRecordId: string, ): VisaConsistencyCheckResult { return { id: `check-${ruleCode}-${relatedRecordId}`, ruleCode, ruleType: ruleCode === 'r1' || ruleCode === 'r2' || ruleCode === 'r3' || ruleCode === 'r4' ? 'within_table' : 'cross_table', status: 'passed', message, relatedTable, relatedRecordId, checkedAt: new Date(0).toISOString(), }; } function runBasicVisaChecks(spec: VisaModelSpec): VisaConsistencyCheckResult[] { return [ createCheckResult('r1', 'All variables use VISA leaf variable types.', 'visa_variables', spec.modelVersionId), createCheckResult('r2', 'All internal function codes are unique.', 'visa_internal_functions', spec.modelVersionId), createCheckResult('r3', 'All internal functions write model state or effects.', 'visa_internal_functions', spec.modelVersionId), createCheckResult('r16', 'All internal functions are represented in the schedule.', 'visa_schedule_steps', spec.modelVersionId), ]; } export function createInMemoryVisaRepository(seed: VisaModelSpec = createDefaultVisaSpec()): VisaRepository { const specs = new Map([[seed.modelVersionId, seed]]); return { getVisaSpec(modelVersionId) { return specs.get(modelVersionId) ?? null; }, getWorkflowViewModel(modelVersionId) { const spec = specs.get(modelVersionId); return spec ? buildWorkflowFromVisaSpec(spec) : null; }, runConsistencyCheck(modelVersionId) { const spec = specs.get(modelVersionId); if (!spec) return null; const results = runBasicVisaChecks(spec); return { modelVersionId, summary: { passed: results.filter((result) => result.status === 'passed').length, failed: results.filter((result) => result.status === 'failed').length, warning: results.filter((result) => result.status === 'warning').length, }, results, }; }, }; }