import type { IntakeConfig, FilterConfig, EvaluationConfig, SelectionConfig, LiveFinalConfig, ResultsConfig, WizardStageConfig, WizardTrackConfig, WizardState, } from '@/types/pipeline-wizard' export function defaultIntakeConfig(): IntakeConfig { return { submissionWindowEnabled: true, lateSubmissionPolicy: 'flag', lateGraceHours: 24, fileRequirements: [ { name: 'Executive Summary', description: 'A PDF executive summary of your project', acceptedMimeTypes: ['application/pdf'], maxSizeMB: 50, isRequired: true, }, ], } } export function defaultFilterConfig(): FilterConfig { return { rules: [], aiRubricEnabled: false, aiConfidenceThresholds: { high: 0.85, medium: 0.6, low: 0.4 }, manualQueueEnabled: true, } } export function defaultEvaluationConfig(): EvaluationConfig { return { requiredReviews: 3, maxLoadPerJuror: 20, minLoadPerJuror: 5, availabilityWeighting: true, overflowPolicy: 'queue', } } export function defaultSelectionConfig(): SelectionConfig { return { finalistCount: undefined, rankingMethod: 'score_average', tieBreaker: 'admin_decides', } } export function defaultLiveConfig(): LiveFinalConfig { return { juryVotingEnabled: true, audienceVotingEnabled: false, audienceVoteWeight: 0, cohortSetupMode: 'manual', revealPolicy: 'ceremony', } } export function defaultResultsConfig(): ResultsConfig { return { publicationMode: 'manual', showDetailedScores: false, showRankings: true, } } function slugify(name: string): string { return name .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-|-$/g, '') } export function defaultMainTrackStages(): WizardStageConfig[] { return [ { name: 'Intake', slug: 'intake', stageType: 'INTAKE', sortOrder: 0, configJson: defaultIntakeConfig() as unknown as Record }, { name: 'Filtering', slug: 'filtering', stageType: 'FILTER', sortOrder: 1, configJson: defaultFilterConfig() as unknown as Record }, { name: 'Evaluation', slug: 'evaluation', stageType: 'EVALUATION', sortOrder: 2, configJson: defaultEvaluationConfig() as unknown as Record }, { name: 'Selection', slug: 'selection', stageType: 'SELECTION', sortOrder: 3, configJson: defaultSelectionConfig() as unknown as Record }, { name: 'Live Finals', slug: 'live-finals', stageType: 'LIVE_FINAL', sortOrder: 4, configJson: defaultLiveConfig() as unknown as Record }, { name: 'Results', slug: 'results', stageType: 'RESULTS', sortOrder: 5, configJson: defaultResultsConfig() as unknown as Record }, ] } export function defaultMainTrack(): WizardTrackConfig { return { name: 'Main Competition', slug: 'main-competition', kind: 'MAIN', sortOrder: 0, stages: defaultMainTrackStages(), } } export function defaultAwardTrack(index: number): WizardTrackConfig { const name = `Award ${index + 1}` return { name, slug: slugify(name), kind: 'AWARD', sortOrder: index + 1, routingModeDefault: 'PARALLEL', decisionMode: 'JURY_VOTE', stages: [ { name: 'Evaluation', slug: 'evaluation', stageType: 'EVALUATION', sortOrder: 0, configJson: defaultEvaluationConfig() as unknown as Record }, { name: 'Results', slug: 'results', stageType: 'RESULTS', sortOrder: 1, configJson: defaultResultsConfig() as unknown as Record }, ], awardConfig: { name, scoringMode: 'PICK_WINNER' }, } } export function defaultNotificationConfig(): Record { return { 'stage.transitioned': true, 'filtering.completed': true, 'assignment.generated': true, 'routing.executed': true, 'live.cursor.updated': true, 'cohort.window.changed': true, 'decision.overridden': true, 'award.winner.finalized': true, } } export function defaultWizardState(programId: string): WizardState { return { name: '', slug: '', programId, settingsJson: {}, tracks: [defaultMainTrack()], notificationConfig: defaultNotificationConfig(), overridePolicy: { allowedRoles: ['SUPER_ADMIN', 'PROGRAM_ADMIN'] }, } }