import React, { useState, useRef, useEffect } from 'react'; import { createRoot } from 'react-dom/client'; import { GoogleGenAI, Type } from '@google/genai'; import { Upload, Search, MessageSquare, AlertCircle, CheckCircle2, Maximize2, Send, Loader2, Trash2, Info, Download, Lightbulb, X, ChevronRight, ChevronLeft, LayoutDashboard, FileText, Plus, Building2, Compass, Award, ShieldCheck, Shapes, Bot, User, TriangleAlert, Settings2, Check, FileDown, ExternalLink, Edit3, Printer, Home, Layers, Layout, ArrowDownToLine, Box, Zap, Star, Crown, CheckCircle, Coins, Wallet, TrendingUp, Sparkles, ShoppingBag, CreditCard, Lock, ArrowLeftRight, RefreshCcw, BarChart3, ArrowRight, FilePlus2, History, Type as TypeIcon, Gift, Wind, Scaling, Construction, Minus } from 'lucide-react'; const ARCHITECT_SYSTEM_PROMPT = `أنت مهندس معماري استشاري برتبة "خبير أول" بخبرة تتجاوز 25 عاماً في مراجعة وتدقيق المخططات الهندسية. مهمتك إجراء تحليل نقدي معمق وشامل للمخططات المرفقة، وتقديم قيمة استشارية حقيقية تتجاوز التحليل السردي العام. يجب أن تتبع المنهجية التالية بدقة في تقريرك: 1. التحليل البيئي والمناخي (Environmental Context): حلل علاقة المخطط مع مسار الشمس وحركة الرياح (بناءً على سهم الشمال إن وجد). هل توزيع الفتحات يحقق كفاءة الطاقة؟ 2. المطابقة التنظيمية والعمرانية (Zoning & Compliance): هل الارتدادات والنسب البنائية تبدو منطقية ومريحة؟ انقد ضيق المساحات أو المبالغة في الارتدادات. 3. التدقيق الوظيفي والفراغي (Functional Audit): كشف العوائق (أعمدة أو حوائط تعيق الحركة). تحليل التدفق (Circulation) والزونات (خدمي، خاص، عام). تحديد "المساحات الميتة" (Dead Spaces). 4. النقد المعماري الهندسي (Architectural Criticism): نقد الأشكال الهندسية والتعقيدات غير المبررة التي تزيد التكلفة. الاتزان البصري وتوزيع الكتلة. 5. التقرير الختامي والتوصيات (The Expert’s Prescription): تحديد قائمة بالنقاط "غير المقبولة معمارياً". تقديم 3 توصيات بديلة ملموسة وقابلة للتنفيذ فوراً لتحسين الكفاءة وتقليل التكلفة وزيادة جودة الحياة. يجب أن تكون النصوص باللغة العربية الفصحى وبأسلوب مهني هندسي تقني ومباشر بعيداً عن اللغة الإنشائية العامة.`; interface Floor { id: string; name: string; data: string; } interface AnalysisResult { environmentalAnalysis: string; zoningCompliance: string; functionalAudit: string; architecturalCriticism: string; unacceptablePoints: string; expertPrescription: string; // The 3 concrete recommendations overallRating: string; } interface CreditBundle { id: string; points: number; price: number; label: string; isPopular?: boolean; } const CREDIT_BUNDLES: CreditBundle[] = [ { id: 'trial', points: 5, price: 1, label: 'باقة التجربة السريعة' }, { id: 'pro', points: 25, price: 5, label: 'باقة المحترفين (وفر 20%)', isPopular: true }, { id: 'enterprise', points: 100, price: 15, label: 'باقة المكاتب الاستشارية' } ]; const App = () => { const [floors, setFloors] = useState([]); const [activeFloorIndex, setActiveFloorIndex] = useState(0); const [isAnalyzing, setIsAnalyzing] = useState(false); const [analysis, setAnalysis] = useState(null); const [chatHistory, setChatHistory] = useState<{ role: 'user' | 'model'; text: string }[]>([]); const [userInput, setUserInput] = useState(''); const [isSendingChat, setIsSendingChat] = useState(false); const [isChatOpen, setIsChatOpen] = useState(false); const [loadingStep, setLoadingStep] = useState(''); const [isSidebarOpen, setIsSidebarOpen] = useState(true); const [isExportModalOpen, setIsExportModalOpen] = useState(false); const [showWalletModal, setShowWalletModal] = useState(false); const [showNewProjectModal, setShowNewProjectModal] = useState(false); const [showWelcomeBonus, setShowWelcomeBonus] = useState(false); const [userCredits, setUserCredits] = useState(() => { const saved = localStorage.getItem('architect_pro_credits'); return saved !== null ? parseInt(saved) : 15; }); const [isProcessingPayment, setIsProcessingPayment] = useState(false); const [selectedBundle, setSelectedBundle] = useState(null); const [showJustMarketCheckout, setShowJustMarketCheckout] = useState(false); const [projectTitle, setProjectTitle] = useState('تقرير تحليل معماري استشاري'); const [customHeader, setCustomHeader] = useState(''); const [customFooter, setCustomFooter] = useState(''); const fileInputRef = useRef(null); const chatEndRef = useRef(null); const steps = [ "تحليل المسار الشمسي وتوجيه الرياح...", "تدقيق الارتدادات والنسب التنظيمية...", "فحص كفاءة المسارات والفراغات الميتة...", "صياغة التوصيات الاستشارية النهائية..." ]; useEffect(() => { localStorage.setItem('architect_pro_credits', userCredits.toString()); }, [userCredits]); useEffect(() => { const hasBeenWelcomed = localStorage.getItem('architect_pro_welcomed'); if (!hasBeenWelcomed) { setShowWelcomeBonus(true); localStorage.setItem('architect_pro_welcomed', 'true'); } }, []); useEffect(() => { if (isChatOpen) { chatEndRef.current?.scrollIntoView({ behavior: 'smooth' }); } }, [chatHistory, isChatOpen]); const handleImageUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onloadend = () => { const nameOptions = ["الدور الأرضي", "الدور الأول", "الملحق العلوي", "القبو"]; const nextName = nameOptions[floors.length] || `مستوى ${floors.length + 1}`; const newFloor: Floor = { id: Math.random().toString(36).substr(2, 9), name: nextName, data: reader.result as string }; setFloors([...floors, newFloor]); setActiveFloorIndex(floors.length); setAnalysis(null); }; reader.readAsDataURL(file); e.target.value = ''; } }; const executeNewProject = () => { setFloors([]); setAnalysis(null); setChatHistory([]); setActiveFloorIndex(0); setIsChatOpen(false); setShowNewProjectModal(false); }; const runAnalysis = async () => { if (floors.length === 0) return; if (userCredits < 5) { setShowWalletModal(true); return; } setIsAnalyzing(true); let stepIndex = 0; const interval = setInterval(() => { setLoadingStep(steps[stepIndex % steps.length]); stepIndex++; }, 1800); try { const ai = new GoogleGenAI({ apiKey: process.env.API_KEY }); const parts = floors.map(floor => ({ inlineData: { data: floor.data.split(',')[1], mimeType: 'image/jpeg' } })); const response = await ai.models.generateContent({ model: 'gemini-3-pro-preview', contents: { parts: [ ...parts, { text: `قم بإجراء تحليل هندسي تقني ونقدي ومباشر للمخطط المرفق وفق المنهجية المحددة. قدم التقرير بتنسيق JSON.` } ] }, config: { systemInstruction: ARCHITECT_SYSTEM_PROMPT, responseMimeType: "application/json", responseSchema: { type: Type.OBJECT, properties: { environmentalAnalysis: { type: Type.STRING }, zoningCompliance: { type: Type.STRING }, functionalAudit: { type: Type.STRING }, architecturalCriticism: { type: Type.STRING }, unacceptablePoints: { type: Type.STRING }, expertPrescription: { type: Type.STRING }, overallRating: { type: Type.STRING } }, required: ["environmentalAnalysis", "zoningCompliance", "functionalAudit", "architecturalCriticism", "unacceptablePoints", "expertPrescription", "overallRating"] } } }); if (response.text) { setAnalysis(JSON.parse(response.text)); setUserCredits(prev => Math.max(0, prev - 5)); } } catch (error) { console.error("Analysis failed", error); alert("حدث خطأ أثناء تحليل المخطط. يرجى التأكد من جودة الصورة."); } finally { clearInterval(interval); setIsAnalyzing(false); } }; const handleSendMessage = async () => { if (!userInput.trim() || floors.length === 0 || isSendingChat) return; const currentMsg = userInput; setChatHistory(prev => [...prev, { role: 'user', text: currentMsg }]); setUserInput(''); setIsSendingChat(true); try { const ai = new GoogleGenAI({ apiKey: process.env.API_KEY }); const parts = floors.map(floor => ({ inlineData: { data: floor.data.split(',')[1], mimeType: 'image/jpeg' } })); const response = await ai.models.generateContent({ model: 'gemini-3-pro-preview', contents: { parts: [...parts, { text: currentMsg }] }, config: { systemInstruction: ARCHITECT_SYSTEM_PROMPT } }); setChatHistory(prev => [...prev, { role: 'model', text: response.text || '' }]); } catch (error) { console.error("Chat failed", error); } finally { setIsSendingChat(false); } }; const handlePrint = () => { window.print(); }; const getFloorIcon = (name: string, active: boolean) => { const iconClass = `w-4 h-4 ${active ? 'text-blue-400' : 'text-slate-300'}`; if (name.includes("الأرضي")) return ; if (name.includes("الأول")) return ; if (name.includes("الملحق")) return ; if (name.includes("القبو")) return ; return ; }; return (
{/* Sidebar */}
{/* Modern Header */}

المِعمار برو

Just Market Credits System

{[1, 2, 3].map(i => (
Expert
))}
{/* Main Content Area - Plan Viewer */}
{floors.length > 0 && (
{floors.map((floor, idx) => ( ))}
)}
{!floors[activeFloorIndex] ? (
fileInputRef.current?.click()}>

ارفع المخطط المعماري

التحليل الهندسي يبدأ من هنا. ارفع مخططاتك التنفيذية الآن.

) : (
Blueprint {!analysis && !isAnalyzing && ( )} {isAnalyzing && (

{loadingStep}

)}
)}
{/* Right Panel - Always Analysis */}
{!analysis ? (

تقرير المراجعة الهندسية سيظهر هنا

) : (

نتائج التدقيق

} subtitle="المسار الشمسي والرياح" /> } subtitle="الارتدادات والنسب البنائية" /> } subtitle="التدفق والمساحات الميتة" /> } subtitle="الاتزان البصري والتكلفة" />

