import { Resource } from '@ngxp/rest';
import { Observable } from 'rxjs';
import {
  ApiSingleResourceStateService,
  SingleResourceStateService,
  StateService,
} from '../ngrx/state.service';
import { ResourceServiceConfig } from './resource.model';
import { ResourceRepository } from './resource.repository';
import { ResourceService } from './resource.service';
import { StateResource } from './resource.util';

export class ApiResourceService<B extends Resource, T extends Resource> extends ResourceService<
  B,
  T
> {
  protected apiResourceStateService: ApiSingleResourceStateService<B, T>;

  constructor(
    protected config: ResourceServiceConfig<B>,
    protected stateService: StateService,
    protected repository: ResourceRepository,
  ) {
    super(config, stateService);
  }

  protected initStateService(): void {
    this.apiResourceStateService = this.stateService.createApiSingleResourceService<B, T>(
      this.config,
    );
  }

  protected getResourceStateService(): SingleResourceStateService<B, T> {
    return this.apiResourceStateService;
  }

  public save(toSave: unknown): Observable<StateResource<T>> {
    return this.apiResourceStateService.save(toSave);
  }
}