import axios from 'axios';
import { getUserInfo } from '../utils/auth';

const api = axios.create({
  baseURL: 'http://10.126.59.25:5715/api/',
  // baseURL: 'http://127.0.0.1:5715/api/',
  withCredentials: true
});

// 用户相关API
export const getCurrentUser = () => api.get('/current-user');
export const getUser = (userId) => api.get(`/user/${userId}`);
export const updateUser = (userId, data) => api.put(`/user/${userId}`, data);

// 收藏相关API
export const getFavorites = (userId) => api.get(`/user/${userId}/favorites`);

// 关注相关API
export const followUser = (followerId,followeeId) => {
  return api.post(`/follow/${followerId}/${followeeId}`);
};
export const unfollowUser = (followerId,followeeId) => {
  return api.delete(`/follow/${followerId}/${followeeId}`);
};

// 帖子相关API
export const getUserPosts = (userId) => api.get(`/user/${userId}/posts`);

// 关注列表API
export const getUserFollowing = (userId) => api.get(`/user/${userId}/following`);

// 用户互动数据API
export const getUserInteractions = (userId) => api.get(`/user/${userId}/interactions`);
// 获取粉丝
export const getUserFollowers = (userId) => api.get(`/user/${userId}/followers`);
// ================= 帖子互动API =================

/**
 * 点赞帖子
 * @param {number} userId 用户ID
 * @param {number} postId 帖子ID
 * @returns 操作结果
 */
export const likePost = (userId, postId) => {
  return api.post(`/users/${userId}/posts/${postId}/like`);
};

/**
 * 取消点赞
 * @param {number} userId 用户ID
 * @param {number} postId 帖子ID
 * @returns 操作结果
 */
export const unlikePost = (userId, postId) => {
  return api.delete(`/users/${userId}/posts/${postId}/like`);
};

/**
 * 收藏帖子
 * @param {number} userId 用户ID
 * @param {number} postId 帖子ID
 * @returns 操作结果
 */
export const favoritePost = (userId, postId) => {
  return api.post(`/users/${userId}/posts/${postId}/favorite`);
};

/**
 * 取消收藏
 * @param {number} userId 用户ID
 * @param {number} postId 帖子ID
 * @returns 操作结果
 */
export const unfavoritePost = (userId, postId) => {
  return api.delete(`/users/${userId}/posts/${postId}/favorite`);
};

/**
 * 获取当前用户对帖子的互动状态
 * @param {number} userId 用户ID
 * @param {number} postId 帖子ID
 * @returns {object} { liked: boolean, favorited: boolean }
 */
export const getPostInteractionStatus = (userId, postId) => {
  return api.get(`/users/${userId}/posts/${postId}/interaction-status`);
};

export default api;