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

describe('Camera dead zone', () => {
    it('без dead zone — камера центрируется на цели', () => {
        const cam = new Camera(480, 270);
        cam.follow(100, 50);
        expect(cam.x).toBe(100);
        expect(cam.y).toBe(50);
    });

    it('цель внутри окна — камера стоит', () => {
        const cam = new Camera(480, 270);
        cam.snap(240, 135);
        cam.deadZone = { width: 160, height: 100 };
        cam.follow(240 + 60, 135 + 30); // внутри окна
        expect(cam.x).toBe(240);
        expect(cam.y).toBe(135);
    });

    it('цель толкает камеру ровно на величину выхода', () => {
        const cam = new Camera(480, 270);
        cam.snap(240, 135);
        cam.deadZone = { width: 160, height: 100 };
        cam.follow(240 + 100, 135 - 70); // выход 20 и 20 за окно
        expect(cam.x).toBe(260);
        expect(cam.y).toBe(115);
    });

    it('snap ставит камеру на точку, минуя окно', () => {
        const cam = new Camera(480, 270);
        cam.deadZone = { width: 160, height: 100 };
        cam.snap(300, 200);
        expect(cam.x).toBe(300);
        expect(cam.y).toBe(200);
        // Окно сохранено: дальнейшее движение снова с dead zone.
        cam.follow(300 + 50, 200);
        expect(cam.x).toBe(300);
    });

    it('границы мира держат камеру прижатой', () => {
        const cam = new Camera(480, 270);
        cam.bounds = { x: -400, y: -120, width: 800, height: 400 };
        cam.snap(-1000, 500); // за границей по обеим осям
        expect(cam.x).toBe(-160); // -400 + 480/2
        expect(cam.y).toBe(145); // -120 + 400 - 270/2
    });
});