/* eslint-disable no-empty, @typescript-eslint/no-empty-function */
import {
  Observable,
  of,
} from 'rxjs';

import { FindListOptions } from '../../core/data/find-list-options.model';
import { PaginatedList } from '../../core/data/paginated-list.model';
import { RemoteData } from '../../core/data/remote-data';
import { DSpaceObject } from '../../core/shared/dspace-object.model';
import { Item } from '../../core/shared/item.model';
import { Relationship } from '../../core/shared/item-relationships/relationship.model';
import { MetadataValue } from '../../core/shared/metadata.models';
import { MetadataRepresentation } from '../../core/shared/metadata-representation/metadata-representation.model';
import { NoContent } from '../../core/shared/NoContent.model';
import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils';
import { FollowLinkConfig } from '../utils/follow-link-config.model';

/**
 * Stub class of {@link RelationshipDataService}
 */
export class RelationshipDataServiceStub {

  deleteRelationship(_id: string, _copyVirtualMetadata: string, _shouldRefresh = true): Observable<RemoteData<NoContent>> {
    return createSuccessfulRemoteDataObject$({});
  }

  addRelationship(_typeId: string, _item1: Item, _item2: Item, _leftwardValue?: string, _rightwardValue?: string, _shouldRefresh = true): Observable<RemoteData<Relationship>> {
    return createSuccessfulRemoteDataObject$(new Relationship());
  }

  refreshRelationshipItemsInCache(_item: Item): void {
  }

  getItemRelationshipsArray(_item: Item, ..._linksToFollow: FollowLinkConfig<Relationship>[]): Observable<Relationship[]> {
    return of([]);
  }

  getRelatedItems(_item: Item): Observable<Item[]> {
    return of([]);
  }

  getRelatedItemsByLabel(_item: Item, _label: string, _options?: FindListOptions): Observable<RemoteData<PaginatedList<Item>>> {
    return createSuccessfulRemoteDataObject$(new PaginatedList<Item>());
  }

  getItemRelationshipsByLabel(_item: Item, _label: string, _options?: FindListOptions, _useCachedVersionIfAvailable = true, _reRequestOnStale = true, ..._linksToFollow: FollowLinkConfig<Relationship>[]): Observable<RemoteData<PaginatedList<Relationship>>> {
    return createSuccessfulRemoteDataObject$(new PaginatedList<Relationship>());
  }

  getRelationshipByItemsAndLabel(_item1: Item, _item2: Item, _label: string, _options?: FindListOptions): Observable<Relationship> {
    return of(new Relationship());
  }

  setNameVariant(_listID: string, _itemID: string, _nameVariant: string): void {
  }

  getNameVariant(_listID: string, _itemID: string): Observable<string> {
    return of('');
  }

  updateNameVariant(_item1: Item, _item2: Item, _relationshipLabel: string, _nameVariant: string): Observable<RemoteData<Relationship>> {
    return createSuccessfulRemoteDataObject$(new Relationship());
  }

  isLeftItem(_relationship: Relationship, _item: Item): Observable<boolean> {
    return of(false);
  }

  update(_object: Relationship): Observable<RemoteData<Relationship>> {
    return createSuccessfulRemoteDataObject$(new Relationship());
  }

  searchByItemsAndType(_typeId: string, _itemUuid: string, _relationshipLabel: string, _arrayOfItemIds: string[]): Observable<RemoteData<PaginatedList<Relationship>>> {
    return createSuccessfulRemoteDataObject$(new PaginatedList<Relationship>());
  }

  searchBy(_searchMethod: string, _options?: FindListOptions, _useCachedVersionIfAvailable?: boolean, _reRequestOnStale?: boolean, ..._linksToFollow: FollowLinkConfig<Relationship>[]): Observable<RemoteData<PaginatedList<Relationship>>> {
    return createSuccessfulRemoteDataObject$(new PaginatedList<Relationship>());
  }

  resolveMetadataRepresentation(_metadatum: MetadataValue, _parentItem: DSpaceObject, _itemType: string): Observable<MetadataRepresentation> {
    return of({} as MetadataRepresentation);
  }

}