import { useState, useMemo } from 'react'; import { Card, CardHeader } from '../../ui/Card'; import { Button } from '../../ui/Button'; import { Input } from '../../ui/Input'; import { CheckCircle, Scale, RotateCcw, TrendingUp } from 'lucide-react'; interface IngresoCompetenciaPerfectaProps { ejercicioId: string; onComplete?: (puntuacion: number) => void; } export function IngresoCompetenciaPerfecta({ ejercicioId: _ejercicioId, onComplete }: IngresoCompetenciaPerfectaProps) { const PRECIO_MERCADO = 50; const [cantidad, setCantidad] = useState(100); const [respuestas, setRespuestas] = useState({ it: '', img: '', relacion: '', }); const [validado, setValidado] = useState(false); const [errores, setErrores] = useState([]); const ingresoTotal = useMemo(() => PRECIO_MERCADO * cantidad, [cantidad]); const ingresoMarginal = PRECIO_MERCADO; const ingresoPromedio = PRECIO_MERCADO; const datosTabla = useMemo(() => { const datos = []; for (let q = 0; q <= 200; q += 25) { datos.push({ q, p: PRECIO_MERCADO, it: PRECIO_MERCADO * q, img: PRECIO_MERCADO, ip: PRECIO_MERCADO, }); } return datos; }, []); const handleRespuestaChange = (campo: string, valor: string) => { setRespuestas(prev => ({ ...prev, [campo]: valor })); setValidado(false); }; const validarRespuestas = () => { const nuevosErrores: string[] = []; if (parseFloat(respuestas.it) !== ingresoTotal) { nuevosErrores.push(`IT incorrecto. IT = P × Q = ${PRECIO_MERCADO} × ${cantidad}`); } if (parseFloat(respuestas.img) !== ingresoMarginal) { nuevosErrores.push(`IMg incorrecto. En competencia perfecta, IMg = P`); } if (!['igual', 'igual a', 'es igual', 'son iguales'].some(r => respuestas.relacion.toLowerCase().includes(r))) { nuevosErrores.push('En competencia perfecta, P = IMg = IPMe'); } setErrores(nuevosErrores); setValidado(true); if (nuevosErrores.length === 0 && onComplete) { onComplete(100); } }; const reiniciar = () => { setCantidad(100); setRespuestas({ it: '', img: '', relacion: '' }); setValidado(false); setErrores([]); }; return (
Características

En competencia perfecta, la empresa es tomadora de precios. El precio de mercado es constante e independiente de la cantidad que produzca la empresa. Por eso: P = IMg = IPMe. La curva de demanda es horizontal (perfectamente elástica).

Precio de Mercado (P)

${PRECIO_MERCADO}

Constante

Ingreso Marginal (IMg)

${ingresoMarginal}

=P

Ingreso Promedio (IPMe)

${ingresoPromedio}

=P

{ setCantidad(parseInt(e.target.value)); setValidado(false); }} className="flex-1 h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer" /> {cantidad}

Ingreso Total con Q = {cantidad}

IT = ${ingresoTotal.toLocaleString()}

{PRECIO_MERCADO} × {cantidad} = ${ingresoTotal.toLocaleString()}

{datosTabla.filter((_, i) => i % 2 === 0 || i === datosTabla.length - 1).map((d, i) => ( ))}
Q P ($) IT ($) IMg ($) IPMe ($)
{d.q} ${d.p} ${d.it.toLocaleString()} ${d.img} ${d.ip}

Responde para Q = {cantidad}:

handleRespuestaChange('it', e.target.value)} className="w-full" placeholder={String(PRECIO_MERCADO * cantidad)} />
handleRespuestaChange('img', e.target.value)} className="w-full" placeholder="?" />
handleRespuestaChange('relacion', e.target.value)} className="w-full" placeholder="Son iguales / Diferentes" />
{validado && errores.length === 0 && (
¡Correcto! En competencia perfecta: P = IMg = IPMe = ${PRECIO_MERCADO}
)} {validado && errores.length > 0 && (

Revisa tus respuestas:

    {errores.map((error, i) => (
  • {error}
  • ))}
)}

Resumen - Competencia Perfecta:

Fórmulas:

  • • IT = P × Q
  • • IMg = P (constante)
  • • IPMe = P (constante)

Características:

  • • La empresa es tomadora de precios
  • • Demanda horizontal (perfectamente elástica)
  • • P = IMg = IPMe
); } export default IngresoCompetenciaPerfecta;