/**
 * Passive-worker fairness (T11): a Balanced/Work-Hard worker can't random-walk
 * into a no-warning firing; only a deliberate Slack Off puts the job at risk.
 */
import { describe, it, expect } from 'vitest';
import { PlayerFactory } from '../../src/testing/PlayerFactory.js';
import { applyForJob, setJobFocus, handleJob, getOccupations, BALANCED_PERF_FLOOR } from '../../src/services/jobs/job_manager.js';

function employ(focus: 'Balanced' | 'Slack Off' | 'Work Hard'): any {
  const p: any = PlayerFactory.createAtAge(30);
  p.c.education = 'bachelors_degree';
  const occ = getOccupations().find((o: any) => o.title === 'Accountant') ?? getOccupations()[0];
  applyForJob(p, occ.id);
  setJobFocus(p.c, focus);
  return p;
}

describe('passive-worker firing floor', () => {
  it('a Balanced worker never gets fired over a long career', () => {
    const p = employ('Balanced');
    let fired = false;
    for (let week = 0; week < 1000; week++) {
      const r = handleJob(p, p.c);
      if (r?.fired) { fired = true; break; }
    }
    expect(fired).toBe(false);
    // And performance stays above the fairness floor.
    const rec = p.c.activityRecords.find((r: any) => r.id === p.c.job?.id || r.performance !== undefined);
    if (rec) expect(rec.performance).toBeGreaterThanOrEqual(BALANCED_PERF_FLOOR - 1);
  });

  it('a deliberate Slack Off worker CAN still be fired', () => {
    // Deterministic worst-case RNG (always the low end of the roll).
    const p = employ('Slack Off');
    let fired = false;
    for (let week = 0; week < 1000; week++) {
      const r = handleJob(p, p.c, () => 0); // always min roll -> performance falls
      if (r?.fired) { fired = true; break; }
      if (!p.c.job) { fired = true; break; }
    }
    expect(fired).toBe(true);
  });
});