غير مقبول معمارياً

{analysis.unacceptablePoints}

روشتة الخبير (3 توصيات بديلة)

{analysis.expertPrescription}

)}
{/* Floating Chat System */}
{isChatOpen && (
{/* Chat Header */}

نقاش فني استشاري

خبير متصل الآن
{/* Chat Body */}
{floors.length === 0 ? (

يرجى رفع مخطط لبدء النقاش الفني مع الخبير

) : ( <> {chatHistory.length === 0 && (

أهلاً بك مهندس. يمكنك سؤالي عن أي تفاصيل إنشائية، معالجات معمارية، أو نقد لزاوية محددة في مخططك.

)} {chatHistory.map((msg, idx) => (
{msg.role === 'user' ? : }
{msg.text}
))} {isSendingChat && (
)}
)}
{/* Chat Footer */}
setUserInput(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} disabled={floors.length === 0 || isSendingChat} placeholder={floors.length === 0 ? "ارفع مخططاً أولاً..." : "اكتب استفسارك الهندسي هنا..."} className="flex-1 pr-5 pl-12 py-4 bg-slate-50 border border-slate-100 rounded-[20px] outline-none text-sm font-bold focus:bg-white focus:border-[#0D47A1]/30 transition-all shadow-sm disabled:opacity-50" />
)} {/* Floating FAB */}
{/* WELCOME BONUS MODAL */} {showWelcomeBonus && (

هدية ترحيبية!

أهلاً بك في المعمار برو. لقد أضفنا 15 نقطة مجانية لحسابك لتبدأ رحلتك في تدقيق مخططاتك الهندسية فوراً.

)} {/* EXPORT SETTINGS MODAL */} {isExportModalOpen && (

تصدير التقرير الهندسي

إعدادات الطباعة والترويسة

setProjectTitle(e.target.value)} placeholder="أدخل عنوان المشروع هنا..." className="w-full px-6 py-4 bg-slate-50 border border-slate-100 rounded-2xl outline-none text-sm font-bold focus:bg-white transition-all" />