/**
 * Content-safety: romantic relationships are adults only (18+).
 *
 * These tests assert that:
 *  (a) characterSetup() creates NO romantic partner for an under-18 character,
 *      and DOES create one for an 18+ character.
 *  (b) getPartner() floors the generated partner's age at 18, even for a young
 *      (boundary) caller — partner age is never under 18.
 *  (c) handleGetSwipeCharacter() no-ops (serves no candidate) for an under-18
 *      player, and handleSwipeMatch() refuses to create a match for one.
 */
import { describe, it, expect } from 'vitest';
import { Person } from '../../../src/models/Person.js';
import { Player } from '../../../src/models/Player.js';
import {
  getPartner,
  characterSetup,
} from '../../../src/services/character/character_manager.js';

function makePlayer(ageYears: number): Player {
  const character = new Person({
    id: 'char-1',
    firstname: 'Test',
    lastname: 'Player',
    sex: 'Male',
    ageYears,
    ageDays: ageYears * 365,
  });
  return new Player({
    userId: 'user-1',
    character,
    status: 'playing',
    date: '2026-05-28',
  });
}

const ROMANTIC_TAGS = ['partner', 'girlfriend', 'boyfriend', 'dating', 'dating_match'];

function hasRomanticPartner(player: Player): boolean {
  if (player.c.partner) return true;
  return player.r.some((p) =>
    (p.relationships ?? []).some((r) => ROMANTIC_TAGS.includes(r.toLowerCase()))
  );
}

describe('romance content-safety age gate (18+)', () => {
  it('getPartner floors partner age at 18 regardless of caller age', () => {
    for (const age of [0, 13, 15, 16, 18, 19, 30]) {
      const player = makePlayer(age);
      getPartner(player);
      const partner = player.r.find((p) => p.id === player.c.partner);
      expect(partner).toBeDefined();
      expect((partner as Person).ageYears).toBeGreaterThanOrEqual(18);
      // ageDays must stay consistent with the (possibly floored) ageYears.
      expect((partner as Person).ageDays).toBeGreaterThanOrEqual(18 * 365);
    }
  });

  it('characterSetup creates NO romantic partner for an under-18 character', () => {
    for (const age of ['10', '13', '15', '17']) {
      const player = makePlayer(0);
      characterSetup(player, { name: 'Min Or', age, sex: 'Female' });
      expect(hasRomanticPartner(player)).toBe(false);
    }
  });

  it('characterSetup creates a romantic partner (18+) for an adult character', () => {
    const player = makePlayer(0);
    characterSetup(player, { name: 'Adult One', age: '25', sex: 'Female' });
    expect(hasRomanticPartner(player)).toBe(true);
    const partner = player.r.find((p) => p.id === player.c.partner);
    expect(partner).toBeDefined();
    expect((partner as Person).ageYears).toBeGreaterThanOrEqual(18);
  });
});
