/**
 * Внутреигровое время суток. Темп: 1 секунда реального времени = 1 игровая
 * минута (сутки = 24 минуты реального). Чистый класс без Pixi — тестируется
 * в Vitest; живёт на Game (LocationScene пересоздаётся при переходах).
 */

/** Игровых минут за секунду реального времени. */
export const GAME_MIN_PER_SEC = 1;
/** Минут в сутках. */
export const DAY_MINUTES = 1440;
/** Время старта новой игры (8:00). */
export const START_MINUTES = 8 * 60;

export class GameClock {
    /** Сырые минуты суток (float, 0..1440). */
    private m = START_MINUTES;

    /** Целые минуты суток 0..1439. */
    get minutes(): number {
        return Math.floor(this.m) % DAY_MINUTES;
    }

    /** Часы суток float 0..24 — вход кривой dayNightFactor. */
    get hours(): number {
        return this.m / 60;
    }

    /** Строка для часов предмета: «8:00», «13:05» (часы без ведущего нуля). */
    get label(): string {
        const m = this.minutes;
        const h = Math.floor(m / 60);
        const mm = m % 60;
        return `${h}:${mm < 10 ? '0' : ''}${mm}`;
    }

    /** Продвинуть время на dtSec секунд реального времени. */
    advance(dtSec: number): void {
        this.m = (this.m + dtSec * GAME_MIN_PER_SEC) % DAY_MINUTES;
    }

    /** Перемотка (мост/загрузка): mod 1440, отрицательные — в диапазон. */
    set(minutes: number): void {
        this.m = ((minutes % DAY_MINUTES) + DAY_MINUTES) % DAY_MINUTES;
    }

    /** Новая игра: 8:00. */
    reset(): void {
        this.set(START_MINUTES);
    }
}