import React, { useState } from 'react'; import { Calculator, FileText, Sparkles } from 'lucide-react'; export default function CalculadoraDibujoArquitectonico() { const [precioBase, setPrecioBase] = useState(''); const [materialesProveidos, setMaterialesProveidos] = useState(true); const [materiales, setMateriales] = useState({ papel: false, plumones: false, cinta: false, premium: false }); const [escala, setEscala] = useState('1:100'); const [tiposDibujo, setTiposDibujo] = useState({}); const [complejidad, setComplejidad] = useState('medio'); const [tiempoHoras, setTiempoHoras] = useState(''); const [color, setColor] = useState('bn'); const [datos, setDatos] = useState('completos'); const [tipoEncargo, setTipoEncargo] = useState('suelto'); const [dificultad, setDificultad] = useState('medio'); const [mostrarResultado, setMostrarResultado] = useState(false); const escalaValores = { '1:200': 8, '1:100': 6, '1:50': 4, '1:20': 2, '1:10': 2 }; const tipoDibujoValores = { 'planta': 2, 'elevacion': 3, 'corte': 4, 'axonometria': 5, 'perspectiva1': 6, 'perspectiva2': 8, 'perspectiva3': 10 }; const complejidadValores = { 'simple': 0, 'medio': 5, 'complejo': 10, 'muy_complejo': 15 }; const colorValores = { 'bn': 0, 'planos': 4, 'sombras': 7, 'render': 10 }; const datosValores = { 'completos': 0, 'incompletos': 3, 'sin_datos': 8 }; const encargoValores = { 'suelto': 0, 'anteproyecto': 8, 'proyecto': 10 }; const multiplicadorValores = { 'facil': 1.0, 'medio': 1.2, 'dificil': 1.5, 'muy_dificil': 1.8 }; const actualizarCantidad = (tipo, cantidad) => { const cant = parseInt(cantidad) || 0; if (cant <= 0) { const nuevosTipos = { ...tiposDibujo }; delete nuevosTipos[tipo]; setTiposDibujo(nuevosTipos); } else { setTiposDibujo({ ...tiposDibujo, [tipo]: cant }); } }; const calcularPrecio = () => { const base = parseFloat(precioBase) || 0; let costoMateriales = 0; if (!materialesProveidos) { if (materiales.papel) costoMateriales += 3; if (materiales.plumones) costoMateriales += 4; if (materiales.cinta) costoMateriales += 2; if (materiales.premium) costoMateriales += 6; } const costoEscala = escalaValores[escala]; const costoTiposDibujo = Object.entries(tiposDibujo).reduce((sum, [tipo, cantidad]) => sum + (tipoDibujoValores[tipo] * cantidad), 0 ); const costoComplejidad = complejidadValores[complejidad]; const horas = parseFloat(tiempoHoras) || 0; const costoTiempo = horas * 2; const costoColor = colorValores[color]; const costoDatos = datosValores[datos]; const costoEncargo = encargoValores[tipoEncargo]; const subtotal = base + costoMateriales + costoEscala + costoTiposDibujo + costoComplejidad + costoTiempo + costoColor + costoDatos + costoEncargo; const multiplicador = multiplicadorValores[dificultad]; const precioFinal = subtotal * multiplicador; return { base, costoMateriales, costoEscala, costoTiposDibujo, costoComplejidad, costoTiempo, costoColor, costoDatos, costoEncargo, subtotal, multiplicador, precioFinal, horas }; }; const handleCalcular = () => { if (!precioBase || Object.keys(tiposDibujo).length === 0 || !tiempoHoras) { alert('Por favor completa al menos: Precio base, Tipo de dibujo (con cantidad) y Tiempo estimado'); return; } setMostrarResultado(true); }; const resultado = mostrarResultado ? calcularPrecio() : null; return (
{/* Patrón de fondo decorativo */}
{/* Header con estilo Y2K */}

✿ Calculadora de Precios ✿

~ Dibujo Arquitectónico ~

{/* Contenedor principal con bordes punteados */}
{/* Precio Base */}
setPrecioBase(e.target.value)} className="w-full px-4 py-3 border-3 border-blue-400 rounded-xl focus:ring-4 focus:ring-blue-300 focus:border-blue-500 bg-white shadow-inner font-bold" placeholder="Ej: 50" step="0.01" />
{/* Materiales */}
{!materialesProveidos && (
{[ { key: 'papel', label: 'Papel especial (+S/.3)' }, { key: 'plumones', label: 'Plumones/marcadores (+S/.4)' }, { key: 'cinta', label: 'Cinta/herramientas (+S/.2)' }, { key: 'premium', label: 'Material premium (+S/.6)' } ].map(mat => ( ))}
)}
{/* Escala */}
{/* Tipo de dibujo */}
{[ { key: 'planta', label: 'Planta', precio: 2 }, { key: 'elevacion', label: 'Elevación', precio: 3 }, { key: 'corte', label: 'Corte', precio: 4 }, { key: 'axonometria', label: 'Axonometría', precio: 5 }, { key: 'perspectiva1', label: 'Perspectiva 1 punto', precio: 6 }, { key: 'perspectiva2', label: 'Perspectiva 2 puntos', precio: 8 }, { key: 'perspectiva3', label: 'Perspectiva 3 puntos', precio: 10 } ].map(tipo => (
Cantidad: actualizarCantidad(tipo.key, e.target.value)} className="w-20 px-3 py-2 border-3 border-cyan-400 rounded-lg focus:ring-3 focus:ring-cyan-300 font-bold text-center" placeholder="0" />
))}
{Object.keys(tiposDibujo).length > 0 && (

Resumen de láminas:

{Object.entries(tiposDibujo).map(([tipo, cantidad]) => { const tipoInfo = [ { key: 'planta', label: 'Planta', precio: 2 }, { key: 'elevacion', label: 'Elevación', precio: 3 }, { key: 'corte', label: 'Corte', precio: 4 }, { key: 'axonometria', label: 'Axonometría', precio: 5 }, { key: 'perspectiva1', label: 'Perspectiva 1 punto', precio: 6 }, { key: 'perspectiva2', label: 'Perspectiva 2 puntos', precio: 8 }, { key: 'perspectiva3', label: 'Perspectiva 3 puntos', precio: 10 } ].find(t => t.key === tipo); return (
✿ {tipoInfo.label}: {cantidad} S/. {(tipoInfo.precio * cantidad).toFixed(2)}
); })}
)}
{/* Complejidad */}
{/* Tiempo */}
setTiempoHoras(e.target.value)} className="w-full px-4 py-3 border-3 border-green-400 rounded-xl focus:ring-4 focus:ring-green-300 bg-white shadow-inner font-bold" placeholder="Ej: 5" step="0.5" />
{/* Color */}
{/* Datos */}
{/* Tipo de encargo */}
{/* Dificultad */}
{/* Botón calcular */} {/* Resultado */} {mostrarResultado && resultado && (

✿ Desglose de Costos ✿

{[ { label: 'Precio base', valor: resultado.base }, { label: 'Materiales', valor: resultado.costoMateriales }, { label: `Escala (${escala})`, valor: resultado.costoEscala }, { label: `Tipo(s) de dibujo (${Object.values(tiposDibujo).reduce((a, b) => a + b, 0)} láminas)`, valor: resultado.costoTiposDibujo }, { label: 'Complejidad', valor: resultado.costoComplejidad }, { label: `Tiempo (${resultado.horas} hrs × S/.2)`, valor: resultado.costoTiempo }, { label: 'Color', valor: resultado.costoColor }, { label: 'Datos', valor: resultado.costoDatos }, { label: 'Tipo de encargo', valor: resultado.costoEncargo } ].map((item, idx) => (
✿ {item.label}: S/. {item.valor.toFixed(2)}
))}
★ Subtotal: S/. {resultado.subtotal.toFixed(2)}
Multiplicador de dificultad: ×{resultado.multiplicador.toFixed(1)}
★ PRECIO FINAL: S/. {resultado.precioFinal.toFixed(2)}
Tiempo estimado: {resultado.horas} horas
)}
{/* Footer decorativo */}
✿ ★ ✿ Hecho con amor ✿ ★ ✿
); }