import { StoredProcedureDefinition } from "@azure/cosmos";
import * as ko from "knockout";
import * as Constants from "../../Common/Constants";
import { deleteTrigger } from "../../Common/dataAccess/deleteTrigger";
import * as ViewModels from "../../Contracts/ViewModels";
import { useTabs } from "../../hooks/useTabs";
import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import { useDialog } from "../Controls/Dialog";
import Explorer from "../Explorer";
import TriggerTab from "../Tabs/TriggerTab";
import { useSelectedNode } from "../useSelectedNode";

export default class Trigger {
  public nodeKind: string;
  public container: Explorer;
  public collection: ViewModels.Collection;
  public self: string;
  public rid: string;
  public id: ko.Observable<string>;
  public body: ko.Observable<string>;
  public triggerType: ko.Observable<string>;
  public triggerOperation: ko.Observable<string>;

  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  constructor(container: Explorer, collection: ViewModels.Collection, data: any) {
    this.nodeKind = "Trigger";
    this.container = container;
    this.collection = collection;
    this.self = data._self;
    this.rid = data._rid;
    this.id = ko.observable(data.id);
    this.body = ko.observable(data.body);
    this.triggerOperation = ko.observable(data.triggerOperation);
    this.triggerType = ko.observable(data.triggerType);
  }

  public select(): void {
    useSelectedNode.getState().setSelectedNode(this);
    TelemetryProcessor.trace(Action.SelectItem, ActionModifiers.Mark, {
      description: "Trigger node",

      dataExplorerArea: Constants.Areas.ResourceTree,
    });
  }

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  public static create(source: ViewModels.Collection, _event: MouseEvent): void {
    const id = useTabs.getState().getTabs(ViewModels.CollectionTabKind.Triggers).length + 1;
    const trigger = <StoredProcedureDefinition>{
      id: "",
      body: "function trigger(){}",
      triggerOperation: "All",
      triggerType: "Pre",
    };

    const triggerTab: TriggerTab = new TriggerTab({
      resource: trigger,
      isNew: true,
      tabKind: ViewModels.CollectionTabKind.Triggers,
      title: `New Trigger ${id}`,
      tabPath: "",
      collection: source,
      node: source,
    });

    useTabs.getState().activateNewTab(triggerTab);
  }

  public open = () => {
    this.select();

    const triggerTabs: TriggerTab[] = useTabs
      .getState()
      .getTabs(ViewModels.CollectionTabKind.Triggers, (tab) => tab.node && tab.node.rid === this.rid) as TriggerTab[];
    let triggerTab: TriggerTab = triggerTabs && triggerTabs[0];

    if (triggerTab) {
      useTabs.getState().activateTab(triggerTab);
    } else {
      const triggerData = <StoredProcedureDefinition>{
        _rid: this.rid,
        _self: this.self,
        id: this.id(),
        body: this.body(),
        triggerOperation: this.triggerOperation(),
        triggerType: this.triggerType(),
      };

      triggerTab = new TriggerTab({
        resource: triggerData,
        isNew: false,
        tabKind: ViewModels.CollectionTabKind.Triggers,
        title: triggerData.id,
        tabPath: "",
        collection: this.collection,
        node: this,
      });

      useTabs.getState().activateNewTab(triggerTab);
    }
  };

  public delete(): void {
    useDialog.getState().showOkCancelModalDialog(
      "Confirm delete",
      "Are you sure you want to delete the trigger?",
      "Delete",
      () => {
        deleteTrigger(this.collection.databaseId, this.collection.id(), this.id()).then(
          () => {
            useTabs.getState().closeTabsByComparator((tab) => tab.node && tab.node.rid === this.rid);
            this.collection.children.remove(this);
          },
          // eslint-disable-next-line @typescript-eslint/no-empty-function
          () => {}
        );
      },
      "Cancel",
      undefined
    );
  }
}