import { useEffect, useRef, useState } from 'react' import { Box, Button, Checkbox, CircularProgress, Dialog, DialogContent, FormControlLabel, LinearProgress, Stack, Step, StepLabel, Stepper, TextField, Typography, } from '@mui/material' import { Download, Send, X } from 'lucide-react' import type { Inquiry } from '../../domain/inquiry' import type { InquiryPreparationReportDraft, ReportObjectFieldSelection } from '../../domain/inquiryReport' import { useCreateInquiryReport, useUpdateInquiryReport, useFinalizeInquiryReport } from '../../hooks/useInquiryReport' import { useToastStore } from '../../stores/toastStore' import { ReportObjectFieldSelector } from './ReportObjectFieldSelector' import { LatentInquiryReportPreview } from './LatentInquiryReportPreview' import { useProperties } from '../../hooks/useProperties' import { ResultType } from '../../domain/enums' interface Props { inquiryId: string inquiry: Inquiry onClose: () => void } const STEPS = ['Objekte wählen', 'Bericht erstellen', 'Prüfen & bearbeiten', 'Finalisieren'] export function PreparationWizard({ inquiryId, inquiry, onClose }: Props) { const [step, setStep] = useState(0) const [selectedIds, setSelectedIds] = useState([]) const [draft, setDraft] = useState(null) const [generating, setGenerating] = useState(false) const [progress, setProgress] = useState(0) const { data: allProperties = [] } = useProperties() const showToast = useToastStore(s => s.showToast) const timerRef = useRef | null>(null) const createInquiryReport = useCreateInquiryReport() const updateInquiryReport = useUpdateInquiryReport() const finalizeInquiryReport = useFinalizeInquiryReport() const finalizing = finalizeInquiryReport.isPending const portfolioProps = allProperties.filter(p => p.resultType === ResultType.VERIFIED_PORTFOLIO) const toggleProperty = (id: string) => { setSelectedIds(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id], ) } const handleGenerate = () => { setStep(1) setGenerating(true) setProgress(0) let p = 0 timerRef.current = setInterval(() => { p += Math.random() * 20 + 10 if (p >= 100) { clearInterval(timerRef.current!) setProgress(100) setGenerating(false) createInquiryReport.mutate( { inquiryId, selectedPropertyIds: selectedIds }, { onSuccess: (d) => { setDraft(d) setStep(2) }, }, ) } else { setProgress(Math.min(100, p)) } }, 200) } useEffect(() => () => { if (timerRef.current) clearInterval(timerRef.current) }, []) const handleUpdateField = (fieldId: string, value: string) => { if (!draft) return setDraft({ ...draft, editableFields: draft.editableFields.map(f => f.id === fieldId ? { ...f, value } : f), }) } const handleUpdateFieldSelection = (propertyId: string, sel: ReportObjectFieldSelection) => { if (!draft) return setDraft({ ...draft, fieldSelections: draft.fieldSelections.map(fs => fs.propertyId === propertyId ? sel : fs), }) } const handleFinalize = () => { if (!draft) return updateInquiryReport.mutate( { draftId: draft.id, data: { editableFields: draft.editableFields, fieldSelections: draft.fieldSelections } }, { onSuccess: () => { finalizeInquiryReport.mutate(draft.id, { onSuccess: (finalized) => { setDraft(finalized) setStep(3) }, }) }, }, ) } return ( Vorbereitung starten {STEPS.map(label => ( {label} ))} {/* Step 0: Select properties */} {step === 0 && ( Wählen Sie die Objekte aus Ihrem Portfolio, die Sie dem Interessenten vorstellen möchten: {portfolioProps.map(p => ( toggleProperty(p.id)} /> } label={ {p.title} {p.location.city} · {p.areaSqm.toLocaleString('de-CH')} m² · CHF {p.rentPricePerSqm}/m²/Jahr } sx={{ border: '1px solid #e2e8f0', borderRadius: 1, p: 1, m: 0, alignItems: 'flex-start', '& .MuiCheckbox-root': { pt: 0 } }} /> ))} )} {/* Step 1: Generating */} {step === 1 && ( {generating ? ( <> Bericht wird erstellt… {Math.round(progress)}% ) : ( Bericht erstellt. Weiterleitung… )} )} {/* Step 2: Review & Edit */} {step === 2 && draft && ( Berichtsfelder bearbeiten {draft.editableFields.map(f => ( handleUpdateField(f.id, e.target.value)} multiline={f.fieldType === 'textarea'} rows={f.fieldType === 'textarea' ? 3 : 1} size="small" fullWidth /> ))} Felder pro Objekt {draft.fieldSelections.map(fs => { const prop = allProperties.find(p => p.id === fs.propertyId) if (!prop) return null return ( handleUpdateFieldSelection(fs.propertyId, sel)} /> ) })} Vorschau )} {/* Step 3: Finalized */} {step === 3 && draft && ( )} {/* Footer navigation */} {step === 2 && ( )} {step === 0 && ( )} {step === 2 && ( )} ) }