import { useState } from 'react' import { FileText, User, Mail, HelpCircle, Zap, AlignLeft, Copy, Check, RotateCcw, ArrowLeftRight, Loader2 } from 'lucide-react' import { cn } from '@/lib/utils' import { toast } from '@/lib/toast' import type { StatusUpdateAudience, StatusUpdateLength, StatusUpdateContext, StatusUpdateResponse } from '@/types/ai-session' interface StatusUpdateModalProps { open: boolean onClose: () => void onGenerate: (audience: StatusUpdateAudience, length: StatusUpdateLength, context: StatusUpdateContext) => Promise context?: StatusUpdateContext hasPsaTicket?: boolean } const AUDIENCES: { value: StatusUpdateAudience; icon: typeof FileText; label: string; description: string; skipLength?: boolean }[] = [ { value: 'ticket_notes', icon: FileText, label: 'Ticket Notes', description: 'Technical, for your PSA' }, { value: 'client_update', icon: User, label: 'Client Update', description: 'Professional, non-technical' }, { value: 'email_draft', icon: Mail, label: 'Email Draft', description: 'Full email with subject line' }, { value: 'request_info', icon: HelpCircle, label: 'Request Information', description: 'Ask the client specific questions', skipLength: true }, ] const LENGTHS: { value: StatusUpdateLength; icon: typeof Zap; label: string; description: string }[] = [ { value: 'quick', icon: Zap, label: 'Quick', description: '1-2 sentences' }, { value: 'detailed', icon: AlignLeft, label: 'Detailed', description: 'Full breakdown' }, ] type ModalStep = 'audience' | 'length' | 'generating' | 'result' export function StatusUpdateModal({ open, onClose, onGenerate, context = 'status' }: StatusUpdateModalProps) { const [step, setStep] = useState('audience') const [audience, setAudience] = useState(null) const [length, setLength] = useState(null) const [result, setResult] = useState(null) const [copied, setCopied] = useState(false) const contextLabels: Record = { status: 'Share Status Update', resolution: 'Share Resolution', escalation: 'Share Escalation', } const handleAudienceSelect = async (value: StatusUpdateAudience) => { setAudience(value) const opt = AUDIENCES.find(a => a.value === value) if (opt?.skipLength) { // Skip length selection — always concise for request_info setLength('quick') setStep('generating') try { const res = await onGenerate(value, 'quick', context) setResult(res) setStep('result') } catch { setStep('audience') setAudience(null) } } else { setStep('length') } } const handleLengthSelect = async (value: StatusUpdateLength) => { if (!audience) return setLength(value) setStep('generating') try { const res = await onGenerate(audience, value, context) setResult(res) setStep('result') } catch { setStep('audience') setAudience(null) setLength(null) } } const handleCopy = async () => { if (!result) return await navigator.clipboard.writeText(result.content) setCopied(true) toast.success('Copied to clipboard') setTimeout(() => setCopied(false), 2000) } const handleRegenerate = async () => { if (!audience || !length) return setStep('generating') try { const res = await onGenerate(audience, length, context) setResult(res) setStep('result') } catch { setStep('result') } } const handleSwitchAudience = () => { setStep('audience') setAudience(null) setLength(null) setResult(null) setCopied(false) } const handleClose = () => { setStep('audience') setAudience(null) setLength(null) setResult(null) setCopied(false) onClose() } if (!open) return null return (
{/* Header */}

{contextLabels[context]}

{/* Step 1: Audience */} {step === 'audience' && (

Who is this update for?

{AUDIENCES.map((opt) => { const Icon = opt.icon return ( ) })}
)} {/* Step 2: Length */} {step === 'length' && (

How detailed?

{LENGTHS.map((opt) => { const Icon = opt.icon return ( ) })}
)} {/* Step 3: Generating */} {step === 'generating' && (

{audience === 'request_info' ? 'Drafting information request...' : audience === 'email_draft' ? 'Generating email draft...' : audience === 'client_update' ? 'Generating client update...' : 'Generating ticket notes...'}

)} {/* Step 4: Result */} {step === 'result' && result && (
{/* Meta badges */}
{AUDIENCES.find(a => a.value === result.audience)?.label} {result.length === 'quick' ? 'Quick' : 'Detailed'} {result.time_spent_display && ( {result.steps_completed} steps · {result.time_spent_display} )}
{/* Generated content */}
{result.content}
{/* Action buttons */}
)}
) }