// Eval report document — ported from EvalReportDocument.tsx
import { Document } from '@react-pdf/renderer';
import { EvalReportCover } from './cover.js';
import { EvalReportMatrixPage } from './matrix-page.js';
import { EvalReportExamplePage } from './example-page.js';
import { EvalReportV2Cover } from './v2-cover.js';
import { EvalReportItemPage } from './item-page.js';
import { calculateWeightedScores } from '../scoring.js';
import type { MatrixData, WeightConfig, EvaluationResult } from './types.js';
// V1 report data (matrix-based)
export interface EvalReportDataV1 {
customerName: string;
reportDate: string;
matrixData: MatrixData;
weights: WeightConfig;
}
// V2 report data (per-item results)
export interface EvalReportDataV2 {
customerName: string;
reportDate: string;
v2Results: EvaluationResult[];
}
// Union type
export type EvalReportData = EvalReportDataV1 | EvalReportDataV2;
function isV2ReportData(data: EvalReportData): data is EvalReportDataV2 {
return 'v2Results' in data && Array.isArray(data.v2Results);
}
interface EvalReportDocumentProps {
data: EvalReportData;
}
export function EvalReportDocument({ data }: EvalReportDocumentProps) {
if (isV2ReportData(data)) {
return (
{data.v2Results.map((result, index) => (
))}
);
}
// V1 report
const weightedScores = calculateWeightedScores(data.matrixData, data.weights);
const highlights = {
totalQuestions: data.matrixData.rows.length,
totalRules: data.matrixData.evaluators.length,
overallScore: weightedScores.overall,
highSeverityScore: weightedScores.bySeverity.High.score,
mediumSeverityScore: weightedScores.bySeverity.Medium.score,
highCount: weightedScores.bySeverity.High.count,
mediumCount: weightedScores.bySeverity.Medium.count,
};
const matrixPageNumber = 2;
const exampleStartPage = 3;
return (
{data.matrixData.rows.map((row, index) => (
))}
);
}