58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import type { Outcome, Match, AIPrediction, Team } from "./types";
|
|
|
|
export function outcomeLabel(match: Match, o: Outcome): string {
|
|
if (o === "TEAM_A_WIN") return `${match.teamA.shortName} 승`;
|
|
if (o === "TEAM_B_WIN") return `${match.teamB.shortName} 승`;
|
|
return "무승부";
|
|
}
|
|
|
|
// D3: 확률 = "이긴다고 예측한 팀의 승리 확률". 무승부 예측이면 "무승부 가능성".
|
|
export function winProb(
|
|
match: Match,
|
|
p: Pick<AIPrediction, "outcome" | "confidencePct">,
|
|
): { team: Team | null; label: string; pct: number } {
|
|
if (p.outcome === "TEAM_A_WIN")
|
|
return { team: match.teamA, label: `${match.teamA.shortName} 승리 확률`, pct: p.confidencePct };
|
|
if (p.outcome === "TEAM_B_WIN")
|
|
return { team: match.teamB, label: `${match.teamB.shortName} 승리 확률`, pct: p.confidencePct };
|
|
return { team: null, label: "무승부 가능성", pct: p.confidencePct };
|
|
}
|
|
|
|
// "6월 12일 (금)" — 대시보드 날짜 그룹 헤더
|
|
export function dateHeading(iso: string): string {
|
|
const days = ["일", "월", "화", "수", "목", "금", "토"];
|
|
const dm = iso.match(/(\d{4})-(\d{2})-(\d{2})/);
|
|
if (!dm) return iso;
|
|
const [, y, mo, d] = dm;
|
|
const dow = days[new Date(Date.UTC(+y, +mo - 1, +d)).getUTCDay()];
|
|
return `${+mo}월 ${+d}일 (${dow})`;
|
|
}
|
|
|
|
// "11:00" — 경기 카드 시간
|
|
export function timeOnly(iso: string): string {
|
|
const m = iso.match(/T(\d{2}):(\d{2})/);
|
|
return m ? `${m[1]}:${m[2]}` : "";
|
|
}
|
|
|
|
// "2026-06-12" — 날짜 그룹 키
|
|
export function dateKey(iso: string): string {
|
|
const m = iso.match(/(\d{4}-\d{2}-\d{2})/);
|
|
return m ? m[1] : iso;
|
|
}
|
|
|
|
export function kickoffDisplay(iso: string): string {
|
|
// iso는 KST(+09:00). 런타임 TZ에 무관하게 ISO 문자열을 직접 파싱한다.
|
|
const days = ["일", "월", "화", "수", "목", "금", "토"];
|
|
const dm = iso.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/);
|
|
if (!dm) return iso;
|
|
const [, y, mo, d, hh, mm] = dm;
|
|
// 요일은 달력 날짜 기준(UTC Date로 계산하면 TZ 무관)
|
|
const dow = days[new Date(Date.UTC(+y, +mo - 1, +d)).getUTCDay()];
|
|
return `${+mo}.${+d}(${dow}) ${hh}:${mm} KST`;
|
|
}
|
|
|
|
export function pct(part: number, total: number): number {
|
|
if (!total) return 0;
|
|
return Math.round((part / total) * 100);
|
|
}
|