import {
    DESIGN_WIDTH,
    DESIGN_HEIGHT,
    TARGET_FPS,
    MOVE_SPEED,
    PlayerColorState,
    JUMP_HEIGHT_STANDARD,
    JUMP_HEIGHT_CHARGED,
    JUMP_HEIGHT_YELLOW,
    JUMP_PREPARE_DELAY_MS,
    PARABOLIC_ANGLE_RIGHT,
    PARABOLIC_ANGLE_LEFT,
    SHURIKEN_INTERVAL_BASE,
    SHURIKEN_INTERVAL_UPGRADED,
    SWORD_INTERVAL,
    PERF_TOUCH_RESPONSE_MAX_MS,
    PERF_COMBO_RECOGNITION_MAX_MS,
    STORAGE_KEY,
} from '@common/Constants';

describe('Constants — requirement baseline values', () => {
    it('uses 960x540 landscape baseline (req tech-stack)', () => {
        expect(DESIGN_WIDTH).toBe(960);
        expect(DESIGN_HEIGHT).toBe(540);
        expect(DESIGN_WIDTH / DESIGN_HEIGHT).toBeCloseTo(16 / 9, 3);
    });

    it('locks target frame rate at 30 fps (req 18.1-18.3)', () => {
        expect(TARGET_FPS).toBe(30);
    });

    it('assigns 100/100/150 px/s move speeds per color state (req 5.1-5.2)', () => {
        expect(MOVE_SPEED[PlayerColorState.Red]).toBe(100);
        expect(MOVE_SPEED[PlayerColorState.Green]).toBe(100);
        expect(MOVE_SPEED[PlayerColorState.Yellow]).toBe(150);
    });

    it('uses 250/375/300 jump heights (req 2.2-2.3)', () => {
        expect(JUMP_HEIGHT_STANDARD).toBe(250);
        expect(JUMP_HEIGHT_CHARGED).toBe(375);
        expect(JUMP_HEIGHT_YELLOW).toBe(300);
    });

    it('reserves ~150ms crouch delay before leaving ground (req 2.8)', () => {
        expect(JUMP_PREPARE_DELAY_MS).toBe(150);
    });

    it('parabolic angles anchored at 45° and 135° (req 2.5)', () => {
        expect(PARABOLIC_ANGLE_RIGHT).toBe(45);
        expect(PARABOLIC_ANGLE_LEFT).toBe(135);
    });

    it('weapon intervals conform to 0.3/0.25/0.5s (req 3.4/3.6)', () => {
        expect(SHURIKEN_INTERVAL_BASE).toBe(0.3);
        expect(SHURIKEN_INTERVAL_UPGRADED).toBe(0.25);
        expect(SWORD_INTERVAL).toBe(0.5);
    });

    it('enforces <50ms touch and <100ms combo KPI thresholds (req 20.1/20.4)', () => {
        expect(PERF_TOUCH_RESPONSE_MAX_MS).toBe(50);
        expect(PERF_COMBO_RECOGNITION_MAX_MS).toBe(100);
    });

    it('defines all storage keys required by persistence (req 17 & 19.5)', () => {
        expect(STORAGE_KEY.LevelUnlock).toBeDefined();
        expect(STORAGE_KEY.ControlLayout).toBeDefined();
        expect(STORAGE_KEY.AudioVolume).toBeDefined();
        expect(STORAGE_KEY.TutorialDone).toBeDefined();
        expect(STORAGE_KEY.StoryIntroSeen).toBeDefined();
    });
});
