import { calculateElapsedHours } from './reviewUtils' export interface EditValidationResult { canEditStage1: boolean canEditStage2: boolean canEditStage3: boolean canAddStage2: boolean canAddStage3: boolean canEditText: boolean canChangeFragrance: boolean error?: string } /** * Determines what stages can be edited based on review state and elapsed time */ export function validateEditPermissions(review: any): EditValidationResult { const elapsed = calculateElapsedHours(review.createdAt) // Text and fragrance can ALWAYS be edited const canEditText = true const canChangeFragrance = true // After 24 hours, ratings/stages cannot be edited if (elapsed >= 24) { return { canEditStage1: false, canEditStage2: false, canEditStage3: false, canAddStage2: false, canAddStage3: false, canEditText, canChangeFragrance, error: 'Stage ratings cannot be edited after 24 hours' } } const hasStage1 = !!(review.openingRating && review.openingProjection) const hasStage2 = !!(review.drydownRating && review.midProjection && review.sillage) const hasStage3 = !!(review.endRating && review.complexity && review.longevity && review.overallRating) // Stage 1 can always be edited within 24 hours const canEditStage1 = hasStage1 // Stage 2 can be edited if it exists, or added after 1.5 hours const canEditStage2 = hasStage2 const canAddStage2 = !hasStage2 && elapsed >= 1.5 // Stage 3 can be edited if it exists, or added after 4 hours const canEditStage3 = hasStage3 const canAddStage3 = !hasStage3 && elapsed >= 4 return { canEditStage1, canEditStage2, canEditStage3, canAddStage2, canAddStage3, canEditText, canChangeFragrance } } /** * Validates that a stage update is allowed based on timing and current state */ export function validateStageUpdate( review: any, stage: 'stage1' | 'stage2' | 'stage3' ): { valid: boolean; error?: string } { const permissions = validateEditPermissions(review) if (permissions.error) { return { valid: false, error: permissions.error } } if (stage === 'stage1') { // Stage 1 can always be edited within 24 hours if (!permissions.canEditStage1) { return { valid: false, error: 'Stage 1 cannot be edited after 24 hours' } } } if (stage === 'stage2') { if (!permissions.canEditStage2 && !permissions.canAddStage2) { const elapsed = calculateElapsedHours(review.createdAt) if (elapsed < 1.5) { const minsRemaining = Math.ceil((1.5 - elapsed) * 60) return { valid: false, error: `Heart notes are available in ${minsRemaining} minutes` } } return { valid: false, error: 'Stage 2 cannot be updated at this time' } } } if (stage === 'stage3') { if (!permissions.canEditStage3 && !permissions.canAddStage3) { const elapsed = calculateElapsedHours(review.createdAt) if (elapsed < 4) { const minsRemaining = Math.ceil((4 - elapsed) * 60) return { valid: false, error: `Final notes are available in ${minsRemaining} minutes` } } const hasStage2 = !!(review.drydownRating && review.midProjection && review.sillage) if (!hasStage2) { return { valid: false, error: 'Stage 2 must be completed before adding Stage 3' } } return { valid: false, error: 'Stage 3 cannot be updated at this time' } } } return { valid: true } } /** * Check if review's fragrance connection can be changed * This is allowed at ANY time, even after 24 hours when other edits are locked */ export function canChangeFragrance(_review: any): boolean { return true // Always allowed }