import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { TranslateModule } from '@ngx-translate/core';

import { ScriptDataService } from '../../core/data/processes/script-data.service';
import { Process } from '../../process-page/processes/process.model';
import { ProcessParameter } from '../../process-page/processes/process-parameter.model';
import { NotificationsService } from '../notifications/notifications.service';
import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils';
import { NotificationsServiceStub } from '../testing/notifications-service.stub';
import { BulkAccessControlService } from './bulk-access-control.service';

describe('BulkAccessControlService', () => {
  let service: BulkAccessControlService;
  let scriptServiceSpy: jasmine.SpyObj<ScriptDataService>;

  const mockPayload: any = {
    'bitstream': [],
    'item': [
      {
        'name': 'embargo',
        'startDate': {
          'year': 2026,
          'month': 5,
          'day': 31,
        },
        'endDate': null,
      },
    ],
    'state': {
      'item': {
        'toggleStatus': true,
        'accessMode': 'replace',
      },
      'bitstream': {
        'toggleStatus': false,
        'accessMode': '',
        'changesLimit': '',
        'selectedBitstreams': [],
      },
    },
  };

  beforeEach(() => {
    const spy = jasmine.createSpyObj('ScriptDataService', ['invoke']);
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule,
        TranslateModule.forRoot(),
      ],
      providers: [
        BulkAccessControlService,
        { provide: ScriptDataService, useValue: spy },
        { provide: NotificationsService, useValue: NotificationsServiceStub },
      ],
    });
    service = TestBed.inject(BulkAccessControlService);
    scriptServiceSpy = TestBed.inject(ScriptDataService) as jasmine.SpyObj<ScriptDataService>;
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  describe('createPayloadFile', () => {
    it('should create a file and return the URL and file object', () => {
      const payload = mockPayload;
      const result = service.createPayloadFile(payload);

      expect(result.url).toBeTruthy();
      expect(result.file).toBeTruthy();
    });
  });

  describe('executeScript', () => {
    it('should invoke the script service with the correct parameters', () => {
      const uuids = ['123', '456'];
      const file = new File(['test'], 'data.json', { type: 'application/json' });
      const expectedParams: ProcessParameter[] = [
        { name: '-f', value: 'data.json' },
        { name: '-u', value: '123' },
        { name: '-u', value: '456' },
      ];

      // @ts-ignore
      scriptServiceSpy.invoke.and.returnValue(createSuccessfulRemoteDataObject$(new Process()));

      const result = service.executeScript(uuids, file);

      expect(scriptServiceSpy.invoke).toHaveBeenCalledWith('bulk-access-control', expectedParams, [file]);
      expect(result).toBeTruthy();
    });
  });
});