import { prisma } from '../../models';

const INVITE_REWARD = {
  inviterBonus: 10 * 60,  // 邀请人获得10分钟（600秒）
  inviteeBonus: 10 * 60,  // 被邀请人获得10分钟
};

/**
 * 处理邀请：被邀请人注册时调用
 * @param inviterId 邀请人ID
 * @param inviteeId 被邀请人ID
 * @param shareCode 关联的分享码（可选）
 */
export async function handleInvite(inviterId: number, inviteeId: number, shareCode?: string) {
  // 防止自邀请
  if (inviterId === inviteeId) return;

  // 防止重复被邀请
  const existing = await prisma.inviteRecord.findUnique({
    where: { inviteeId },
  });
  if (existing) return;

  // 创建邀请记录
  await prisma.inviteRecord.create({
    data: {
      inviterId,
      inviteeId,
      shareCode,
      rewarded: false,
    },
  });

  // 发放邀请人奖励
  await grantInviteReward(inviterId, INVITE_REWARD.inviterBonus);

  // 发放被邀请人奖励
  await grantInviteReward(inviteeId, INVITE_REWARD.inviteeBonus);

  // 标记奖励已发放
  await prisma.inviteRecord.updateMany({
    where: { inviteeId },
    data: { rewarded: true },
  });

  console.log(`🎁 邀请奖励发放: ${inviterId} → ${inviteeId}，各得${INVITE_REWARD.inviterBonus}秒`);
}

/**
 * 发放奖励（增加Token余额和costLimit）
 * @param userId 用户ID
 * @param seconds 奖励秒数
 */
async function grantInviteReward(userId: number, seconds: number) {
  // 转换为分钟额度
  const minutes = Math.ceil(seconds / 60);

  // 增加 costLimit（月度费用上限）
  await prisma.user.update({
    where: { id: userId },
    data: {
      costLimit: { increment: minutes * 0.032 }, // 按入门版单价
    },
  });

  // 也增加 Token 余额
  const tokens = minutes * 1000; // 分钟→token换算
  await prisma.tokenBalance.upsert({
    where: { userId },
    create: {
      userId,
      totalTokens: tokens,
      usedTokens: 0,
    },
    update: {
      totalTokens: { increment: tokens },
    },
  });
}

/**
 * 获取用户的邀请统计
 * @param userId 用户ID
 */
export async function getInviteStats(userId: number) {
  const count = await prisma.inviteRecord.count({
    where: { inviterId: userId, rewarded: true },
  });

  return {
    totalInvites: count,
    totalReward: count * INVITE_REWARD.inviterBonus, // 秒
  };
}

export default {
  handleInvite,
  getInviteStats,
};