"use client"; import type { ParcelSuccessRecommendation, SuccessRankingBucket, } from "@/types/site-finder"; interface Props { recommendation: ParcelSuccessRecommendation | null | undefined; } function successColor(score: number): string { if (score > 0.5) return "var(--success)"; if (score >= 0) return "var(--warn)"; return "var(--fg-tertiary)"; } function successBg(score: number): string { if (score > 0.5) return "var(--success-soft)"; if (score >= 0) return "var(--warn-soft)"; return "var(--bg-card-alt)"; } function formatPrice(v: number | null): string { if (v == null) return "—"; return (v / 1000).toFixed(0) + " тыс"; } function formatArea(v: number | null): string { if (v == null) return "—"; return v.toFixed(0) + " м²"; } function SuccessBadge({ bucket }: { bucket: SuccessRankingBucket }) { const color = successColor(bucket.success_score); const bg = successBg(bucket.success_score); return (
{bucket.success_score.toFixed(2)}
); } export function SuccessRecommendationBlock({ recommendation }: Props) { if (!recommendation || recommendation.ranking.length === 0) { return (
Недостаточно сделок в районе для рейтинга (мин 15)
); } const { district, ranking, top_bucket, note, data_confidence } = recommendation; const isWeak = data_confidence === "weak"; const top5 = ranking.slice(0, 5); return (
Что хорошо продаётся в районе {district}
{isWeak && ( слабые данные, ориентировочно )}
{[ "Бакет", "Сделок", "Ср. цена ₽/м²", "Ср. площадь м²", "Успех", ].map((h) => ( ))} {top5.map((row) => { const isTop = row.bucket === top_bucket.bucket; return ( ); })}
{h}
{isTop ? "* " : ""} {row.bucket} {row.n_deals} {formatPrice(row.avg_price_per_m2)} {formatArea(row.avg_area_m2)}
{note}
); }