import { describe, it, expect } from 'vitest';
import { FieldAuthorizationError, defineFieldGroup, isFieldAuthorizationError } from '@platform-modules/fields';
import {
  DEFAULT_CONTENT_FIELD_GROUP,
  fieldsActorFromPrincipal,
  mapFieldError,
} from './fields.js';

describe('fields host lib', () => {
  it('DEFAULT_CONTENT_FIELD_GROUP is a valid generic content group', () => {
    const group = defineFieldGroup({
      key: DEFAULT_CONTENT_FIELD_GROUP.key,
      label: DEFAULT_CONTENT_FIELD_GROUP.label,
      location: DEFAULT_CONTENT_FIELD_GROUP.location,
      fields: DEFAULT_CONTENT_FIELD_GROUP.fields,
    });
    expect(group.key).toBe('content_attrs');
    const keys = group.fields.map((f) => f.key);
    expect(keys).toContain('subtitle');
    expect(keys).toContain('featured_image');
    expect(keys).toContain('seo_description');
    expect(keys).not.toContain('npmPackage');
    expect(keys).not.toContain('layer');
    expect(keys).not.toContain('repoUrl');
  });

  it('fieldsActorFromPrincipal maps admin and editor capabilities', () => {
    const admin = fieldsActorFromPrincipal({ userId: 'a1', roles: ['admin'], sessionId: 's' });
    expect(admin).toEqual({ id: 'a1', canEditFields: true, canManageGroups: true });

    const editor = fieldsActorFromPrincipal({ userId: 'e1', roles: ['editor'], sessionId: 's' });
    expect(editor).toEqual({ id: 'e1', canEditFields: true, canManageGroups: false });
  });

  it('mapFieldError maps field authz to 403 and unknown to 500', async () => {
    const authz = new FieldAuthorizationError('u', 'edit fields');
    const forbidden = mapFieldError(authz);
    expect(forbidden.status).toBe(403);
    expect(isFieldAuthorizationError(authz)).toBe(true);

    const internal = mapFieldError(new Error('boom'));
    expect(internal.status).toBe(500);
  });
});
