/**
 * Generated by orval v7.21.0 🍺
 * Do not edit manually.
 * MBHS
 * Multidimensional Behavioral Health Screen
 * OpenAPI spec version: 1.0.0
 */
import { useMutation, useQuery } from "@tanstack/react-query";
import type {
  DataTag,
  DefinedInitialDataOptions,
  DefinedUseQueryResult,
  MutationFunction,
  QueryClient,
  QueryFunction,
  QueryKey,
  UndefinedInitialDataOptions,
  UseMutationOptions,
  UseMutationResult,
  UseQueryOptions,
  UseQueryResult,
} from "@tanstack/react-query";

import type {
  ForceChangePasswordDto,
  Message,
  UpdateLocaleDTO,
  UpdatePasswordDTO,
  UpdateProfileDTO,
  UploadProfilePhotoBody,
  UserProfileResponseModel,
} from "../generated.schemas";

import { customInstance } from "../../../config/axios";

type SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];

/**
 * @summary Perform profile operation.
 */
export const profile = (
  options?: SecondParameter<typeof customInstance>,
  signal?: AbortSignal,
) => {
  return customInstance<UserProfileResponseModel>(
    { url: `/v1/profile`, method: "GET", signal },
    options,
  );
};

export const getProfileQueryKey = () => {
  return [`/v1/profile`] as const;
};

export const getProfileQueryOptions = <
  TData = Awaited<ReturnType<typeof profile>>,
  TError = Message,
>(options?: {
  query?: Partial<
    UseQueryOptions<Awaited<ReturnType<typeof profile>>, TError, TData>
  >;
  request?: SecondParameter<typeof customInstance>;
}) => {
  const { query: queryOptions, request: requestOptions } = options ?? {};

  const queryKey = queryOptions?.queryKey ?? getProfileQueryKey();

  const queryFn: QueryFunction<Awaited<ReturnType<typeof profile>>> = ({
    signal,
  }) => profile(requestOptions, signal);

  return { queryKey, queryFn, ...queryOptions } as UseQueryOptions<
    Awaited<ReturnType<typeof profile>>,
    TError,
    TData
  > & { queryKey: DataTag<QueryKey, TData, TError> };
};

export type ProfileQueryResult = NonNullable<
  Awaited<ReturnType<typeof profile>>
>;
export type ProfileQueryError = Message;

export function useProfile<
  TData = Awaited<ReturnType<typeof profile>>,
  TError = Message,
