import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Calculator, Check, X, Trophy, RotateCcw, ArrowRight, Lightbulb, Target } from 'lucide-react'; interface EquilibrioFinderProps { ejercicioId: string; onComplete?: (puntuacion: number) => void; } interface Problema { id: number; demanda: { a: number; b: number }; oferta: { c: number; d: number }; producto: string; dificultad: 'facil' | 'medio' | 'dificil'; } const problemas: Problema[] = [ { id: 1, demanda: { a: 100, b: -2 }, oferta: { c: 10, d: 3 }, producto: 'Manzanas', dificultad: 'facil' }, { id: 2, demanda: { a: 80, b: -1.5 }, oferta: { c: 20, d: 2 }, producto: 'Camisetas', dificultad: 'facil' }, { id: 3, demanda: { a: 120, b: -0.8 }, oferta: { c: 30, d: 1.2 }, producto: 'Entradas de cine', dificultad: 'medio' }, { id: 4, demanda: { a: 200, b: -4 }, oferta: { c: 50, d: 2.5 }, producto: 'Bicicletas', dificultad: 'medio' }, { id: 5, demanda: { a: 150, b: -1.2 }, oferta: { c: 25, d: 0.8 }, producto: 'Consultas médicas', dificultad: 'dificil' } ]; export const EquilibrioFinder: React.FC = ({ onComplete, ejercicioId: _ejercicioId }) => { const [problemaActual, setProblemaActual] = useState(0); const [respuestaPrecio, setRespuestaPrecio] = useState(''); const [respuestaCantidad, setRespuestaCantidad] = useState(''); const [mostrarResultado, setMostrarResultado] = useState(false); const [esCorrecto, setEsCorrecto] = useState(false); const [score, setScore] = useState(0); const [respuestasCorrectas, setRespuestasCorrectas] = useState(0); const [mostrarAyuda, setMostrarAyuda] = useState(false); const [completado, setCompletado] = useState(false); const [_startTime] = useState(Date.now()); const problema = problemas[problemaActual]; const calcularEquilibrio = (problema: Problema) => { const { a, b } = problema.demanda; const { c, d } = problema.oferta; const Q = (c - a) / (b - d); const P = a + b * Q; return { Q: Math.round(Q * 10) / 10, P: Math.round(P * 10) / 10 }; }; const equilibrio = calcularEquilibrio(problema); const handleVerificar = () => { const precioIngresado = parseFloat(respuestaPrecio); const cantidadIngresada = parseFloat(respuestaCantidad); if (isNaN(precioIngresado) || isNaN(cantidadIngresada)) { return; } const margenError = 0.5; const precioCorrecto = Math.abs(precioIngresado - equilibrio.P) <= margenError; const cantidadCorrecta = Math.abs(cantidadIngresada - equilibrio.Q) <= margenError; const correcto = precioCorrecto && cantidadCorrecta; setEsCorrecto(correcto); setMostrarResultado(true); if (correcto) { setScore(prev => prev + Math.round(100 / problemas.length)); setRespuestasCorrectas(prev => prev + 1); } }; const handleSiguiente = () => { if (problemaActual < problemas.length - 1) { setProblemaActual(prev => prev + 1); setRespuestaPrecio(''); setRespuestaCantidad(''); setMostrarResultado(false); setMostrarAyuda(false); } else { setCompletado(true); if (onComplete) { onComplete(score); } } }; const handleReiniciar = () => { setProblemaActual(0); setRespuestaPrecio(''); setRespuestaCantidad(''); setMostrarResultado(false); setScore(0); setRespuestasCorrectas(0); setMostrarAyuda(false); setCompletado(false); }; const getDificultadColor = (dificultad: string) => { switch (dificultad) { case 'facil': return 'bg-green-100 text-green-700'; case 'medio': return 'bg-yellow-100 text-yellow-700'; case 'dificil': return 'bg-red-100 text-red-700'; default: return 'bg-gray-100 text-gray-700'; } }; const generarPuntosCurva = (tipo: 'demanda' | 'oferta') => { const puntos = []; for (let Q = 0; Q <= 50; Q += 5) { if (tipo === 'demanda') { const P = problema.demanda.a + problema.demanda.b * Q; if (P >= 0) puntos.push({ Q, P }); } else { const P = problema.oferta.c + problema.oferta.d * Q; if (P >= 0) puntos.push({ Q, P }); } } return puntos; }; const scaleX = (Q: number) => 50 + (Q / 50) * 300; const scaleY = (P: number) => 250 - (P / 150) * 200; const puntosDemanda = generarPuntosCurva('demanda'); const puntosOferta = generarPuntosCurva('oferta'); const demandaPath = puntosDemanda.map((p, i) => `${i === 0 ? 'M' : 'L'} ${scaleX(p.Q)} ${scaleY(p.P)}` ).join(' '); const ofertaPath = puntosOferta.map((p, i) => `${i === 0 ? 'M' : 'L'} ${scaleX(p.Q)} ${scaleY(p.P)}` ).join(' '); if (completado) { const porcentaje = Math.round((respuestasCorrectas / problemas.length) * 100); return (

¡Ejercicio Completado!

Has encontrado los puntos de equilibrio

{porcentaje}%

{respuestasCorrectas} de {problemas.length} problemas resueltos correctamente

); } return (

Buscador de Equilibrio

{problema.dificultad.toUpperCase()} {problemaActual + 1} de {problemas.length}

Calcula el precio y cantidad de equilibrio donde Qd = Qo.

Gráfico de Mercado: {problema.producto}

{/* Grid */} {Array.from({ length: 6 }).map((_, i) => ( ))} {/* Ejes */} {/* Labels */} Cantidad (Q) Precio (P) {/* Curva de Demanda */} {demandaPath && ( D )} {/* Curva de Oferta */} {ofertaPath && ( S )} {/* Punto de equilibrio (mostrar si ya respondió correctamente) */} {mostrarResultado && esCorrecto && ( E )}

Ecuaciones:

Qd = {problema.demanda.a} {problema.demanda.b > 0 ? '+' : ''}{problema.demanda.b}P
Qo = {problema.oferta.c > 0 ? '' : '-'}{problema.oferta.c} {problema.oferta.d > 0 ? '+' : ''}{problema.oferta.d}P

Encuentra el Equilibrio

setRespuestaPrecio(e.target.value)} disabled={mostrarResultado} placeholder="Ej: 45.5" className="w-full px-4 py-3 border-2 border-gray-200 rounded-lg focus:border-purple-500 focus:outline-none disabled:bg-gray-100" step="0.1" />
setRespuestaCantidad(e.target.value)} disabled={mostrarResultado} placeholder="Ej: 25.3" className="w-full px-4 py-3 border-2 border-gray-200 rounded-lg focus:border-purple-500 focus:outline-none disabled:bg-gray-100" step="0.1" />
{mostrarAyuda && (

Tip: En equilibrio, Qd = Qo. Iguala las dos ecuaciones y despeja P. Luego sustituye P en cualquier ecuación para encontrar Q.

)}
{mostrarResultado && (
{esCorrecto ? ( ) : ( )}

{esCorrecto ? '¡Correcto!' : 'Incorrecto'}

{!esCorrecto && (

La respuesta correcta es:

P* = ${equilibrio.P}

Q* = {equilibrio.Q} unidades

)}
)}
{!mostrarResultado ? ( ) : ( )}
); }; export default EquilibrioFinder;