'use strict';
const Base = require('../base');

/**
 * 用户统计
 */
module.exports = class StatisticController extends Base {

  get loginValidate() {
    const that = this;
    return {
      user_id: that.ctx.rules.default(that.service.shop.getWebUserId())
        .number(),
    };
  }

  /**
   * 统计
   * @return {Promise<*>}
   */
  async statisticLogs() {
    const that = this;
    const transaction = await that.app.model.transaction();
    try {
      // const dataParse = await that.ctx.postParse();
      const dataParse = await that.ctx.validate(that.loginValidate, await that.ctx.anyParse());
      // 2023/7/25 更新用户行为积分
      const updateBean = await that.app.comoBean.instance({
        intergral: that.app.Sequelize.literal('intergral + ' + 1),
        update_ttime: that.app.szjcomo.date('Y-m-d H:i:s'),
      }, { where: { user_id: dataParse.user_id }, transaction });
      await that.app.comoBean.update(updateBean, that.app.model.Users, '用户积分更新失败,请稍候重试');

      // 2023/7/25 记录用户行为事件
      if (dataParse.type === 1) { // 商品浏览
        // 2023/7/25 查询用户浏览商品记录
        const result = await that.app.model.UsersProductBrowseLogs.findOne({
          where: {
            user_id: dataParse.user_id,
            product_id: dataParse.product_id,
          },
        });
        if (result) {
          // 2023/7/26 update 商品浏览
          const updateBrowse = await that.app.comoBean.instance({
            browse_count: that.app.Sequelize.literal('browse_count + ' + 1),
            product_name: dataParse.product_name,
            browse_params: dataParse.browse_params ? dataParse.browse_params : '{}',
            update_time: that.app.szjcomo.date('Y-m-d H:i:s'),
          }, { where: { user_id: dataParse.user_id, product_id: dataParse.product_id }, transaction });
          await that.app.comoBean.update(updateBrowse, that.app.model.UsersProductBrowseLogs, '商品浏览记录更新失败,请稍候重试');
        } else {
          // 2023/7/26 create 商品浏览
          const createBrowse = await that.app.comoBean.instance({
            user_id: dataParse.user_id,
            product_id: dataParse.product_id,
            browse_count: 1,
            product_name: dataParse.product_name,
            browse_params: dataParse.browse_params ? dataParse.browse_params : '{}',
            update_time: that.app.szjcomo.date('Y-m-d H:i:s'),
            create_time: that.app.szjcomo.date('Y-m-d H:i:s'),
          }, { transaction });
          await that.app.comoBean.create(createBrowse, that.app.model.UsersProductBrowseLogs, '商品浏览记录添加失败,请稍候重试');
        }
      } else if (dataParse.type === 2) { // 动作记录
        // 2023/7/25 查询用户行为记录
        const result = await that.app.model.UsersEventLogs.findOne({
          where: {
            user_id: dataParse.user_id,
            event_name: dataParse.event_name,
          },
        });
        if (result) {
          // 2023/7/26 update 用户行为
          const updateBrowse = await that.app.comoBean.instance({
            event_count: that.app.Sequelize.literal('event_count + ' + 1),
            event_params: dataParse.event_params ? dataParse.event_params : '{}',
            update_time: that.app.szjcomo.date('Y-m-d H:i:s'),
          }, { where: { user_id: dataParse.user_id, event_name: dataParse.event_name }, transaction });
          await that.app.comoBean.update(updateBrowse, that.app.model.UsersEventLogs, '用户行为记录更新失败,请稍候重试');
        } else {
          // 2023/7/26 create 用户行为
          const createBrowse = await that.app.comoBean.instance({
            user_id: dataParse.user_id,
            event_name: dataParse.event_name,
            event_count: 1,
            event_params: dataParse.event_params ? dataParse.event_params : '{}',
            update_time: that.app.szjcomo.date('Y-m-d H:i:s'),
            create_time: that.app.szjcomo.date('Y-m-d H:i:s'),
          }, { transaction });
          await that.app.comoBean.create(createBrowse, that.app.model.UsersEventLogs, '用户行为记录添加失败,请稍候重试');
        }
      }

      // 2023/7/26 事务提交
      transaction.commit();

      return that.ctx.appJson(that.app.szjcomo.appResult('SUCCESS', {}, false));
    } catch (err) {
      console.log(err);
      if (transaction) {
        transaction.rollback();
      }
      // return that.ctx.appJson(that.app.szjcomo.appResult(err.message));
    }
  }

  /**
   * 用户行为统计记录
   * @return {Promise<*>}
   */
  async statisticLogsList() {
    const that = this;
    try {
      const dataParse = await that.ctx.anyParse();
      // 2023/7/26 查询用户统计记录列表
      const resultBrowse = await that.app.model.UsersProductBrowseLogs.findAll({
        order: [[ 'update_time', 'desc' ], [ 'browse_count', 'desc' ]],
        where: { user_id: dataParse.user_id },
      });
      const resultEvent = await that.app.model.UsersEventLogs.findAll({
        order: [[ 'update_time', 'desc' ], [ 'event_count', 'desc' ]],
        where: { user_id: dataParse.user_id },
      });
      return that.ctx.appJson(that.app.szjcomo.appResult('SUCCESS', { resultBrowse, resultEvent }, false));
    } catch (err) {
      console.log(err);
      return that.ctx.appJson(that.app.szjcomo.appResult(err.message));
    }
  }

  /**
   *  活跃用户列表
   * @return {Promise<*>}
   */
  async activeUsers() {
    const that = this;
    // const transaction = await that.app.model.transaction();
    const seq = that.app.Sequelize;
    try {
      // const dataParse = await that.ctx.validate(that.loginValidate, await that.ctx.anyParse());
      // const dataParse = await that.ctx.anyParse();
      const currentDateTime = that.app.szjcomo.date('Y-m-d H:i:s');
      const endTimeStamp = Date.parse(currentDateTime) - 15 * 24 * 60 * 60 * 1000;
      const endDateTime = that.app.szjcomo.date('Y-m-d H:i:s', endTimeStamp / 1000);
      // 2023/7/26 查询
      const users = await that.app.model.Users.findAll({
        // attributes: [ 'user_id', 'nickname', 'intergral', 'money', 'commission', 'headimgurl' ],
        order: [[ 'update_ttime', 'desc' ], [ 'intergral', 'desc' ]],
        where: { intergral: { [seq.Op.gte]: 1 }, is_employee: false, update_ttime: { [seq.Op.gte]: endDateTime } },
      });
      return that.ctx.appJson(that.app.szjcomo.appResult('SUCCESS', { users }, false));
    } catch (err) {
      console.log(err);
      return that.ctx.appJson(that.app.szjcomo.appResult(err.message));
    }
  }

  /**
   *  我邀请的活跃用户列表
   * @return {Promise<*>}
   */
  async myActiveUsers() {
    const that = this;
    // const transaction = await that.app.model.transaction();
    const seq = that.app.Sequelize;
    try {
      const dataParse = await that.ctx.validate(that.loginValidate, await that.ctx.anyParse());
      const currentDateTime = that.app.szjcomo.date('Y-m-d H:i:s');
      const endTimeStamp = Date.parse(currentDateTime) - 30 * 24 * 60 * 60 * 1000;
      const endDateTime = that.app.szjcomo.date('Y-m-d H:i:s', endTimeStamp / 1000);
      const selectBean = await that.app.comoBean.instance({}, {
        where: { inviter_id: dataParse.user_id },
        create_time: { [seq.Op.gte]: endDateTime },
      });
      const myUsers = await that.service.base.select(selectBean, that.app.model.RelUserInviter, '查询邀请关联用户失败,请稍候重试', false, true);

      const userIds = [];
      for (const user of myUsers) {
        userIds.push(user.user_id);
      }
      const users = await that.app.model.Users.findAll({
        where: {
          user_id: { [seq.Op.in]: userIds },
          intergral: { [seq.Op.gte]: 1 },
        },
        order: [[ 'update_ttime', 'desc' ], [ 'intergral', 'desc' ]],
      });
      return that.ctx.appJson(that.app.szjcomo.appResult('SUCCESS', { users }, false));
    } catch (err) {
      console.log(err);
      return that.ctx.appJson(that.app.szjcomo.appResult(err.message));
    }
  }

};