/**
 * 알림 생성 예제 유틸리티
 * 다양한 상황에서 알림을 생성하는 예제 함수들을 제공합니다.
 */

const notificationController = require('../controllers/notificationController');

/**
 * 새 회원 가입 알림 생성
 * @param {Object} clubOwner 클럽 소유자 정보
 * @param {Object} newMember 새로 가입한 회원 정보
 */
exports.newMemberJoinNotification = async (clubOwner, newMember) => {
  await notificationController.createSystemNotification(
    clubOwner.id,
    '새 회원 가입',
    `${newMember.name}님이 클럽에 가입했습니다.`,
    {
      icon: 'pi pi-users',
      type: 'success',
      link: `/club/members/${newMember.id}`
    }
  );
};

/**
 * 모임 생성 알림 생성
 * @param {Array} members 알림을 받을 회원 목록
 * @param {Object} meeting 생성된 모임 정보
 */
exports.newMeetingNotification = async (members, meeting) => {
  for (const member of members) {
    await notificationController.createSystemNotification(
      member.id,
      '새 모임 생성',
      `새로운 모임 "${meeting.title}"이(가) 생성되었습니다. (${meeting.date})`,
      {
        icon: 'pi pi-calendar',
        type: 'info',
        link: `/meetings/${meeting.id}`
      }
    );
  }
};

/**
 * 점수 등록 알림 생성
 * @param {Object} member 점수를 등록한 회원
 * @param {Object} score 등록된 점수 정보
 */
exports.scoreRegisteredNotification = async (member, score) => {
  await notificationController.createSystemNotification(
    member.id,
    '점수 등록 완료',
    `게임 점수 ${score.score}점이 등록되었습니다.`,
    {
      icon: 'pi pi-chart-bar',
      type: 'success',
      link: `/scores/${score.id}`
    }
  );
};

/**
 * 구독 만료 예정 알림 생성
 * @param {Object} clubOwner 클럽 소유자 정보
 * @param {Object} subscription 구독 정보
 * @param {Number} daysLeft 만료까지 남은 일수
 */
exports.subscriptionExpiryNotification = async (clubOwner, subscription, daysLeft) => {
  await notificationController.createSystemNotification(
    clubOwner.id,
    '구독 만료 예정',
    `클럽 구독이 ${daysLeft}일 후에 만료됩니다. 갱신하시려면 결제를 진행해주세요.`,
    {
      icon: 'pi pi-clock',
      type: 'warning',
      link: '/subscription'
    }
  );
};

/**
 * 시스템 유지보수 알림 생성
 * @param {Array} users 알림을 받을 사용자 목록
 * @param {String} maintenanceDate 유지보수 일자
 * @param {String} maintenanceTime 유지보수 시간
 */
exports.systemMaintenanceNotification = async (users, maintenanceDate, maintenanceTime) => {
  for (const user of users) {
    await notificationController.createSystemNotification(
      user.id,
      '시스템 유지보수 안내',
      `${maintenanceDate} ${maintenanceTime}에 시스템 유지보수가 예정되어 있습니다. 서비스 이용에 참고해주세요.`,
      {
        icon: 'pi pi-info-circle',
        type: 'info'
      }
    );
  }
};

/**
 * 결제 완료 알림 생성
 * @param {Object} user 결제한 사용자 정보
 * @param {Object} payment 결제 정보
 */
exports.paymentCompletedNotification = async (user, payment) => {
  await notificationController.createSystemNotification(
    user.id,
    '결제 완료',
    `${payment.amount.toLocaleString()}원 결제가 완료되었습니다.`,
    {
      icon: 'pi pi-credit-card',
      type: 'success',
      link: '/payments/history'
    }
  );
};

/**
 * 대회 일정 알림 생성
 * @param {Array} participants 대회 참가자 목록
 * @param {Object} tournament 대회 정보
 */
exports.tournamentReminderNotification = async (participants, tournament) => {
  for (const participant of participants) {
    await notificationController.createSystemNotification(
      participant.id,
      '대회 일정 안내',
      `내일 "${tournament.title}" 대회가 ${tournament.location}에서 개최됩니다.`,
      {
        icon: 'pi pi-flag',
        type: 'warning',
        link: `/tournaments/${tournament.id}`
      }
    );
  }
};

/**
 * 오류 발생 알림 생성 (관리자용)
 * @param {Array} admins 알림을 받을 관리자 목록
 * @param {String} errorMessage 오류 메시지
 * @param {String} errorLocation 오류 발생 위치
 */
exports.systemErrorNotification = async (admins, errorMessage, errorLocation) => {
  for (const admin of admins) {
    await notificationController.createSystemNotification(
      admin.id,
      '시스템 오류 발생',
      `위치: ${errorLocation}\n오류: ${errorMessage}`,
      {
        icon: 'pi pi-exclamation-triangle',
        type: 'error',
        link: '/admin/logs'
      }
    );
  }
};
