import { useEffect } from 'react' import { useParams, useNavigate, useSearchParams } from 'react-router-dom' import { Save, ArrowLeft, ListOrdered, Wrench } from 'lucide-react' import { treesApi } from '@/api/trees' import { useProceduralEditorStore } from '@/store/proceduralEditorStore' import { IntakeFormBuilder } from '@/components/procedural-editor/IntakeFormBuilder' import { StepList } from '@/components/procedural-editor/StepList' import { TagInput } from '@/components/common/TagInput' import { toast } from '@/lib/toast' import type { TreeType } from '@/types' export function ProceduralEditorPage() { const { id } = useParams<{ id: string }>() const [searchParams] = useSearchParams() const navigate = useNavigate() const isEditMode = !!id const { treeId, treeType, name, description, tags, isPublic, isDirty, isSaving, isLoading, initNew, loadTree, reset, setName, setDescription, setTags, setIsPublic, setIsSaving, markSaved, getTreeForSave, } = useProceduralEditorStore() const isMaintenance = treeType === 'maintenance' const flowLabel = isMaintenance ? 'Maintenance Flow' : 'Procedure' // Load tree or init new useEffect(() => { if (isEditMode && id) { loadExistingTree(id) } else { const urlType = searchParams.get('type') initNew((urlType === 'maintenance' ? 'maintenance' : 'procedural') as TreeType) } return () => { reset() } }, [id]) const loadExistingTree = async (treeId: string) => { try { const tree = await treesApi.get(treeId) if (tree.tree_type !== 'procedural' && tree.tree_type !== 'maintenance') { toast.error('This flow is not a procedural or maintenance flow') navigate('/my-trees') return } loadTree(tree) } catch { toast.error('Failed to load flow') navigate('/my-trees') } } const handleSave = async (saveStatus?: 'draft' | 'published') => { if (!name.trim()) { toast.error(`Please enter a name for the ${flowLabel.toLowerCase()}`) return } setIsSaving(true) try { const payload = getTreeForSave() if (saveStatus) { payload.status = saveStatus } if (isEditMode && treeId) { await treesApi.update(treeId, payload) markSaved() toast.success(`${flowLabel} saved`) } else { const created = await treesApi.create(payload) markSaved() toast.success(`${flowLabel} created`) navigate(`/flows/${created.id}/edit`, { replace: true }) } } catch (err: unknown) { const message = err && typeof err === 'object' && 'response' in err ? (err as { response?: { data?: { detail?: string | { message?: string } } } }).response?.data?.detail : null const errorText = typeof message === 'string' ? message : typeof message === 'object' && message?.message ? message.message : `Failed to save ${flowLabel.toLowerCase()}` toast.error(errorText) } finally { setIsSaving(false) } } if (isLoading) { return (