// src/hooks/mutations/useAuthMutations.ts
import { useMutation } from '@tanstack/react-query';
import * as apiClient from '../../services/apiClient';
import { notifyError } from '../../services/notificationService';
import type { UserProfile } from '../../types';

interface AuthResponse {
  userprofile: UserProfile;
  token: string;
}

/**
 * Mutation hook for user login.
 *
 * @example
 * ```tsx
 * const loginMutation = useLoginMutation();
 * loginMutation.mutate({ email, password, rememberMe });
 * ```
 */
export const useLoginMutation = () => {
  return useMutation({
    mutationFn: async ({
      email,
      password,
      rememberMe,
    }: {
      email: string;
      password: string;
      rememberMe: boolean;
    }): Promise<AuthResponse> => {
      const response = await apiClient.loginUser(email, password, rememberMe);

      if (!response.ok) {
        const error = await response.json().catch(() => ({
          message: `Request failed with status ${response.status}`,
        }));
        throw new Error(error.message || 'Failed to login');
      }

      return response.json();
    },
    onError: (error: Error) => {
      notifyError(error.message || 'Failed to login');
    },
  });
};

/**
 * Mutation hook for user registration.
 *
 * @example
 * ```tsx
 * const registerMutation = useRegisterMutation();
 * registerMutation.mutate({ email, password, fullName });
 * ```
 */
export const useRegisterMutation = () => {
  return useMutation({
    mutationFn: async ({
      email,
      password,
      fullName,
    }: {
      email: string;
      password: string;
      fullName: string;
    }): Promise<AuthResponse> => {
      const response = await apiClient.registerUser(email, password, fullName, '');

      if (!response.ok) {
        const error = await response.json().catch(() => ({
          message: `Request failed with status ${response.status}`,
        }));
        throw new Error(error.message || 'Failed to register');
      }

      return response.json();
    },
    onError: (error: Error) => {
      notifyError(error.message || 'Failed to register');
    },
  });
};

/**
 * Mutation hook for requesting a password reset.
 *
 * @example
 * ```tsx
 * const passwordResetMutation = usePasswordResetRequestMutation();
 * passwordResetMutation.mutate({ email });
 * ```
 */
export const usePasswordResetRequestMutation = () => {
  return useMutation({
    mutationFn: async ({ email }: { email: string }): Promise<{ message: string }> => {
      const response = await apiClient.requestPasswordReset(email);

      if (!response.ok) {
        const error = await response.json().catch(() => ({
          message: `Request failed with status ${response.status}`,
        }));
        throw new Error(error.message || 'Failed to request password reset');
      }

      return response.json();
    },
    onError: (error: Error) => {
      notifyError(error.message || 'Failed to request password reset');
    },
  });
};
