import React, { useState, useEffect } from 'react';
import SolutionNavigator from '../components/SolutionNavigator';
function CustomPuzzlePage() {
// Custom puzzle input
const [customPuzzleText, setCustomPuzzleText] = useState("");
const [sysContent, setSysContent] = useState("");
// Results
const [solutions, setSolutions] = useState([]);
const [currentSolutionIndex, setCurrentSolutionIndex] = useState(0);
const [generatedCode, setGeneratedCode] = useState("");
const [isSolving, setIsSolving] = useState(false);
const [solutionStatus, setSolutionStatus] = useState(""); // "success", "no_solution", "error"
const [errorMessage, setErrorMessage] = useState("");
// UI state
const [currentStep, setCurrentStep] = useState(1);
const [expandedSections, setExpandedSections] = useState({
puzzle: true,
sysContent: false,
result: false
});
// Load default system content
useEffect(() => {
fetch(`/default_sys_content_multi`)
.then(res => res.json())
.then(data => {
if(data.success) {
setSysContent(data.sysContent);
}
})
.catch(e => console.error(e));
}, []);
const handleSolveCustom = () => {
if(!customPuzzleText.trim()) {
alert("Please enter a puzzle text");
return;
}
const payload = {
puzzle: customPuzzleText,
sys_content: sysContent,
custom: true
};
setIsSolving(true);
setCurrentStep(3);
setExpandedSections({puzzle: false, sysContent: false, result: true});
setSolutions([]);
setCurrentSolutionIndex(0);
setSolutionStatus("");
setErrorMessage("");
fetch(`/solve_custom`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
})
.then(res => res.json())
.then(data => {
if(!data.success) {
setErrorMessage("Backend error: " + data.error);
setSolutionStatus("error");
return;
}
const result = data.result;
setGeneratedCode(result.generatedCode || "");
if (result.solutions && result.solutions.length > 0) {
setSolutions(result.solutions);
setSolutionStatus("success");
setCurrentSolutionIndex(0);
} else if (result.no_solution) {
setSolutionStatus("no_solution");
setErrorMessage(result.message || "No solution found for this puzzle");
} else {
setSolutionStatus("error");
setErrorMessage(result.error || "Unknown error occurred");
}
})
.catch(e => {
console.error(e);
setErrorMessage("Network error: " + e.message);
setSolutionStatus("error");
})
.finally(() => {
setIsSolving(false);
});
};
const toggleSection = (section) => {
setExpandedSections({
...expandedSections,
[section]: !expandedSections[section]
});
};
const nextStep = () => {
if (currentStep < 3) {
setCurrentStep(currentStep + 1);
if (currentStep === 1) {
setExpandedSections({puzzle: false, sysContent: true, result: false});
} else if (currentStep === 2) {
setExpandedSections({puzzle: false, sysContent: false, result: true});
}
}
};
const prevStep = () => {
if (currentStep > 1) {
setCurrentStep(currentStep - 1);
if (currentStep === 2) {
setExpandedSections({puzzle: true, sysContent: false, result: false});
} else if (currentStep === 3) {
setExpandedSections({puzzle: false, sysContent: true, result: false});
}
}
};
return (
<>
{/* Progress Steps */}
= 1 ? 'active' : ''}`}>
1
Create Puzzle
= 2 ? 'active' : ''}`}>
2
Configure System
= 3 ? 'active' : ''}`}>
3
Solve & Results
{/* Step 1: Custom Puzzle Input */}
toggleSection('puzzle')}>
✏️ Custom Puzzle Creation
{expandedSections.puzzle ? '▼' : '▶'}
{expandedSections.puzzle && (
📝 Puzzle Description
Enter your custom zebra puzzle. Include categories, items, and constraints:
💡 Tips for Creating Puzzles:
- Clearly define all categories and their possible values
- Number your constraints for clarity
- Use spatial relationships like "to the left of", "next to", "between"
- Include direct assignments like "Alice lives in the red house"
- It will be better to have your expected results
)}
{/* Step 2: System Configuration */}
toggleSection('sysContent')}>
⚙️ System Configuration
{expandedSections.sysContent ? '▼' : '▶'}
{expandedSections.sysContent && (
📝 System Content
Edit the system prompt that will guide the AI in solving your custom puzzle:
)}
{/* Step 3: Solve & Results */}
toggleSection('result')}>
🚀 Solve & Results
{expandedSections.result ? '▼' : '▶'}
{expandedSections.result && (
Status:
{solutionStatus === 'success' ? "✅ Solved" :
solutionStatus === 'no_solution' ? "⚠️ No Solution" :
solutionStatus === 'error' ? "❌ Error" : "⏳ Pending"}
{solutions.length > 0 && (
Solutions Found:
{solutions.length}
)}
{/* Solution Navigator */}
{solutions.length > 0 && (
)}
{/* Error Message */}
{(solutionStatus === 'error' || solutionStatus === 'no_solution') && errorMessage && (
⚠️ {solutionStatus === 'no_solution' ? 'No Solution Found' : 'Error'}
)}
{/* Generated Code */}
{generatedCode && (
)}
)}
{/* Navigation */}
>
);
}
export default CustomPuzzlePage;