/**
 * 推广邀请管理控制器（客户端接口）
 * 提供客户端调用的推广邀请相关接口
 */

const Framework = require("../../framework/node-core-framework.js");

module.exports = {
  /**
   * @swagger
   * /api/invite/info:
   *   post:
   *     summary: 获取邀请信息
   *     description: 根据设备SN码获取邀请码和邀请链接
   *     tags: [前端-推广邀请]
   *     requestBody:
   *       required: true
   *       content:
   *         application/json:
   *           schema:
   *             type: object
   *             required:
   *               - sn_code
   *             properties:
   *               sn_code:
   *                 type: string
   *                 description: 设备SN码
   *     responses:
   *       200:
   *         description: 获取成功
   */
  'POST /invite/info': async (ctx) => {
    try {
      // 从body中获取sn_code
      const body = ctx.getBody();
      const { sn_code } = body;

      if (!sn_code) {
        return ctx.fail('请提供设备SN码');
      }

      const { pla_account } = await Framework.getModels();

      // 根据sn_code查找用户
      const user = await pla_account.findOne({
        where: { sn_code }
      });

      if (!user) {
        return ctx.fail('用户不存在');
      }

      // 生成邀请码（基于用户ID和sn_code）
      const invite_code = `INV${user.id}_${Date.now().toString(36).toUpperCase()}`;
      const invite_link = `https://work.light120.com/invite?code=${invite_code}`;

      // 保存邀请码到用户记录（可以保存到invite_code字段，如果没有则保存到备注或其他字段）
      // 这里暂时不保存到数据库，每次生成新的

      return ctx.success({
        invite_code,
        invite_link,
        user_id: user.id,
        sn_code: user.sn_code
      });
    } catch (error) {
      console.error('获取邀请信息失败:', error);
      return ctx.fail('获取邀请信息失败: ' + error.message);
    }
  },

  /**
   * @swagger
   * /api/invite/statistics:
   *   post:
   *     summary: 获取邀请统计
   *     description: 根据设备SN码获取邀请统计数据
   *     tags: [前端-推广邀请]
   *     requestBody:
   *       required: true
   *       content:
   *         application/json:
   *           schema:
   *             type: object
   *             required:
   *               - sn_code
   *             properties:
   *               sn_code:
   *                 type: string
   *                 description: 设备SN码
   *     responses:
   *       200:
   *         description: 获取成功
   */
  'POST /invite/statistics': async (ctx) => {
    try {
      // 从body中获取sn_code
      const body = ctx.getBody() || {};
      const { sn_code } = body;

      if (!sn_code) {
        return ctx.fail('请提供设备SN码');
      }

      const { pla_account } = await Framework.getModels();

      // 根据sn_code查找用户
      const user = await pla_account.findOne({
        where: { sn_code }
      });

      if (!user) {
        return ctx.fail('用户不存在');
      }

      // 查询邀请统计
      const { invite_record } = await Framework.getModels();
      
      // 查询总邀请数
      const totalInvites = await invite_record.count({
        where: {
          inviter_id: user.id,
          is_delete: 0
        }
      });

      // 查询已发放奖励的邀请数（活跃邀请）
      const activeInvites = await invite_record.count({
        where: {
          inviter_id: user.id,
          reward_status: 1,
          is_delete: 0
        }
      });

      // 查询总奖励天数
      const rewardRecords = await invite_record.findAll({
        where: {
          inviter_id: user.id,
          reward_status: 1,
          is_delete: 0
        },
        attributes: ['reward_value']
      });

      const totalRewardDays = rewardRecords.reduce((sum, record) => {
        return sum + (record.reward_value || 0);
      }, 0);

      return ctx.success({
        totalInvites: totalInvites || 0
      });
    } catch (error) {
      console.error('获取邀请统计失败:', error);
      return ctx.fail('获取邀请统计失败: ' + error.message);
    }
  },

  /**
   * @swagger
   * /api/invite/generate:
   *   post:
   *     summary: 生成邀请码
   *     description: 为用户生成新的邀请码
   *     tags: [前端-推广邀请]
   *     responses:
   *       200:
   *         description: 生成成功
   */
  'POST /invite/generate': async (ctx) => {
    try {
      // 从body中获取sn_code
      const body = ctx.getBody() || {};
      const { sn_code } = body;

      if (!sn_code) {
        return ctx.fail('请提供设备SN码');
      }

      const { pla_account } = await Framework.getModels();

      // 根据sn_code查找用户
      const user = await pla_account.findOne({
        where: { sn_code }
      });

      if (!user) {
        return ctx.fail('用户不存在');
      }

      // 生成新的邀请码
      const invite_code = `INV${user.id}_${Date.now().toString(36).toUpperCase()}`;
      const invite_link = `https://work.light120.com/invite?code=${invite_code}`;

      return ctx.success({
        invite_code,
        invite_link
      });
    } catch (error) {
      console.error('生成邀请码失败:', error);
      return ctx.fail('生成邀请码失败: ' + error.message);
    }
  },

  /**
   * @swagger
   * /api/invite/records:
   *   post:
   *     summary: 获取邀请记录列表
   *     description: 根据设备SN码获取邀请记录列表
   *     tags: [前端-推广邀请]
   *     requestBody:
   *       required: true
   *       content:
   *         application/json:
   *           schema:
   *             type: object
   *             required:
   *               - sn_code
   *             properties:
   *               sn_code:
   *                 type: string
   *                 description: 设备SN码
   *               page:
   *                 type: integer
   *                 description: 页码（可选，默认1）
   *               pageSize:
   *                 type: integer
   *                 description: 每页数量（可选，默认20）
   *     responses:
   *       200:
   *         description: 获取成功
   */
  'POST /invite/records': async (ctx) => {
    try {
      const body = ctx.getBody() || {};
      const { sn_code, page = 1, pageSize = 20 } = body;

      if (!sn_code) {
        return ctx.fail('请提供设备SN码');
      }

      const { pla_account, invite_record } = await Framework.getModels();

      // 根据sn_code查找用户
      const user = await pla_account.findOne({
        where: { sn_code }
      });

      if (!user) {
        return ctx.fail('用户不存在');
      }

      // 查询邀请记录列表
      const offset = (page - 1) * pageSize;
      const records = await invite_record.findAll({
        where: {
          inviter_id: user.id,
          is_delete: 0
        },
        order: [['register_time', 'DESC']],
        limit: pageSize,
        offset: offset
      });

      const total = await invite_record.count({
        where: {
          inviter_id: user.id,
          is_delete: 0
        }
      });

      // 格式化记录数据
      const formattedRecords = records.map(record => {
        const recordData = record.toJSON();
        return {
          id: recordData.id,
          invitee_phone: recordData.invitee_phone,
          invite_code: recordData.invite_code,
          register_time: recordData.register_time,
          reward_status: recordData.reward_status,
          reward_value: recordData.reward_value,
          reward_type: recordData.reward_type
        };
      });

      return ctx.success({
        list: formattedRecords,
        total: total,
        page: page,
        pageSize: pageSize
      });
    } catch (error) {
      console.error('获取邀请记录列表失败:', error);
      return ctx.fail('获取邀请记录列表失败: ' + error.message);
    }
  }
};

