import gradio as gr
from gradio_workflowbuilder import WorkflowBuilder
import json
def export_workflow(workflow_data):
    """Export workflow as formatted JSON"""
    if not workflow_data:
        return "No workflow to export"
    return json.dumps(workflow_data, indent=2)
# Create the main interface
with gr.Blocks(
    title="🎨 Visual Workflow Builder", 
    theme=gr.themes.Soft(),
    css="""
    .main-container { max-width: 1600px; margin: 0 auto; }
    .workflow-section { margin-bottom: 2rem; }
    .button-row { display: flex; gap: 1rem; justify-content: center; margin: 1rem 0; }
    
    .component-description {
        padding: 24px;
        background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
        border-radius: 12px;
        border-left: 4px solid #3b82f6;
        margin: 16px 0;
        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    }
    .component-description p {
        margin: 10px 0;
        line-height: 1.6;
        color: #374151;
    }
    .base-description {
        font-size: 17px;
        font-weight: 600;
        color: #1e293b;
    }
    .base-description strong {
        color: #3b82f6;
        font-weight: 700;
    }
    .feature-description {
        font-size: 16px;
        color: #1e293b;
        font-weight: 500;
    }
    .customization-note {
        font-size: 15px;
        color: #64748b;
        font-style: italic;
    }
    .sample-intro {
        font-size: 15px;
        color: #1e293b;
        font-weight: 600;
        margin-top: 16px;
        border-top: 1px solid #e2e8f0;
        padding-top: 16px;
    }
    """
) as demo:
    
    with gr.Column(elem_classes=["main-container"]):
        gr.Markdown("""
        # 🎨 Visual Workflow Builder
        
        **Create sophisticated workflows with drag and drop simplicity.**
        """)
        
        # Simple description section with styling
        gr.HTML("""
        
            Base custom component powered by svelteflow.
            Create custom workflows.
            You can customise the nodes as well as the design of the workflow.
            Here is a sample:
         
        """)
        
        # Main workflow builder section
        with gr.Column(elem_classes=["workflow-section"]):
            workflow_builder = WorkflowBuilder(
                label="🎨 Visual Workflow Designer",
                info="Drag components from the sidebar → Connect nodes by dragging from output (right) to input (left) → Click nodes to edit properties"
            )
        
        # Export section below the workflow
        gr.Markdown("## 💾 Export Workflow")
        
        with gr.Row():
            with gr.Column():
                export_output = gr.Code(
                    language="json", 
                    label="Workflow Configuration",
                    lines=10
                )
        
        # Action button
        with gr.Row(elem_classes=["button-row"]):
            export_btn = gr.Button("💾 Export JSON", variant="primary", size="lg")
        
        # Instructions
        with gr.Accordion("📖 How to Use", open=False):
            gr.Markdown("""
            ### 🚀 Getting Started
            
            1. **Add Components**: Drag items from the left sidebar onto the canvas
            2. **Connect Nodes**: Drag from the blue circle on the right of a node to the left circle of another
            3. **Edit Properties**: Click any node to see its editable properties on the right panel
            4. **Organize**: Drag nodes around to create a clean workflow layout
            5. **Delete**: Use the ✕ button on nodes or click the red circle on connections
            
            ### 🎯 Component Types
            
            - **📥 Inputs**: Text fields, file uploads, number inputs
            - **⚙️ Processing**: Language models, text processors, conditionals
            - **📤 Outputs**: Text displays, file exports, charts
            - **🔧 Tools**: API calls, data transformers, validators
            
            ### 💡 Pro Tips
            
            - **Collapsible Panels**: Use the arrow buttons to hide/show sidebars
            - **Live Updates**: Properties update in real-time as you edit
            - **Export Options**: Get JSON config for your workflow
            """)
    
    # Event handlers
    export_btn.click(
        fn=export_workflow,
        inputs=[workflow_builder],
        outputs=[export_output]
    )
if __name__ == "__main__":
    demo.launch(
        server_name="0.0.0.0",
        show_error=True
    )