import type { ImpactValue } from 'axe-core'; import { IMPACT_SCORES, COMPLIANCE_THRESHOLDS, WCAG_TAGS } from './constants'; import type { AccessibilityScanResult, ScanSummary, WCAGLevel } from './types'; export function calculateComplianceScore(result: AccessibilityScanResult): number { const { violations, passes } = result; const totalChecks = violations.length + passes.length; if (totalChecks === 0) return 100; let weightedViolations = 0; violations.forEach(violation => { const impactScore = IMPACT_SCORES[violation.impact as keyof typeof IMPACT_SCORES] || 50; weightedViolations += (impactScore / 100) * violation.nodes.length; }); const score = Math.max(0, 100 - (weightedViolations / totalChecks) * 100); return Math.round(score * 100) / 100; } export function isCompliantWithLevel(score: number, level: WCAGLevel['level']): boolean { return score >= COMPLIANCE_THRESHOLDS[level] * 100; } export function getWCAGTags(level: WCAGLevel): string[] { const key = `WCAG_${level.version.replace('.', '_')}_${level.level}` as keyof typeof WCAG_TAGS; return [...(WCAG_TAGS[key] || [])]; } export function summarizeViolations(violations: AccessibilityScanResult['violations']): Partial { const summary = { criticalIssues: 0, seriousIssues: 0, moderateIssues: 0, minorIssues: 0, }; violations.forEach(violation => { const count = violation.nodes.length; switch (violation.impact) { case 'critical': summary.criticalIssues += count; break; case 'serious': summary.seriousIssues += count; break; case 'moderate': summary.moderateIssues += count; break; case 'minor': summary.minorIssues += count; break; } }); return summary; } export function generateFixSuggestion(violationId: string): string { const suggestions: Record = { 'color-contrast': 'Increase the contrast ratio between text and background colors to meet WCAG standards.', 'image-alt': 'Add descriptive alt text to images. Use alt="" for decorative images.', 'label': 'Add labels to form controls using