import React, { useState } from "react";
import { DateTime } from "luxon";
function parseDate(input) {
const [day, month, year] = input.split("/").map(Number);
return DateTime.fromObject({ day, month, year });
}
function isLeapYear(year) {
return DateTime.fromObject({ year }).isInLeapYear;
}
function dayOfYear(date) {
return date.ordinal;
}
function daysRemaining(date) {
const total = isLeapYear(date.year) ? 366 : 365;
return total - date.ordinal;
}
function frecuenciaSolar(date) {
const base = DateTime.fromObject({ year: 1, month: 1, day: 1 });
return Math.floor(date.diff(base, "days").days) + 3;
}
function getAparato(date) {
const year = date.year;
const aparato = Math.floor((year - 1) / 4) + 1;
const index = (year - 1) % 4;
const tipo = ["ASUME", "ASIMILA", "DESAFIA", "DECIDE"][index] || "ASUME";
const colorMap = {
ASUME: "text-blue-500",
ASIMILA: "text-orange-500",
DESAFIA: "text-red-500",
DECIDE: "text-green-500"
};
const color = colorMap[tipo] || "text-black";
return { aparato, tipo, color };
}
const baseEstaciones = [
{ id: "E1", param: 353, dias: 707, tema: "Conciencia de Separación" },
{ id: "E2", param: 357, dias: 1064, tema: "Límite Interno – Pregunta Previa" },
{ id: "E3", param: 358, dias: 1422, tema: "Comunicación Interna" },
{ id: "E4", param: 359, dias: 1781, tema: "Conciencia del Error – Gestión espacio-tiempo" },
{ id: "E5", param: 360, dias: 2141, tema: "Sentido Biológico – Interface entre Mi y Tú" },
{ id: "E6", param: 361, dias: 2502, tema: "Comunicación Externa" },
{ id: "E7", param: 362, dias: 2864, tema: "Límite Externo – Proyección Diseño" },
{ id: "E8", param: 363, dias: 3227, tema: "Vista de Posibilidades – Potencial Diseño" },
{ id: "E9", param: 353, dias: 3580, tema: "Finalidad – Membrana / Redefinición" }
];
const CeldaEstacion = ({ estacion }) => {
if (!estacion.fp) {
return (
)}
{estacion.fp_aparato && (
)}
);
};
const CalculadorTUMI = () => {
const [fechaNacimiento, setFechaNacimiento] = useState("");
const [estaciones, setEstaciones] = useState(baseEstaciones);
const handleInputChange = (e) => {
setFechaNacimiento(e.target.value);
};
const handleCalcular = () => {
try {
const fechaBase = parseDate(fechaNacimiento);
const nuevas = baseEstaciones.map((est) => {
const fechaEst = fechaBase.plus({ days: est.dias });
const fp = dayOfYear(fechaEst);
const fn = daysRemaining(fechaEst);
const fa = Math.abs(fp - fn);
const fs = frecuenciaSolar(fechaEst);
const { aparato, tipo, color } = getAparato(fechaEst);
const startAparato = DateTime.fromObject({ year: aparato * 4 - 3, month: 1, day: 1 });
const diasDesdeInicioAparato = Math.floor(fechaEst.diff(startAparato, "days").days);
const fp_aparato = diasDesdeInicioAparato + 1;
const fn_aparato = 1461 - fp_aparato;
const fa_aparato = fp_aparato - fn_aparato;
const fecha_aparato = fechaEst.setLocale("es").toFormat("dd-LLL-yyyy-ccc");
return {
...est,
fp,
fn,
fa,
fs,
aparato,
tipo,
color,
fecha: fechaEst.setLocale("es").toFormat("dd-LLL-yyyy-ccc"),
fp_aparato,
fn_aparato,
fa_aparato,
fecha_aparato
};
});
setEstaciones(nuevas);
} catch (err) {
alert("Fecha inválida. Usa formato dd/mm/yyyy");
}
};
const layout = [
["E7", "E8", "E9"],
["E4", "E5", "E6"],
["E1", "E2", "E3"]
];
return (
);
};
export default CalculadorTUMI;
{estacion.id}
);
}
return (
{`${estacion.id} (${estacion.param}-${estacion.dias})`}
{estacion.fs ? `FS: ${estacion.fs}` : "FRECUENCIA SOLAR"}
{estacion.fa ? `FA: ${estacion.fa}` : "F. ANULACIÓN"}
{estacion.fn ? `FN: -${estacion.fn}` : "F. NEGATIVA"}
{estacion.fp ? `FP: ${estacion.fp}` : "F. POSITIVA"}
{estacion.fecha ? estacion.fecha : "FECHA (1-ENE-LUN)"}
{estacion.aparato ? (
<>
Aparato {estacion.aparato} –
{estacion.tipo}
>
) : (
"APARATO – TIPO DE AÑO"
)}
{estacion.fp_aparato && (
{`FA: ${estacion.fa_aparato}`}
{`FN: -${estacion.fn_aparato}`}
{`FP: ${estacion.fp_aparato}`}
{estacion.fecha_aparato}
{estacion.tema}
Calculador de Estaciones del TUMI
{layout.flat().map((id) => {
const est = estaciones.find((e) => e.id === id);
return ;
})}