import { describe, it, expect, vi } from 'vitest';
import {
  AlqoveClient,
  createAdminEndpoints,
  type BulkHideReviewsInput,
  type BulkHideReviewsResult,
} from '@alqove/api-client';

describe('api.admin.bulkHideReviews', () => {
  it('POSTs the right payload and resolves with hidden/skipped arrays', async () => {
    const client = new AlqoveClient({ baseUrl: 'http://test' });
    const expected: BulkHideReviewsResult = {
      data: {
        hidden: ['11111111-1111-1111-1111-111111111111'],
        skipped: [
          {
            id: '22222222-2222-2222-2222-222222222222',
            reason: 'already_hidden',
          },
        ],
      },
    };
    const postSpy = vi
      .spyOn(client, 'post')
      .mockResolvedValue(expected as unknown as never);

    const admin = createAdminEndpoints(client);
    const input: BulkHideReviewsInput = {
      review_ids: [
        '11111111-1111-1111-1111-111111111111',
        '22222222-2222-2222-2222-222222222222',
      ],
      justification:
        'These reviews violate the marketplace policy in identical ways.',
    };

    const result = await admin.bulkHideReviews(input);

    expect(postSpy).toHaveBeenCalledWith('/v1/admin/reviews/bulk-hide', input);
    expect(result.data.hidden).toEqual([
      '11111111-1111-1111-1111-111111111111',
    ]);
    expect(result.data.skipped[0]).toEqual({
      id: '22222222-2222-2222-2222-222222222222',
      reason: 'already_hidden',
    });
  });

  it('listActivity accepts event_prefix and review/review-report subject types', async () => {
    const client = new AlqoveClient({ baseUrl: 'http://test' });
    const getSpy = vi
      .spyOn(client, 'get')
      .mockResolvedValue({
        data: [],
        meta: { current_page: 1, last_page: 1, per_page: 25, total: 0 },
        links: { first: '', last: '', prev: null, next: null },
      } as unknown as never);

    const admin = createAdminEndpoints(client);
    await admin.listActivity({
      subject_type: 'Review',
      event_prefix: 'review.',
    });
    await admin.listActivity({ subject_type: 'ReviewReport' });

    const firstUrl = getSpy.mock.calls[0]?.[0] as string;
    expect(firstUrl).toContain('subject_type=Review');
    expect(firstUrl).toContain('event_prefix=review.');
    const secondUrl = getSpy.mock.calls[1]?.[0] as string;
    expect(secondUrl).toContain('subject_type=ReviewReport');
  });
});
