import { describe, it, expect } from 'vitest';
import { Cooldown } from '../Cooldown';

describe('Cooldown', () => {
    it('изначально готов', () => {
        const cd = new Cooldown(1);
        expect(cd.ready).toBe(true);
        expect(cd.timeRemaining).toBe(0);
        expect(cd.progress).toBe(0);
    });

    it('trigger запускает отсчёт, update уменьшает', () => {
        const cd = new Cooldown(0.5);
        expect(cd.trigger()).toBe(true);
        expect(cd.ready).toBe(false);
        cd.update(0.2);
        expect(cd.timeRemaining).toBeCloseTo(0.3);
        cd.update(0.3);
        expect(cd.ready).toBe(true);
    });

    it('trigger не срабатывает, пока не готов', () => {
        const cd = new Cooldown(1);
        cd.trigger();
        expect(cd.trigger()).toBe(false);
        cd.update(1);
        expect(cd.trigger()).toBe(true);
    });

    it('triggerForce перебивает', () => {
        const cd = new Cooldown(2);
        cd.trigger();
        cd.update(1.5);
        cd.triggerForce();
        expect(cd.timeRemaining).toBeCloseTo(2);
    });

    it('progress: 1 сразу после trigger, 0 к концу', () => {
        const cd = new Cooldown(1);
        cd.trigger();
        expect(cd.progress).toBeCloseTo(1);
        cd.update(0.5);
        expect(cd.progress).toBeCloseTo(0.5);
        cd.update(0.5);
        expect(cd.progress).toBe(0);
    });

    it('обновление больше остатка не уводит в минус', () => {
        const cd = new Cooldown(0.1);
        cd.trigger();
        cd.update(5);
        expect(cd.ready).toBe(true);
        expect(cd.timeRemaining).toBe(0);
    });

    it('нулевой кулдаун всегда готов', () => {
        const cd = new Cooldown(0);
        cd.triggerForce();
        expect(cd.ready).toBe(true);
        expect(cd.progress).toBe(0);
    });

    it('reset возвращает готовность', () => {
        const cd = new Cooldown(3);
        cd.trigger();
        cd.reset();
        expect(cd.ready).toBe(true);
    });
});