import { cloneDeep } from 'lodash';
import { AnnotationEvent, deprecationWarning } from '@grafana/data';

import { deleteAnnotation, saveAnnotation, updateAnnotation } from 'app/features/annotations/api';
import { AnnotationQueryOptions } from 'app/features/annotations/types';

/**
 * @deprecated AnnotationsSrv is deprecated in favor of DashboardQueryRunner
 */
export class AnnotationsSrv {
  /**
   * @deprecated clearPromiseCaches is deprecated
   */
  clearPromiseCaches() {
    deprecationWarning('annotations_srv.ts', 'clearPromiseCaches', 'DashboardQueryRunner');
  }

  /**
   * @deprecated getAnnotations is deprecated in favor of DashboardQueryRunner.getResult
   */
  getAnnotations(options: AnnotationQueryOptions) {
    deprecationWarning('annotations_srv.ts', 'getAnnotations', 'DashboardQueryRunner.getResult');
    return Promise.resolve({ annotations: [], alertState: undefined });
  }

  /**
   * @deprecated getAlertStates is deprecated in favor of DashboardQueryRunner.getResult
   */
  getAlertStates(options: any) {
    deprecationWarning('annotations_srv.ts', 'getAlertStates', 'DashboardQueryRunner.getResult');
    return Promise.resolve(undefined);
  }

  /**
   * @deprecated getGlobalAnnotations is deprecated in favor of DashboardQueryRunner.getResult
   */
  getGlobalAnnotations(options: AnnotationQueryOptions) {
    deprecationWarning('annotations_srv.ts', 'getGlobalAnnotations', 'DashboardQueryRunner.getResult');
    return Promise.resolve([]);
  }

  /**
   * @deprecated saveAnnotationEvent is deprecated
   */
  saveAnnotationEvent(annotation: AnnotationEvent) {
    deprecationWarning('annotations_srv.ts', 'saveAnnotationEvent', 'api/saveAnnotation');
    return saveAnnotation(annotation);
  }

  /**
   * @deprecated updateAnnotationEvent is deprecated
   */
  updateAnnotationEvent(annotation: AnnotationEvent) {
    deprecationWarning('annotations_srv.ts', 'updateAnnotationEvent', 'api/updateAnnotation');
    return updateAnnotation(annotation);
  }

  /**
   * @deprecated deleteAnnotationEvent is deprecated
   */
  deleteAnnotationEvent(annotation: AnnotationEvent) {
    deprecationWarning('annotations_srv.ts', 'deleteAnnotationEvent', 'api/deleteAnnotation');
    return deleteAnnotation(annotation);
  }

  /**
   * @deprecated translateQueryResult is deprecated in favor of DashboardQueryRunner/utils/translateQueryResult
   */
  translateQueryResult(annotation: any, results: any) {
    deprecationWarning('annotations_srv.ts', 'translateQueryResult', 'DashboardQueryRunner/utils/translateQueryResult');
    // if annotation has snapshotData
    // make clone and remove it
    if (annotation.snapshotData) {
      annotation = cloneDeep(annotation);
      delete annotation.snapshotData;
    }

    for (const item of results) {
      item.source = annotation;
      item.color = annotation.iconColor;
      item.type = annotation.name;
      item.isRegion = item.timeEnd && item.time !== item.timeEnd;
    }

    return results;
  }
}
