import { TrendingDown, TrendingUp } from "lucide-react";
import type { Program } from "@/types/yokatlas";

/** Taban sıra sütunlarının yapısal alt kümesi: hem DB programı hem de
 *  rapordaki kaydedilmiş sıra geçmişi (bkz. raporSiraSerisi) bu tipe uyar. */
export type SiraSerisi = Pick<
  Program,
  "sira2021" | "sira2022" | "sira2023" | "sira2024" | "sira2025"
>;

/** Rapordaki [2021..2025] dizisini sütunlu seriye çevirir. */
export function raporSiraSerisi(gecmis?: (number | null)[]): SiraSerisi {
  const g = gecmis ?? [];
  return {
    sira2021: g[0] ?? null,
    sira2022: g[1] ?? null,
    sira2023: g[2] ?? null,
    sira2024: g[3] ?? null,
    sira2025: g[4] ?? null,
  };
}

export function programEtkinSira(program: SiraSerisi): number | null {
  return program.sira2025 ?? program.sira2024;
}

/** 2021–2025 taban sıralamasını sonuç listesindeki kompakt çizgiyle gösterir. */
export function ProgramSiraGecmisi({ program }: { program: SiraSerisi }) {
  const yillar = [
    [2021, program.sira2021],
    [2022, program.sira2022],
    [2023, program.sira2023],
    [2024, program.sira2024],
    [2025, program.sira2025],
  ].filter((yil): yil is [number, number] => yil[1] != null);

  if (yillar.length < 2) return <span className="text-slate-400">—</span>;

  const siralar = yillar.map(([, sira]) => sira);
  const min = Math.min(...siralar);
  const max = Math.max(...siralar);
  const genislik = 56;
  const yukseklik = 18;
  const bosluk = 2;
  const noktalar = yillar.map(([yil, sira], index) => {
    const x =
      bosluk +
      (index / (yillar.length - 1)) * (genislik - bosluk * 2);
    const y =
      max === min
        ? yukseklik / 2
        : bosluk +
          ((sira - min) / (max - min)) * (yukseklik - bosluk * 2);
    return { x, y, yil, sira };
  });
  const son = noktalar[noktalar.length - 1];
  const ozet = yillar
    .map(([yil, sira]) => `${yil}: ~${sira.toLocaleString("tr-TR")}.`)
    .join("\n");

  return (
    <svg
      viewBox={`0 0 ${genislik} ${yukseklik}`}
      className="inline-block h-4.5 w-14 text-slate-300"
      role="img"
      aria-label={`Taban sıra geçmişi. ${ozet.replaceAll("\n", " ")}`}
    >
      <title>{ozet}</title>
      <polyline
        points={noktalar.map((nokta) => `${nokta.x},${nokta.y}`).join(" ")}
        fill="none"
        stroke="currentColor"
        strokeWidth="1.5"
        strokeLinecap="round"
        strokeLinejoin="round"
      />
      <circle cx={son.x} cy={son.y} r="2" className="fill-slate-500" />
    </svg>
  );
}

/** Son iki yılın tabanı %10'dan fazla değiştiğinde yönü işaretler. */
export function ProgramTabanTrendi({ program }: { program: SiraSerisi }) {
  if (program.sira2025 == null || program.sira2024 == null) return null;

  const oran = (program.sira2024 - program.sira2025) / program.sira2024;
  if (Math.abs(oran) < 0.1) return null;

  const gecis = `${program.sira2024.toLocaleString("tr-TR")} → ${program.sira2025.toLocaleString("tr-TR")}`;
  if (oran > 0) {
    return (
      <TrendingUp
        className="size-3 shrink-0 text-amber-500"
        aria-label={`Taban yükseliyor: ${gecis}`}
        role="img"
      >
        <title>{`Taban yükseliyor: ${gecis}`}</title>
      </TrendingUp>
    );
  }

  return (
    <TrendingDown
      className="size-3 shrink-0 text-emerald-600"
      aria-label={`Taban geriliyor: ${gecis}`}
      role="img"
    >
      <title>{`Taban geriliyor: ${gecis}`}</title>
    </TrendingDown>
  );
}
