import { createApi } from "@reduxjs/toolkit/query/react";
import { baseQueryWithAuth } from "@/core/auth-interceptor";
import type { AdminProfile } from "@/core/authSlice";

export interface LoginRequest {
  email: string;
  password: string;
}

export interface LoginResponse {
  token: string;
  admin: AdminProfile;
}

export interface ForgotPasswordRequest {
  email: string;
}

export interface ResetPasswordRequest {
  token: string;
  password: string;
}

export interface VerifyEmailRequest {
  token: string;
}

export interface AcceptInviteRequest {
  token: string;
  password: string;
}

export interface AcceptInviteResponse {
  token: string;
  admin: AdminProfile;
}

export const authService = createApi({
  reducerPath: "authService",
  baseQuery: baseQueryWithAuth,
  tagTypes: ["AdminProfile"],
  endpoints: (build) => ({
    login: build.mutation<LoginResponse, LoginRequest>({
      query: (body) => ({ url: "/auth/login", method: "POST", body }),
    }),
    logout: build.mutation<{ message: string }, void>({
      query: () => ({ url: "/auth/logout", method: "POST" }),
    }),
    me: build.query<AdminProfile, void>({
      query: () => ({ url: "/auth/me", method: "GET" }),
      providesTags: ["AdminProfile"],
    }),
    forgotPassword: build.mutation<{ message: string }, ForgotPasswordRequest>({
      query: (body) => ({ url: "/auth/forgot-password", method: "POST", body }),
    }),
    resetPassword: build.mutation<{ message: string }, ResetPasswordRequest>({
      query: (body) => ({ url: "/auth/reset-password", method: "POST", body }),
    }),
    verifyEmail: build.mutation<{ message: string }, VerifyEmailRequest>({
      query: (body) => ({ url: "/auth/verify-email", method: "POST", body }),
    }),
    resendVerification: build.mutation<{ message: string }, void>({
      query: () => ({ url: "/auth/resend-verification", method: "POST" }),
    }),
    acceptInvite: build.mutation<AcceptInviteResponse, AcceptInviteRequest>({
      query: (body) => ({ url: "/auth/accept-invite", method: "POST", body }),
    }),
  }),
});

export const {
  useLoginMutation,
  useLogoutMutation,
  useMeQuery,
  useLazyMeQuery,
  useForgotPasswordMutation,
  useResetPasswordMutation,
  useVerifyEmailMutation,
  useResendVerificationMutation,
  useAcceptInviteMutation,
} = authService;
