import { map } from 'rxjs/operators';
import { Injectable } from '@angular/core';

import * as _ from 'lodash';

import { IdealState } from '../../shared/node-viewer/node-viewer.component';
import { HelixService } from '../../core/helix.service';
import { Resource } from './resource.model';

@Injectable()
export class ResourceService extends HelixService {
  public getAll(clusterName: string) {
    return this.request(`/clusters/${clusterName}/resources`).pipe(
      map((data) => {
        const res: Resource[] = [];
        for (const name of data.idealStates) {
          res.push(<Resource>{
            cluster: clusterName,
            name,
            alive: data.externalViews.indexOf(name) >= 0,
          });
        }
        return _.sortBy(res, 'name');
      })
    );
  }

  public getAllOnInstance(clusterName: string, instanceName: string) {
    return this.request(
      `/clusters/${clusterName}/instances/${instanceName}/resources`
    ).pipe(
      map((data) => {
        const res: any[] = [];
        if (data) {
          for (const resource of data.resources) {
            res.push({
              name: resource,
            });
          }
        }
        return res;
      })
    );
  }

  public get(clusterName: string, resourceName: string) {
    return this.request(
      `/clusters/${clusterName}/resources/${resourceName}`
    ).pipe(
      map(
        (data) =>
          new Resource(
            clusterName,
            resourceName,
            data.resourceConfig,
            data.idealState,
            data.externalView
          )
      )
    );
  }

  public getOnInstance(
    clusterName: string,
    instanceName: string,
    resourceName: string
  ) {
    return this.request(
      `/clusters/${clusterName}/instances/${instanceName}/resources/${resourceName}`
    ).pipe(
      map((data) => {
        const ret = {
          bucketSize: data.simpleFields.BUCKET_SIZE,
          sessionId: data.simpleFields.SESSION_ID,
          stateModelDef: data.simpleFields.STATE_MODEL_DEF,
          stateModelFactoryName: data.simpleFields.STATE_MODEL_FACTORY_NAME,
          partitions: [],
        };

        for (const partition in data.mapFields) {
          const par = data.mapFields[partition];

          ret.partitions.push({
            name: partition,
            currentState: par.CURRENT_STATE,
            info: par.INFO,
          });
        }

        return ret;
      })
    );
  }

  public enable(clusterName: string, resourceName: string) {
    return this.post(
      `/clusters/${clusterName}/resources/${resourceName}?command=enable`,
      null
    );
  }

  public disable(clusterName: string, resourceName: string) {
    return this.post(
      `/clusters/${clusterName}/resources/${resourceName}?command=disable`,
      null
    );
  }

  public remove(clusterName: string, resourceName: string) {
    return this.delete(`/clusters/${clusterName}/resources/${resourceName}`);
  }

  public setIdealState(
    clusterName: string,
    resourceName: string,
    idealState: IdealState
  ) {
    return this.post(
      `/clusters/${clusterName}/resources/${resourceName}/idealState?command=update`,
      idealState
    );
  }
}
