import { axiosClient, TokenService } from "@/lib/axios";
import { LoginRequest, LoginResponse, UpdateProfilePayload, User } from "../types";

export const authService = {
  register: async (data: any): Promise<{ message: string; email: string }> => {
    const response = await axiosClient.post("/auth/register", data);
    return response.data.data;
  },

  verifyOtp: async (data: { email: string; otp: string; purpose?: string }): Promise<LoginResponse> => {
    const response = await axiosClient.post("/auth/verify-otp", {
      purpose: "EMAIL_VERIFICATION",
      ...data,
    });
    const resData = response.data.data;
    if (resData?.accessToken && resData?.refreshToken) {
      TokenService.setTokens(resData.accessToken, resData.refreshToken);
    }
    return resData;
  },

  login: async (data: LoginRequest): Promise<LoginResponse> => {
    const response = await axiosClient.post("/auth/login", data);
    const { accessToken, refreshToken, user } = response.data.data;
    TokenService.setTokens(accessToken, refreshToken);
    return { user, accessToken, refreshToken };
  },

  logout: async (): Promise<void> => {
    try {
      const refreshToken = TokenService.getRefreshToken();
      await axiosClient.post("/auth/logout", { refreshToken });
    } finally {
      TokenService.clearTokens();
    }
  },

  getCurrentUser: async (): Promise<User> => {
    const response = await axiosClient.get("/auth/me");
    return response.data.data;
  },

  updateProfile: async (payload: UpdateProfilePayload): Promise<User> => {
    const response = await axiosClient.patch("/auth/profile", payload);
    return response.data.data;
  },

  uploadAvatar: async (file: File): Promise<User> => {
    const formData = new FormData();
    formData.append("avatar", file);
    const response = await axiosClient.post("/auth/avatar", formData, {
      headers: { "Content-Type": "multipart/form-data" },
    });
    return response.data.data;
  },

  removeAvatar: async (): Promise<User> => {
    const response = await axiosClient.delete("/auth/avatar");
    return response.data.data;
  },

  forgotPassword: async (email: string): Promise<void> => {
    await axiosClient.post("/auth/forgot-password", { email });
  },

  resetPassword: async (data: { email: string; otp: string; newPassword: string }): Promise<void> => {
    await axiosClient.post("/auth/reset-password", data);
  },

  changePassword: async (currentPassword: string, newPassword: string): Promise<void> => {
    await axiosClient.post("/auth/change-password", { currentPassword, newPassword });
  },
};
