import {
  ComponentFixture,
  TestBed,
  waitForAsync,
} from '@angular/core/testing';
import { Router } from '@angular/router';
import { of as observableOf } from 'rxjs';

import { ConfigurationDataService } from '../../core/data/configuration-data.service';
import { RemoteData } from '../../core/data/remote-data';
import { GroupDataService } from '../../core/eperson/group-data.service';
import { PaginationService } from '../../core/pagination/pagination.service';
import { LinkHeadService } from '../../core/services/link-head.service';
import { Collection } from '../../core/shared/collection.model';
import { ConfigurationProperty } from '../../core/shared/configuration-property.model';
import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service';
import { RouterMock } from '../mocks/router.mock';
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
import {
  createSuccessfulRemoteDataObject,
  createSuccessfulRemoteDataObject$,
} from '../remote-data.utils';
import { PaginatedSearchOptions } from '../search/models/paginated-search-options.model';
import { PaginationServiceStub } from '../testing/pagination-service.stub';
import { SearchConfigurationServiceStub } from '../testing/search-configuration-service.stub';
import { createPaginatedList } from '../testing/utils.test';
import { RSSComponent } from './rss.component';



describe('RssComponent', () => {
  let comp: RSSComponent;
  let fixture: ComponentFixture<RSSComponent>;
  let uuid: string;
  let query: string;
  let groupDataService: GroupDataService;
  let linkHeadService: LinkHeadService;
  let configurationDataService: ConfigurationDataService;
  let paginationService;

  beforeEach(waitForAsync(() => {
    const mockCollection: Collection = Object.assign(new Collection(), {
      id: 'ce41d451-97ed-4a9c-94a1-7de34f16a9f4',
      name: 'test-collection',
      _links: {
        mappedItems: {
          href: 'https://rest.api/collections/ce41d451-97ed-4a9c-94a1-7de34f16a9f4/mappedItems',
        },
        self: {
          href: 'https://rest.api/collections/ce41d451-97ed-4a9c-94a1-7de34f16a9f4',
        },
      },
    });
    configurationDataService = jasmine.createSpyObj('configurationDataService', {
      findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), {
        name: 'test',
        values: [
          'org.dspace.ctask.general.ProfileFormats = test',
        ],
      })),
    });
    linkHeadService = jasmine.createSpyObj('linkHeadService', {
      addTag: '',
    });
    const mockCollectionRD: RemoteData<Collection> = createSuccessfulRemoteDataObject(mockCollection);
    const mockSearchOptions = observableOf(new PaginatedSearchOptions({
      pagination: Object.assign(new PaginationComponentOptions(), {
        id: 'search-page-configuration',
        pageSize: 10,
        currentPage: 1,
      }),
    }));
    groupDataService = jasmine.createSpyObj('groupsDataService', {
      findListByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])),
      getGroupRegistryRouterLink: '',
      getUUIDFromString: '',
    });
    paginationService = new PaginationServiceStub();
    const searchConfigService = {
      paginatedSearchOptions: mockSearchOptions,
    };
    TestBed.configureTestingModule({
      imports: [RSSComponent],
      providers: [
        { provide: GroupDataService, useValue: groupDataService },
        { provide: LinkHeadService, useValue: linkHeadService },
        { provide: ConfigurationDataService, useValue: configurationDataService },
        { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() },
        { provide: PaginationService, useValue: paginationService },
        { provide: Router, useValue: new RouterMock() },
      ],
    }).compileComponents();
  }));

  beforeEach(() => {
    uuid = '2cfcf65e-0a51-4bcb-8592-b8db7b064790';
    query = 'test';
    fixture = TestBed.createComponent(RSSComponent);
    comp = fixture.componentInstance;
  });

  it('should formulate the correct url given params in url', () => {
    const route = comp.formulateRoute(uuid, 'opensearch/search', query);
    expect(route).toBe('/opensearch/search?format=atom&scope=2cfcf65e-0a51-4bcb-8592-b8db7b064790&query=test');
  });

  it('should skip uuid if its null', () => {
    const route = comp.formulateRoute(null, 'opensearch/search', query);
    expect(route).toBe('/opensearch/search?format=atom&query=test');
  });

  it('should default to query * if none provided', () => {
    const route = comp.formulateRoute(null, 'opensearch/search', null);
    expect(route).toBe('/opensearch/search?format=atom&query=*');
  });
});