import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core'; export type MoveNavDirection = 'first' | 'prev' | 'next' | 'last'; interface MovePair { white: string; black: string | null; } @Component({ selector: 'app-move-history', standalone: true, imports: [], templateUrl: './move-history.component.html', styleUrl: './move-history.component.css' }) export class MoveHistoryComponent implements OnChanges { @Input({ required: true }) moves: string[] = []; @Input() viewingPly: number | null = null; @Output() navigate = new EventEmitter(); @Output() navigateToPly = new EventEmitter(); @ViewChild('movesEl') movesEl?: ElementRef; movePairs: MovePair[] = []; get plyCount(): number { return this.moves.length; } get isLive(): boolean { return this.viewingPly === null || this.viewingPly >= this.moves.length - 1; } ngOnChanges(): void { this.movePairs = this.buildPairs(this.moves); } isWhiteViewing(pairIndex: number): boolean { const ply = this.viewingPly ?? this.moves.length - 1; return ply === pairIndex * 2; } isBlackViewing(pairIndex: number): boolean { const ply = this.viewingPly ?? this.moves.length - 1; return ply === pairIndex * 2 + 1; } clickWhite(pairIndex: number): void { this.navigateToPly.emit(pairIndex * 2); } clickBlack(pairIndex: number, black: string | null): void { if (!black) return; this.navigateToPly.emit(pairIndex * 2 + 1); } private buildPairs(moves: string[]): MovePair[] { const pairs: MovePair[] = []; for (let i = 0; i < moves.length; i += 2) { pairs.push({ white: moves[i], black: moves[i + 1] ?? null }); } return pairs; } }