>(
  options: {
    query: Partial<
      UseQueryOptions<Awaited<ReturnType<typeof profile>>, TError, TData>
    > &
      Pick<
        DefinedInitialDataOptions<
          Awaited<ReturnType<typeof profile>>,
          TError,
          Awaited<ReturnType<typeof profile>>
        >,
        "initialData"
      >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): DefinedUseQueryResult<TData, TError> & {
  queryKey: DataTag<QueryKey, TData, TError>;
};
export function useProfile<
  TData = Awaited<ReturnType<typeof profile>>,
  TError = Message,
>(
  options?: {
    query?: Partial<
      UseQueryOptions<Awaited<ReturnType<typeof profile>>, TError, TData>
    > &
      Pick<
        UndefinedInitialDataOptions<
          Awaited<ReturnType<typeof profile>>,
          TError,
          Awaited<ReturnType<typeof profile>>
        >,
        "initialData"
      >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
  queryKey: DataTag<QueryKey, TData, TError>;
};
export function useProfile<
  TData = Awaited<ReturnType<typeof profile>>,
  TError = Message,
>(
  options?: {
    query?: Partial<
      UseQueryOptions<Awaited<ReturnType<typeof profile>>, TError, TData>
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
  queryKey: DataTag<QueryKey, TData, TError>;
};
/**
 * @summary Perform profile operation.
 */

export function useProfile<
  TData = Awaited<ReturnType<typeof profile>>,
  TError = Message,
>(
  options?: {
    query?: Partial<
      UseQueryOptions<Awaited<ReturnType<typeof profile>>, TError, TData>
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
  queryKey: DataTag<QueryKey, TData, TError>;
} {
  const queryOptions = getProfileQueryOptions(options);

  const query = useQuery(queryOptions, queryClient) as UseQueryResult<
    TData,
    TError
  > & { queryKey: DataTag<QueryKey, TData, TError> };

  query.queryKey = queryOptions.queryKey;

  return query;
}

/**
 * @summary Perform updateProfile operation.
 */
export const updateProfile = (
  updateProfileDTO: UpdateProfileDTO,
  options?: SecondParameter<typeof customInstance>,
) => {
  return customInstance<UserProfileResponseModel>(
    {
      url: `/v1/profile`,
      method: "PATCH",
      headers: { "Content-Type": "application/json" },
      data: updateProfileDTO,
    },
    options,
  );
};

export const getUpdateProfileMutationOptions = <
  TError = Message,
  TContext = unknown,
>(options?: {
  mutation?: UseMutationOptions<
    Awaited<ReturnType<typeof updateProfile>>,
    TError,
    { data: UpdateProfileDTO },
    TContext
  >;
  request?: SecondParameter<typeof customInstance>;
}): UseMutationOptions<
  Awaited<ReturnType<typeof updateProfile>>,
  TError,
  { data: UpdateProfileDTO },
  TContext
> => {
  const mutationKey = ["updateProfile"];
  const { mutation: mutationOptions, request: requestOptions } = options
    ? options.mutation &&
      "mutationKey" in options.mutation &&
      options.mutation.mutationKey
      ? options
      : { ...options, mutation: { ...options.mutation, mutationKey } }
    : { mutation: { mutationKey }, request: undefined };

  const mutationFn: MutationFunction<
    Awaited<ReturnType<typeof updateProfile>>,
    { data: UpdateProfileDTO }
  > = (props) => {
    const { data } = props ?? {};

    return updateProfile(data, requestOptions);
  };

  return { mutationFn, ...mutationOptions };
};

export type UpdateProfileMutationResult = NonNullable<
  Awaited<ReturnType<typeof updateProfile>>
>;
export type UpdateProfileMutationBody = UpdateProfileDTO;
export type UpdateProfileMutationError = Message;

/**
 * @summary Perform updateProfile operation.
 */
export const useUpdateProfile = <TError = Message, TContext = unknown>(
  options?: {
    mutation?: UseMutationOptions<
      Awaited<ReturnType<typeof updateProfile>>,
      TError,
      { data: UpdateProfileDTO },
      TContext
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseMutationResult<
  Awaited<ReturnType<typeof updateProfile>>,
  TError,
  { data: UpdateProfileDTO },
  TContext
> => {
  const mutationOptions = getUpdateProfileMutationOptions(options);

  return useMutation(mutationOptions, queryClient);
};
/**
 * @summary Perform uploadProfilePhoto operation.
 */
export const uploadProfilePhoto = (
  uploadProfilePhotoBody: UploadProfilePhotoBody,
  options?: SecondParameter<typeof customInstance>,
  signal?: AbortSignal,
) => {
  const formData = new FormData();
  if (uploadProfilePhotoBody.file !== undefined) {
    formData.append(`file`, uploadProfilePhotoBody.file);
  }

  return customInstance<UserProfileResponseModel>(
    {
      url: `/v1/profile-photo`,
      method: "POST",
      headers: { "Content-Type": "multipart/form-data" },
      data: formData,
      signal,
    },
    options,
  );
};

export const getUploadProfilePhotoMutationOptions = <
  TError = Message,
  TContext = unknown,
>(options?: {
  mutation?: UseMutationOptions<
    Awaited<ReturnType<typeof uploadProfilePhoto>>,
    TError,
    { data: UploadProfilePhotoBody },
    TContext
  >;
  request?: SecondParameter<typeof customInstance>;
}): UseMutationOptions<
  Awaited<ReturnType<typeof uploadProfilePhoto>>,
  TError,
  { data: UploadProfilePhotoBody },
  TContext
> => {
  const mutationKey = ["uploadProfilePhoto"];
  const { mutation: mutationOptions, request: requestOptions } = options
    ? options.mutation &&
      "mutationKey" in options.mutation &&
      options.mutation.mutationKey
      ? options
      : { ...options, mutation: { ...options.mutation, mutationKey } }
    : { mutation: { mutationKey }, request: undefined };

  const mutationFn: MutationFunction<
    Awaited<ReturnType<typeof uploadProfilePhoto>>,
    { data: UploadProfilePhotoBody }
  > = (props) => {
    const { data } = props ?? {};

    return uploadProfilePhoto(data, requestOptions);
  };

  return { mutationFn, ...mutationOptions };
};

export type UploadProfilePhotoMutationResult = NonNullable<
  Awaited<ReturnType<typeof uploadProfilePhoto>>
>;
export type UploadProfilePhotoMutationBody = UploadProfilePhotoBody;
export type UploadProfilePhotoMutationError = Message;

/**
 * @summary Perform uploadProfilePhoto operation.
 */
export const useUploadProfilePhoto = <TError = Message, TContext = unknown>(
  options?: {
    mutation?: UseMutationOptions<
      Awaited<ReturnType<typeof uploadProfilePhoto>>,
      TError,
      { data: UploadProfilePhotoBody },
      TContext
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseMutationResult<
  Awaited<ReturnType<typeof uploadProfilePhoto>>,
  TError,
  { data: UploadProfilePhotoBody },
  TContext
> => {
  const mutationOptions = getUploadProfilePhotoMutationOptions(options);

  return useMutation(mutationOptions, queryClient);
};
/**
 * @summary Perform deleteProfilePhoto operation.
 */
export const deleteProfilePhoto = (
  options?: SecondParameter<typeof customInstance>,
) => {
  return customInstance<UserProfileResponseModel>(
    { url: `/v1/profile-photo`, method: "DELETE" },
    options,
  );
};

export const getDeleteProfilePhotoMutationOptions = <
  TError = Message,
  TContext = unknown,
>(options?: {
  mutation?: UseMutationOptions<
    Awaited<ReturnType<typeof deleteProfilePhoto>>,
    TError,
    void,
    TContext
  >;
  request?: SecondParameter<typeof customInstance>;
}): UseMutationOptions<
  Awaited<ReturnType<typeof deleteProfilePhoto>>,
  TError,
  void,
  TContext
> => {
  const mutationKey = ["deleteProfilePhoto"];
  const { mutation: mutationOptions, request: requestOptions } = options
    ? options.mutation &&
      "mutationKey" in options.mutation &&
      options.mutation.mutationKey
      ? options
      : { ...options, mutation: { ...options.mutation, mutationKey } }
    : { mutation: { mutationKey }, request: undefined };

  const mutationFn: MutationFunction<
    Awaited<ReturnType<typeof deleteProfilePhoto>>,
    void
  > = () => {
    return deleteProfilePhoto(requestOptions);
  };

  return { mutationFn, ...mutationOptions };
};

export type DeleteProfilePhotoMutationResult = NonNullable<
  Awaited<ReturnType<typeof deleteProfilePhoto>>
>;

export type DeleteProfilePhotoMutationError = Message;

/**
 * @summary Perform deleteProfilePhoto operation.
 */
export const useDeleteProfilePhoto = <TError = Message, TContext = unknown>(
  options?: {
    mutation?: UseMutationOptions<
      Awaited<ReturnType<typeof deleteProfilePhoto>>,
      TError,
      void,
      TContext
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseMutationResult<
  Awaited<ReturnType<typeof deleteProfilePhoto>>,
  TError,
  void,
  TContext
> => {
  const mutationOptions = getDeleteProfilePhotoMutationOptions(options);

  return useMutation(mutationOptions, queryClient);
};
/**
 * @summary Perform updateLocale operation.
 */
export const updateLocale = (
  updateLocaleDTO: UpdateLocaleDTO,
  options?: SecondParameter<typeof customInstance>,
) => {
  return customInstance<Message>(
    {
      url: `/v1/update-locale`,
      method: "PATCH",
      headers: { "Content-Type": "application/json" },
      data: updateLocaleDTO,
    },
    options,
  );
};

export const getUpdateLocaleMutationOptions = <
  TError = Message,
  TContext = unknown,
>(options?: {
  mutation?: UseMutationOptions<
    Awaited<ReturnType<typeof updateLocale>>,
    TError,
    { data: UpdateLocaleDTO },
    TContext
  >;
  request?: SecondParameter<typeof customInstance>;
}): UseMutationOptions<
  Awaited<ReturnType<typeof updateLocale>>,
  TError,
  { data: UpdateLocaleDTO },
  TContext
> => {
  const mutationKey = ["updateLocale"];
  const { mutation: mutationOptions, request: requestOptions } = options
    ? options.mutation &&
      "mutationKey" in options.mutation &&
      options.mutation.mutationKey
      ? options
      : { ...options, mutation: { ...options.mutation, mutationKey } }
    : { mutation: { mutationKey }, request: undefined };

  const mutationFn: MutationFunction<
    Awaited<ReturnType<typeof updateLocale>>,
    { data: UpdateLocaleDTO }
  > = (props) => {
    const { data } = props ?? {};

    return updateLocale(data, requestOptions);
  };

  return { mutationFn, ...mutationOptions };
};

export type UpdateLocaleMutationResult = NonNullable<
  Awaited<ReturnType<typeof updateLocale>>
>;
export type UpdateLocaleMutationBody = UpdateLocaleDTO;
export type UpdateLocaleMutationError = Message;

/**
 * @summary Perform updateLocale operation.
 */
export const useUpdateLocale = <TError = Message, TContext = unknown>(
  options?: {
    mutation?: UseMutationOptions<
      Awaited<ReturnType<typeof updateLocale>>,
      TError,
      { data: UpdateLocaleDTO },
      TContext
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseMutationResult<
  Awaited<ReturnType<typeof updateLocale>>,
  TError,
  { data: UpdateLocaleDTO },
  TContext
> => {
  const mutationOptions = getUpdateLocaleMutationOptions(options);

  return useMutation(mutationOptions, queryClient);
};
/**
 * @summary Perform updatePassword operation.
 */
export const updatePassword = (
  updatePasswordDTO: UpdatePasswordDTO,
  options?: SecondParameter<typeof customInstance>,
) => {
  return customInstance<Message>(
    {
      url: `/v1/update-password`,
      method: "PATCH",
      headers: { "Content-Type": "application/json" },
      data: updatePasswordDTO,
    },
    options,
  );
};

export const getUpdatePasswordMutationOptions = <
  TError = Message,
  TContext = unknown,
>(options?: {
  mutation?: UseMutationOptions<
    Awaited<ReturnType<typeof updatePassword>>,
    TError,
    { data: UpdatePasswordDTO },
    TContext
  >;
  request?: SecondParameter<typeof customInstance>;
}): UseMutationOptions<
  Awaited<ReturnType<typeof updatePassword>>,
  TError,
  { data: UpdatePasswordDTO },
  TContext
> => {
  const mutationKey = ["updatePassword"];
  const { mutation: mutationOptions, request: requestOptions } = options
    ? options.mutation &&
      "mutationKey" in options.mutation &&
      options.mutation.mutationKey
      ? options
      : { ...options, mutation: { ...options.mutation, mutationKey } }
    : { mutation: { mutationKey }, request: undefined };

  const mutationFn: MutationFunction<
    Awaited<ReturnType<typeof updatePassword>>,
    { data: UpdatePasswordDTO }
  > = (props) => {
    const { data } = props ?? {};

    return updatePassword(data, requestOptions);
  };

  return { mutationFn, ...mutationOptions };
};

export type UpdatePasswordMutationResult = NonNullable<
  Awaited<ReturnType<typeof updatePassword>>
>;
export type UpdatePasswordMutationBody = UpdatePasswordDTO;
export type UpdatePasswordMutationError = Message;

/**
 * @summary Perform updatePassword operation.
 */
export const useUpdatePassword = <TError = Message, TContext = unknown>(
  options?: {
    mutation?: UseMutationOptions<
      Awaited<ReturnType<typeof updatePassword>>,
      TError,
      { data: UpdatePasswordDTO },
      TContext
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseMutationResult<
  Awaited<ReturnType<typeof updatePassword>>,
  TError,
  { data: UpdatePasswordDTO },
  TContext
> => {
  const mutationOptions = getUpdatePasswordMutationOptions(options);

  return useMutation(mutationOptions, queryClient);
};
/**
 * @summary Perform forceChangePassword operation.
 */
export const forceChangePassword = (
  forceChangePasswordDto: ForceChangePasswordDto,
  options?: SecondParameter<typeof customInstance>,
) => {
  return customInstance<Message>(
    {
      url: `/v1/force-change-password`,
      method: "PATCH",
      headers: { "Content-Type": "application/json" },
      data: forceChangePasswordDto,
    },
    options,
  );
};

export const getForceChangePasswordMutationOptions = <
  TError = Message,
  TContext = unknown,
>(options?: {
  mutation?: UseMutationOptions<
    Awaited<ReturnType<typeof forceChangePassword>>,
    TError,
    { data: ForceChangePasswordDto },
    TContext
  >;
  request?: SecondParameter<typeof customInstance>;
}): UseMutationOptions<
  Awaited<ReturnType<typeof forceChangePassword>>,
  TError,
  { data: ForceChangePasswordDto },
  TContext
> => {
  const mutationKey = ["forceChangePassword"];
  const { mutation: mutationOptions, request: requestOptions } = options
    ? options.mutation &&
      "mutationKey" in options.mutation &&
      options.mutation.mutationKey
      ? options
      : { ...options, mutation: { ...options.mutation, mutationKey } }
    : { mutation: { mutationKey }, request: undefined };

  const mutationFn: MutationFunction<
    Awaited<ReturnType<typeof forceChangePassword>>,
    { data: ForceChangePasswordDto }
  > = (props) => {
    const { data } = props ?? {};

    return forceChangePassword(data, requestOptions);
  };

  return { mutationFn, ...mutationOptions };
};

export type ForceChangePasswordMutationResult = NonNullable<
  Awaited<ReturnType<typeof forceChangePassword>>
>;
export type ForceChangePasswordMutationBody = ForceChangePasswordDto;
export type ForceChangePasswordMutationError = Message;

/**
 * @summary Perform forceChangePassword operation.
 */
export const useForceChangePassword = <TError = Message, TContext = unknown>(
  options?: {
    mutation?: UseMutationOptions<
      Awaited<ReturnType<typeof forceChangePassword>>,
      TError,
      { data: ForceChangePasswordDto },
      TContext
    >;
    request?: SecondParameter<typeof customInstance>;
  },
  queryClient?: QueryClient,
): UseMutationResult<
  Awaited<ReturnType<typeof forceChangePassword>>,
  TError,
  { data: ForceChangePasswordDto },
  TContext
> => {
  const mutationOptions = getForceChangePasswordMutationOptions(options);

  return useMutation(mutationOptions, queryClient);
};
