import React from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { MainLayout } from '@/components/layout/MainLayout.tsx';
import PageHeader from '@/components/layout/PageHeader.tsx';
import ResourceFlowCard from '@/components/resource-flow/ResourceFlowCard.tsx';
import MatchesList from '@/components/matches/MatchesList.tsx';
import { Container, Stack, Grid, Flex } from '@/components/ui/layout';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card.tsx';
import Button from '@/components/ui/Button.tsx';
import Badge from '@/components/ui/Badge.tsx';
import { useTranslation } from '@/hooks/useI18n.tsx';
import { useResourceFlow } from '@/hooks/api/useResourcesAPI.ts';
import { useNavigation } from '@/hooks/useNavigation.tsx';
import { ArrowLeft, DollarSign, FlaskConical, Thermometer, TrendingUp } from 'lucide-react';
import type { BackendResourceFlow } from '@/schemas/backend/resource-flow';
const ResourceFlowDetailPage = () => {
const { id } = useParams<{ id: string }>();
const navigate = useNavigate();
const { t } = useTranslation();
const { handleBackNavigation, handleFooterNavigate } = useNavigation();
const { data: resourceFlow, isLoading, error } = useResourceFlow(id);
if (isLoading) {
return (
);
}
if (error || !resourceFlow) {
return (
{error?.message || t('resourceFlowDetail.notFound')}
);
}
const handleViewMatches = (resourceId: string) => {
navigate(`/matching?resourceId=${resourceId}`);
};
return (
{/* Resource Flow Overview */}
{/* Key Metrics */}
{/* Quality Parameters */}
{t('resourceFlowDetail.qualityParameters')}
{/* Economic Data */}
{(resourceFlow.EconomicData?.cost_in ||
resourceFlow.EconomicData?.cost_out ||
resourceFlow.EconomicData?.waste_disposal_cost) && (
{t('resourceFlowDetail.economicData')}
)}
{/* Related Matches */}
);
};
// Component for displaying key metrics
const ResourceFlowMetrics: React.FC<{ resourceFlow: BackendResourceFlow }> = ({ resourceFlow }) => {
const { t } = useTranslation();
const metrics = [
{
label: t('resourceFlowDetail.direction'),
value: (
{t(`resourceFlowDirection.${resourceFlow.Direction}`)}
),
icon: ,
},
{
label: t('resourceFlowDetail.type'),
value: (
{t(`resourceTypes.${resourceFlow.Type}`)}
),
icon: ,
},
{
label: t('resourceFlowDetail.precision'),
value: (
{t(`precisionLevels.${resourceFlow.PrecisionLevel || 'estimated'}`)}
),
icon: ,
},
{
label: t('resourceFlowDetail.source'),
value: (
{t(`sourceTypes.${resourceFlow.SourceType || 'declared'}`)}
),
icon: ,
},
];
return (
<>
{metrics.map((metric, index) => (
{metric.icon}
{metric.label}
{metric.value}
))}
>
);
};
// Component for displaying quality parameters
const QualityParametersTable: React.FC<{ resourceFlow: BackendResourceFlow }> = ({ resourceFlow }) => {
const { t } = useTranslation();
const qualityData = resourceFlow.Quality || {};
const quantityData = resourceFlow.Quantity || {};
const parameters = [
{
label: t('resourceFlowDetail.quantity.amount'),
value: quantityData.amount ? `${quantityData.amount} ${quantityData.unit || ''}` : t('common.na'),
},
{
label: t('resourceFlowDetail.quantity.temporalUnit'),
value: quantityData.temporal_unit ? t(`temporalUnits.${quantityData.temporal_unit}`) : t('common.na'),
},
{
label: t('resourceFlowDetail.quality.temperature'),
value: qualityData.temperature_celsius ? `${qualityData.temperature_celsius}°C` : t('common.na'),
},
{
label: t('resourceFlowDetail.quality.pressure'),
value: qualityData.pressure_bar ? `${qualityData.pressure_bar} bar` : t('common.na'),
},
{
label: t('resourceFlowDetail.quality.purity'),
value: qualityData.purity_pct ? `${qualityData.purity_pct}%` : t('common.na'),
},
{
label: t('resourceFlowDetail.quality.physicalState'),
value: qualityData.physical_state ? t(`physicalStates.${qualityData.physical_state}`) : t('common.na'),
},
];
return (
{parameters.map((param, index) => (
{param.label}
{param.value}
))}
);
};
// Component for displaying economic data
const EconomicDataDisplay: React.FC<{ resourceFlow: BackendResourceFlow }> = ({ resourceFlow }) => {
const { t } = useTranslation();
const economicData = resourceFlow.EconomicData || {};
const costs = [
{
label: t('resourceFlowDetail.economic.costIn'),
value: economicData.cost_in ? `€${economicData.cost_in}/${resourceFlow.Quantity?.unit || 'unit'}` : null,
},
{
label: t('resourceFlowDetail.economic.costOut'),
value: economicData.cost_out ? `€${economicData.cost_out}/${resourceFlow.Quantity?.unit || 'unit'}` : null,
},
{
label: t('resourceFlowDetail.economic.wasteCost'),
value: economicData.waste_disposal_cost ? `€${economicData.waste_disposal_cost}/${resourceFlow.Quantity?.unit || 'unit'}` : null,
},
{
label: t('resourceFlowDetail.economic.transportCost'),
value: economicData.transportation_cost ? `€${economicData.transportation_cost}/km` : null,
},
].filter(cost => cost.value);
if (costs.length === 0) {
return (
{t('resourceFlowDetail.economic.noData')}
);
}
return (
{costs.map((cost, index) => (
{cost.label}
{cost.value}
))}
);
};
export default ResourceFlowDetailPage;