"use client";
import * as React from "react";
import { useForm, useFieldArray } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { LagrangeFormSchema, type LagrangeFormValues, type DataPoint } from "@/lib/schemas";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card";
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { PlusCircle, MinusCircle, Calculator, Sigma, Target, AlertTriangle, ListChecks, FunctionSquare, Spline } from "lucide-react";
import { calculateLagrangeInterpolation, type CalculationStep } from "@/app/actions";
import { useToast } from "@/hooks/use-toast";
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion";
import {
ChartContainer,
ChartTooltip,
ChartTooltipContent,
ChartLegend,
ChartLegendContent,
} from "@/components/ui/chart";
import { LineChart as RechartsLineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip as RechartsTooltip, Legend as RechartsLegend, Scatter, ReferenceDot, Label as RechartsLabel, ReferenceLine } from "recharts";
import { cn } from "@/lib/utils";
// Helper component to render fractions
const SymbolicFraction: React.FC<{ numerator: string | React.ReactNode; denominator: string | React.ReactNode; className?: string }> = ({ numerator, denominator, className }) => {
return (
{numerator}
{denominator}
);
};
export function LagrangeSolver() {
const { toast } = useToast();
const [isLoading, setIsLoading] = React.useState(false);
const [result, setResult] = React.useState<{
interpolatedValue: number | null;
polynomialTermsDisplay: string[];
calculationSteps: CalculationStep[];
plotData?: Array<{ x: number; original?: number; interpolated?: number; target?: number }>;
interpolationPoint?: number;
} | null>(null);
const [error, setError] = React.useState(null);
const form = useForm({
resolver: zodResolver(LagrangeFormSchema),
defaultValues: {
dataPoints: [{ x: "", y: "" }, { x: "", y: "" }],
interpolationX: "",
},
});
const { fields, append, remove } = useFieldArray({
control: form.control,
name: "dataPoints",
});
const onSubmit = async (values: LagrangeFormValues) => {
setIsLoading(true);
setResult(null);
setError(null);
const numericDataPoints: DataPoint[] = values.dataPoints.map(dp => ({
x: parseFloat(dp.x),
y: parseFloat(dp.y),
}));
const numericInterpolationX = parseFloat(values.interpolationX);
try {
const response = await calculateLagrangeInterpolation(numericDataPoints, numericInterpolationX);
if (response.error) {
setError(response.error);
toast({
title: "Calculation Error",
description: response.error,
variant: "destructive",
});
} else {
setResult(response);
}
} catch (e) {
const errorMessage = e instanceof Error ? e.message : "An unknown error occurred.";
setError(errorMessage);
toast({
title: "Unhandled Error",
description: errorMessage,
variant: "destructive",
});
} finally {
setIsLoading(false);
}
};
const chartConfig = {
original: { label: "Original Data", color: "hsl(var(--primary))" },
interpolated: { label: "Lagrange Polynomial", color: "hsl(var(--accent))" },
target: { label: `Interpolated L(${result?.interpolationPoint})`, color: "hsl(var(--destructive))" },
};
return (
);
}