import { FieldValueTypes, OperatorTypes, Semantics } from '@unito/integration-api';

import assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import { getApplicableFilters } from '../src/helpers.js';

describe('Helpers', () => {
  describe('getApplicableFilters', () => {
    it('returns only filters for defined fields', () => {
      const actual = getApplicableFilters(
        {
          filters: [
            { field: 'status', operator: OperatorTypes.EQUAL, values: ['active', 'pending'] },
            { field: 'email', operator: OperatorTypes.IS_NOT_NULL, values: [] },
          ],
        },
        [
          {
            name: 'status',
            label: 'Status',
            type: FieldValueTypes.STRING,
          },
        ],
      );

      const expected = [{ field: 'status', operator: OperatorTypes.EQUAL, values: ['active', 'pending'] }];

      assert.deepEqual(actual, expected);
    });

    it('translates semantics into field names', () => {
      const actual = getApplicableFilters(
        {
          filters: [
            { field: 'semantic:displayName', operator: OperatorTypes.START_WITH, values: ['Bob'] },
            { field: 'semantic:createdAt', operator: OperatorTypes.EQUAL, values: ['2021-01-01'] },
          ],
        },
        [
          {
            name: 'name',
            label: 'Name',
            type: FieldValueTypes.STRING,
            semantic: Semantics.DISPLAY_NAME,
          },
        ],
      );

      const expected = [{ field: 'name', operator: OperatorTypes.START_WITH, values: ['Bob'] }];

      assert.deepEqual(actual, expected);
    });

    it('gracefully handle garbage', () => {
      const actual = getApplicableFilters(
        {
          filters: [
            { field: '...', operator: OperatorTypes.EQUAL, values: [] },
            { field: ':', operator: OperatorTypes.EQUAL, values: [] },
            { field: '', operator: OperatorTypes.EQUAL, values: [] },
          ],
        },
        [
          {
            name: 'status',
            label: 'Status',
            type: FieldValueTypes.STRING,
          },
        ],
      );

      assert.deepEqual(actual, []);
    });
  });
});
