"use client" import { use, useEffect, useState } from "react" import { useRouter, useSearchParams } from "next/navigation" import { AppLayout } from "@/components/app-layout" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { ArrowLeft, Calendar, User, Loader2, AlertCircle } from "lucide-react" import { Alert, AlertDescription } from "@/components/ui/alert" interface VersionData { id: number tramite_id: number version_nro: string tipo_cambio: string autor: string created_at: string payload: { id: number nombre: string estado: string formas_juridicas?: Array<{ id: number; nombre: string }> organismos?: Array<{ id: number; nombre: string }> jurisdiccion?: { id: number; nombre: string; tipo: string } documentacion?: string paso_a_paso?: string costos?: Array<{ descripcion: string; monto: string; moneda: string }> requiere_certificaciones_externas?: boolean certificaciones_detalle?: string link_guia_oficial?: string donde_se_realiza?: string comentarios_internos?: string } } export default function CompararVersionesPage({ params }: { params: Promise<{ id: string }> }) { const { id: tramiteId } = use(params) const router = useRouter() const searchParams = useSearchParams() const v1Id = searchParams.get("v1") const v2Id = searchParams.get("v2") const [version1, setVersion1] = useState(null) const [version2, setVersion2] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { const fetchVersions = async () => { if (!v1Id || !v2Id) { setError("Se requieren dos versiones para comparar") setIsLoading(false) return } try { const token = localStorage.getItem("token") if (!token) throw new Error("No autenticado") const [res1, res2] = await Promise.all([ fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/tramites/${tramiteId}/versiones/${v1Id}`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }), fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/tramites/${tramiteId}/versiones/${v2Id}`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }), ]) if (!res1.ok || !res2.ok) throw new Error("Error al cargar las versiones") const { data: data1 } = await res1.json() const { data: data2 } = await res2.json() setVersion1(data1) setVersion2(data2) } catch (err) { console.error(err) setError("No se pudieron cargar las versiones para comparar") } finally { setIsLoading(false) } } fetchVersions() }, [tramiteId, v1Id, v2Id]) if (isLoading) { return (
) } if (error || !version1 || !version2) { return (
{error || "No se encontraron las versiones"}
) } const getDifference = (val1: any, val2: any): boolean => { if (typeof val1 === "object" && typeof val2 === "object") { return JSON.stringify(val1) !== JSON.stringify(val2) } return val1 !== val2 } return (
{/* Header */}

Comparación de Versiones

Diferencias entre versión {version1.version_nro} y versión {version2.version_nro}

{/* Comparison Grid */}
{/* Version 1 */}
Versión {version1.version_nro} {version1.tipo_cambio}
{new Date(version1.created_at).toLocaleDateString("es-AR")} {version1.autor || "Sistema"}
{version1.payload.formas_juridicas && ( fj.nombre).join(", ")} isDifferent={getDifference(version1.payload.formas_juridicas, version2.payload.formas_juridicas)} /> )} {version1.payload.organismos && ( org.nombre).join(", ")} isDifferent={getDifference(version1.payload.organismos, version2.payload.organismos)} /> )} {version1.payload.jurisdiccion && ( )} {version1.payload.donde_se_realiza && ( )} {version1.payload.link_guia_oficial && ( )}
{/* Version 2 */}
Versión {version2.version_nro} {version2.tipo_cambio}
{new Date(version2.created_at).toLocaleDateString("es-AR")} {version2.autor || "Sistema"}
{version2.payload.formas_juridicas && ( fj.nombre).join(", ")} isDifferent={getDifference(version1.payload.formas_juridicas, version2.payload.formas_juridicas)} /> )} {version2.payload.organismos && ( org.nombre).join(", ")} isDifferent={getDifference(version1.payload.organismos, version2.payload.organismos)} /> )} {version2.payload.jurisdiccion && ( )} {version2.payload.donde_se_realiza && ( )} {version2.payload.link_guia_oficial && ( )}
) } function CompareField({ label, value, isDifferent }: { label: string; value: string; isDifferent: boolean }) { return (

{value || "N/A"}

{isDifferent && Modificado}
) }