/**
 * clients.service.createRelationship - tenant-FK validation tests.
 *
 * Covers the fix that requires both clientAId (the URL id) and clientBId
 * (the body id) to belong to the caller's port. The list endpoint joins
 * clientRelationships → clients without a port filter, so a foreign-port
 * clientBId would surface that client's name in the relationship payload.
 */
import { describe, it, expect, beforeAll } from 'vitest';

describe('clients.service - createRelationship port isolation', () => {
  let createRelationship: typeof import('@/lib/services/clients.service').createRelationship;

  let makePort: typeof import('../helpers/factories').makePort;
  let makeClient: typeof import('../helpers/factories').makeClient;
  let makeAuditMeta: typeof import('../helpers/factories').makeAuditMeta;

  beforeAll(async () => {
    const svc = await import('@/lib/services/clients.service');
    createRelationship = svc.createRelationship;

    const factories = await import('../helpers/factories');
    makePort = factories.makePort;
    makeClient = factories.makeClient;
    makeAuditMeta = factories.makeAuditMeta;
  });

  it('rejects createRelationship when clientBId belongs to a foreign port', async () => {
    const portA = await makePort();
    const portB = await makePort();
    const localClient = await makeClient({ portId: portA.id });
    const foreignClient = await makeClient({ portId: portB.id });

    await expect(
      createRelationship(
        localClient.id,
        portA.id,
        { clientBId: foreignClient.id, relationshipType: 'family' },
        makeAuditMeta({ portId: portA.id }),
      ),
    ).rejects.toThrow(/clientBId not found in this port/);
  });

  it('rejects creating a self-relationship', async () => {
    const portA = await makePort();
    const localClient = await makeClient({ portId: portA.id });

    await expect(
      createRelationship(
        localClient.id,
        portA.id,
        { clientBId: localClient.id, relationshipType: 'family' },
        makeAuditMeta({ portId: portA.id }),
      ),
    ).rejects.toThrow(/cannot have a relationship to themselves/);
  });

  it('accepts createRelationship when both clients are in the same port', async () => {
    const portA = await makePort();
    const clientA = await makeClient({ portId: portA.id });
    const clientB = await makeClient({ portId: portA.id });

    const rel = await createRelationship(
      clientA.id,
      portA.id,
      { clientBId: clientB.id, relationshipType: 'family' },
      makeAuditMeta({ portId: portA.id }),
    );

    expect(rel.clientAId).toBe(clientA.id);
    expect(rel.clientBId).toBe(clientB.id);
    expect(rel.portId).toBe(portA.id);
  });
});
