import apiClient from './api';

/**
 * 관리자 API 서비스
 */
const adminService = {
  /**
   * 모든 클럽 목록 조회
   * @returns {Promise} - 클럽 목록
   */
  getClubs() {
    return apiClient.get('/api/admin/clubs');
  },

  /**
   * 모든 클럽 조회
   * @returns {Promise} - 클럽 목록
   */
  getAllClubs() {
    return apiClient.get('/api/admin/clubs');
  },

  /**
   * 특정 클럽 조회
   * @param {Number} id - 클럽 ID
   * @returns {Promise} - 클럽 정보
   */
  getClubById(id) {
    return apiClient.get(`/api/admin/clubs/${id}`);
  },

  /**
   * 새 클럽 생성
   * @param {Object} clubData - 클럽 정보
   * @returns {Promise} - 생성된 클럽 정보
   */
  createClub(clubData) {
    return apiClient.post('/api/admin/clubs', clubData);
  },

  /**
   * 클럽 정보 업데이트
   * @param {Number} id - 클럽 ID
   * @param {Object} clubData - 업데이트할 클럽 정보
   * @returns {Promise} - 업데이트된 클럽 정보
   */
  updateClub(id, clubData) {
    return apiClient.put(`/api/admin/clubs/${id}`, clubData);
  },

  /**
   * 클럽 삭제
   * @param {Number} id - 클럽 ID
   * @returns {Promise} - 삭제 결과
   */
  deleteClub(id) {
    return apiClient.delete(`/api/admin/clubs/${id}`);
  },

  /**
   * 클럽 멤버 조회
   * @param {Number} id - 클럽 ID
   * @returns {Promise} - 클럽 멤버 목록
   */
  getClubMembers(id) {
    return apiClient.get(`/api/admin/clubs/${id}/members`);
  },

  /**
   * 클럽 멤버 추가
   * @param {Number} id - 클럽 ID
   * @param {Object} memberData - 멤버 정보
   * @returns {Promise} - 추가된 멤버 정보
   */
  addClubMember(id, memberData) {
    return apiClient.post(`/api/admin/clubs/${id}/members`, memberData);
  },

  /**
   * 클럽 멤버 정보 업데이트
   * @param {Number} clubId - 클럽 ID
   * @param {Number} memberId - 멤버 ID
   * @param {Object} memberData - 업데이트할 멤버 정보
   * @returns {Promise} - 업데이트된 멤버 정보
   */
  updateClubMember(clubId, memberId, memberData) {
    return apiClient.put(`/api/admin/clubs/${clubId}/members/${memberId}`, memberData);
  },

  /**
   * 클럽 회원 삭제
   * @param {Number} clubId - 클럽 ID
   * @param {Number} memberId - 멤버 ID
   * @returns {Promise} - 삭제 결과
   */
  deleteClubMember(clubId, memberId) {
    return apiClient.delete(`/api/admin/clubs/${clubId}/members/${memberId}`);
  },

  /**
   * 모든 사용자 조회
   * @returns {Promise} - 사용자 목록
   */
  getAllUsers() {
    return apiClient.get('/api/admin/users');
  },

  /**
   * 특정 사용자 조회
   * @param {Number} id - 사용자 ID
   * @returns {Promise} - 사용자 정보
   */
  getUserById(id) {
    return apiClient.get(`/api/admin/users/${id}`);
  },

  /**
   * 사용자 정보 업데이트
   * @param {Number} id - 사용자 ID
   * @param {Object} userData - 업데이트할 사용자 정보
   * @returns {Promise} - 업데이트된 사용자 정보
   */
  updateUser(id, userData) {
    return apiClient.put(`/api/admin/users/${id}`, userData);
  },

  /**
   * 사용자 삭제
   * @param {Number} id - 사용자 ID
   * @returns {Promise} - 삭제 결과
   */
  deleteUser(id) {
    return apiClient.delete(`/api/admin/users/${id}`);
  },

  /**
   * 모든 이벤트 조회
   * @returns {Promise} - 이벤트 목록
   */
  getAllEvents() {
    return apiClient.get('/api/admin/events');
  },

  /**
   * 특정 이벤트 조회
   * @param {Number} id - 이벤트 ID
   * @returns {Promise} - 이벤트 정보
   */
  getEventById(id) {
    return apiClient.get(`/api/admin/events/${id}`);
  },

  /**
   * 새 이벤트 생성
   * @param {Object} eventData - 이벤트 정보
   * @returns {Promise} - 생성된 이벤트 정보
   */
  createEvent(eventData) {
    return apiClient.post('/api/admin/events', eventData);
  },

  /**
   * 이벤트 정보 업데이트
   * @param {Number} id - 이벤트 ID
   * @param {Object} eventData - 업데이트할 이벤트 정보
   * @returns {Promise} - 업데이트된 이벤트 정보
   */
  updateEvent(id, eventData) {
    return apiClient.put(`/api/admin/events/${id}`, eventData);
  },

  /**
   * 이벤트 삭제
   * @param {Number} id - 이벤트 ID
   * @returns {Promise} - 삭제 결과
   */
  deleteEvent(id) {
    return apiClient.delete(`/api/admin/events/${id}`);
  },

  /**
   * 이벤트 참가자 목록 조회
   * @param {Number} eventId - 이벤트 ID
   * @returns {Promise} - 참가자 목록
   */
  getEventParticipants(eventId) {
    return apiClient.get(`/api/admin/events/${eventId}/participants`);
  },

  /**
   * 이벤트 참가자 추가
   * @param {Number} eventId - 이벤트 ID
   * @param {Number} userId - 사용자 ID
   * @returns {Promise} - 추가된 참가자 정보
   */
  addEventParticipant(eventId, userId) {
    return apiClient.post(`/api/admin/events/${eventId}/participants`, { userId });
  },

  /**
   * 이벤트 참가자 상태 업데이트
   * @param {Number} eventId - 이벤트 ID
   * @param {Number} participantId - 참가자 ID
   * @param {String} status - 새로운 상태
   * @returns {Promise} - 업데이트된 참가자 정보
   */
  updateEventParticipantStatus(eventId, participantId, status) {
    return apiClient.put(`/api/admin/events/${eventId}/participants/${participantId}`, { status });
  },

  /**
   * 이벤트 참가자 제거
   * @param {Number} eventId - 이벤트 ID
   * @param {Number} participantId - 참가자 ID
   * @returns {Promise} - 제거 결과
   */
  removeEventParticipant(eventId, participantId) {
    return apiClient.delete(`/api/admin/events/${eventId}/participants/${participantId}`);
  },

  /**
   * 구독 플랜 목록 조회
   * @returns {Promise} - 구독 플랜 목록
   */
  getPlans() {
    return apiClient.get('/api/admin/subscriptions/plans');
  },

  /**
   * 특정 구독 플랜 조회
   * @param {Number} id - 구독 플랜 ID
   * @returns {Promise} - 구독 플랜 정보
   */
  getPlanById(id) {
    return apiClient.get(`/api/admin/subscriptions/plans/${id}`);
  },

  /**
   * 새 구독 플랜 생성
   * @param {Object} planData - 구독 플랜 정보
   * @returns {Promise} - 생성된 구독 플랜 정보
   */
  createPlan(planData) {
    return apiClient.post('/api/admin/subscriptions/plans', planData);
  },

  /**
   * 구독 플랜 정보 업데이트
   * @param {Number} id - 구독 플랜 ID
   * @param {Object} planData - 업데이트할 구독 플랜 정보
   * @returns {Promise} - 업데이트된 구독 플랜 정보
   */
  updatePlan(id, planData) {
    return apiClient.put(`/api/admin/subscriptions/plans/${id}`, planData);
  },

  /**
   * 구독 플랜 삭제
   * @param {Number} id - 구독 플랜 ID
   * @returns {Promise} - 삭제 결과
   */
  deletePlan(id) {
    return apiClient.delete(`/api/admin/subscriptions/plans/${id}`);
  },

  /**
   * 모든 구독 목록 조회
   * @returns {Promise} - 구독 목록
   */
  getSubscriptions() {
    return apiClient.get('/api/admin/subscriptions');
  },

  /**
   * 구독 플랜의 구독 목록 조회
   * @param {Number} planId - 구독 플랜 ID
   * @returns {Promise} - 구독 목록
   */
  getPlanSubscriptions(planId) {
    return apiClient.get(`/api/admin/subscriptions/plans/${planId}/subscriptions`);
  },

  /**
   * 모든 기능 목록 조회
   * @returns {Promise} - 기능 목록
   */
  getFeatures() {
    return apiClient.get('/api/admin/features');
  },

  /**
   * 새 구독 생성
   * @param {Object} subscriptionData - 구독 정보
   * @returns {Promise} - 생성된 구독 정보
   */
  createSubscription(subscriptionData) {
    return apiClient.post('/api/admin/subscriptions', subscriptionData);
  },

  /**
   * 구독 정보 업데이트
   * @param {Number} id - 구독 ID
   * @param {Object} subscriptionData - 업데이트할 구독 정보
   * @returns {Promise} - 업데이트된 구독 정보
   */
  updateSubscription(id, subscriptionData) {
    return apiClient.put(`/api/admin/subscriptions/${id}`, subscriptionData);
  },

  /**
   * 구독 삭제
   * @param {Number} id - 구독 ID
   * @returns {Promise} - 삭제 결과
   */
  deleteSubscription(id) {
    return apiClient.delete(`/api/admin/subscriptions/${id}`);
  },

  /**
   * 대시보드 데이터 조회
   * @returns {Promise} - 대시보드 데이터
   */
  getDashboardData() {
    return apiClient.get('/api/admin/dashboard');
  },

  /**
   * 최근 활동 조회
   * @returns {Promise} - 최근 활동 목록
   */
  getRecentActivities() {
    return apiClient.get('/api/admin/activities/recent');
  },

  /**
   * 활동 로그 목록 조회
   * @param {Number} page - 페이지 번호
   * @param {Number} limit - 페이지당 활동 로그 수
   * @returns {Promise} - 활동 로그 목록
   */
  getActivityLogs(page = 1, limit = 20) {
    return apiClient.get(`/api/admin/activity-logs?page=${page}&limit=${limit}`);
  },

  /**
   * 통계 데이터 조회
   * @returns {Promise} - 통계 데이터
   */
  getStatistics() {
    return apiClient.get('/api/admin/statistics');
  },

  /**
   * 클럽 기능 관리
   * @param {Number} clubId - 클럽 ID
   * @param {Object} features - 클럽 기능 정보
   * @returns {Promise} - 클럽 기능 정보
   */
  manageClubFeatures: async (clubId, features) => {
    try {
      const response = await apiClient.put(`/api/admin/clubs/${clubId}/features`, { features });
      return response.data;
    } catch (error) {
      console.error('클럽 기능 관리 중 오류:', error);
      throw error;
    }
  }
};

export default adminService;
