import { dispatch } from 'app/store/store';
import { type RuleGroupIdentifier } from 'app/types/unified-alerting';

import { alertRuleApi } from '../../api/alertRuleApi';
import { featureDiscoveryApi } from '../../api/featureDiscoveryApi';
import { fetchPromAndRulerRulesAction } from '../../state/actions';
import { useAsync } from '../useAsync';

import { RulerNotSupportedError } from './useProduceNewRuleGroup';

const { useDeleteRuleGroupFromNamespaceMutation } = alertRuleApi;
const { useLazyDiscoverDsFeaturesQuery } = featureDiscoveryApi;

export function useDeleteRuleGroup() {
  const [deleteRuleGroup] = useDeleteRuleGroupFromNamespaceMutation();
  const [discoverDataSourceFeature] = useLazyDiscoverDsFeaturesQuery();

  return useAsync(async (ruleGroupIdentifier: RuleGroupIdentifier) => {
    const { dataSourceName, namespaceName, groupName } = ruleGroupIdentifier;

    const { rulerConfig } = await discoverDataSourceFeature({ rulesSourceName: dataSourceName }).unwrap();
    if (!rulerConfig) {
      throw RulerNotSupportedError(dataSourceName);
    }

    const result = await deleteRuleGroup({ rulerConfig, namespace: namespaceName, group: groupName }).unwrap();

    // @TODO remove this once we can use tags to invalidate
    await dispatch(fetchPromAndRulerRulesAction({ rulesSourceName: dataSourceName }));

    return result;
  });
}
