import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';

export class AzureMonitorAnnotationsQueryCtrl {
  static templateUrl = 'partials/annotations.editor.html';
  declare datasource: any;
  declare annotation: any;
  declare workspaces: any[];
  declare subscriptions: Array<{ text: string; value: string }>;
  private templateSrv: TemplateSrv = getTemplateSrv();

  defaultQuery =
    '<your table>\n| where $__timeFilter() \n| project TimeGenerated, Text=YourTitleColumn, Tags="tag1,tag2"';

  /** @ngInject */
  constructor($scope: any) {
    this.annotation = $scope.ctrl.annotation;
    this.datasource = $scope.ctrl.datasource;

    this.annotation.queryType = this.annotation.queryType || 'Azure Log Analytics';
    this.annotation.rawQuery = this.annotation.rawQuery || this.defaultQuery;
    this.initDropdowns();
  }

  async initDropdowns() {
    await this.getSubscriptions();
    await this.getWorkspaces();
  }

  async getSubscriptions() {
    if (!this.datasource.azureMonitorDatasource.isConfigured()) {
      return;
    }

    return this.datasource.azureMonitorDatasource.getSubscriptions().then((subs: any[]) => {
      this.subscriptions = subs;

      if (!this.annotation.subscription && this.annotation.queryType === 'Azure Log Analytics') {
        this.annotation.subscription = this.datasource.azureLogAnalyticsDatasource.subscriptionId;
      }

      if (!this.annotation.subscription && this.subscriptions.length > 0) {
        this.annotation.subscription = this.subscriptions[0].value;
      }
    });
  }

  async getWorkspaces(bustCache?: boolean) {
    if (!bustCache && this.workspaces && this.workspaces.length > 0) {
      return this.workspaces;
    }

    return this.datasource
      .getAzureLogAnalyticsWorkspaces(this.annotation.subscription)
      .then((list: any[]) => {
        this.workspaces = list;
        if (list.length > 0 && !this.annotation.workspace) {
          this.annotation.workspace = list[0].value;
        }
        return this.workspaces;
      })
      .catch(() => {});
  }

  getAzureLogAnalyticsSchema = () => {
    return this.getWorkspaces()
      .then(() => {
        return this.datasource.azureLogAnalyticsDatasource.getSchema(this.annotation.workspace);
      })
      .catch(() => {});
  };

  onSubscriptionChange = () => {
    this.getWorkspaces(true);
  };

  onLogAnalyticsQueryChange = (nextQuery: string) => {
    this.annotation.rawQuery = nextQuery;
  };

  get templateVariables() {
    return this.templateSrv.getVariables().map((t: any) => '$' + t.name);
  }
}
