/*
 * SonarQube
 * Copyright (C) 2009-2024 SonarSource SA
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { addGlobalSuccessMessage } from 'design-system';
import {
  createGitHubConfiguration,
  deleteGitHubConfiguration,
  fetchGitHubConfiguration,
  getProjectBindings,
  searchGitHubConfigurations,
  updateGitHubConfiguration,
} from '../api/dop-translation';
import { translate } from '../helpers/l10n';

/*
 * Project bindings
 */
export function useProjectBindingsQuery(
  data: {
    dopSettingId?: string;
    pageIndex?: number;
    pageSize?: number;
    repository?: string;
  },
  enabled = true,
) {
  return useQuery({
    enabled,
    queryKey: ['dop-translation', 'project-bindings', data],
    queryFn: () => getProjectBindings(data),
  });
}

/*
 * GitHub configurations
 */
export function useSearchGitHubConfigurationsQuery() {
  return useQuery({
    queryKey: ['dop-translation', 'github-configs', 'search'],
    queryFn: searchGitHubConfigurations,
  });
}

export function useFetchGitHubConfigurationQuery(id: string) {
  return useQuery({
    queryKey: ['dop-translation', 'github-configs', 'fetch'],
    queryFn: () => fetchGitHubConfiguration(id),
  });
}

export function useCreateGitHubConfigurationMutation() {
  const client = useQueryClient();
  return useMutation({
    mutationFn: (gitHubConfiguration: Parameters<typeof createGitHubConfiguration>[0]) =>
      createGitHubConfiguration(gitHubConfiguration),
    onSuccess(gitHubConfiguration) {
      client.setQueryData(['dop-translation', 'github-configs', 'search'], {
        githubConfigurations: [gitHubConfiguration],
        page: {
          pageIndex: 1,
          pageSize: 1,
          total: 1,
        },
      });
      client.setQueryData(['dop-translation', 'github-configs', 'fetch'], gitHubConfiguration);
    },
  });
}

export function useUpdateGitHubConfigurationMutation() {
  const client = useQueryClient();
  return useMutation({
    mutationFn: ({
      gitHubConfiguration,
      id,
    }: {
      gitHubConfiguration: Parameters<typeof updateGitHubConfiguration>[1];
      id: Parameters<typeof updateGitHubConfiguration>[0];
    }) => updateGitHubConfiguration(id, gitHubConfiguration),
    onSuccess(gitHubConfiguration) {
      client.setQueryData(['dop-translation', 'github-configs', 'search'], {
        githubConfigurations: [gitHubConfiguration],
        page: {
          pageIndex: 1,
          pageSize: 1,
          total: 1,
        },
      });
      client.setQueryData(['dop-translation', 'github-configs', 'fetch'], gitHubConfiguration);
      client.invalidateQueries({ queryKey: ['identity_provider'] });
      addGlobalSuccessMessage(translate('settings.authentication.form.settings.save_success'));
    },
  });
}

export function useDeleteGitHubConfigurationMutation() {
  const client = useQueryClient();
  return useMutation({
    mutationFn: (id: Parameters<typeof deleteGitHubConfiguration>[0]) =>
      deleteGitHubConfiguration(id),
    onSuccess() {
      client.setQueryData(['dop-translation', 'github-configs', 'search'], {
        githubConfigurations: [],
        page: {
          pageIndex: 1,
          pageSize: 1,
          total: 1,
        },
      });
      client.setQueryData(['dop-translation', 'github-configs', 'fetch'], undefined);
    },
  });
}