/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { ComponentRef } from '@angular/core';
import { Subject } from 'rxjs';

import { GraphConfig } from '@zeppelin/sdk';
import { Transformation } from './transformation';

// tslint:disable-next-line
export abstract class Visualization<T = any> {
  // tslint:disable-next-line
  transformed: any;
  componentRef: ComponentRef<T>;
  configChange$ = new Subject<GraphConfig>();
  constructor(private config: GraphConfig) {}

  abstract getTransformation(): Transformation;
  abstract render(tableData): void;
  abstract refresh(): void;
  abstract destroy(): void;

  configChanged() {
    return this.configChange$.asObservable();
  }

  setConfig(config: GraphConfig) {
    this.config = config;
    this.refresh();
  }

  getConfig() {
    return this.config;
  }
}
