/**
 * 操作日志集成示例
 * @file operation-log-integration.js
 * @description 展示如何在现有控制器中集成操作日志记录
 */

const { createOperationLogger } = require('../middleware/operationLogger');

// 示例1: 用户管理控制器集成操作日志
const userControllerWithLogs = {
  // 创建用户 - 集成操作日志
  createUser: [
    // 操作日志中间件
    createOperationLogger({
      moduleName: '用户管理',
      tableName: 'users',
      getRecordId: (req, res) => res.body?.data?.id || null,
      getOperationDesc: (req, res) => `创建用户: ${req.body.username}`,
      getOldData: () => null,
      getNewData: (req, res) => res.body?.data || null
    }),
    
    // 原有的创建用户逻辑
    async (req, res) => {
      try {
        // 创建用户逻辑
        const user = await User.create(req.body);
        res.json({
          success: true,
          data: user,
          message: '用户创建成功'
        });
      } catch (error) {
        res.status(500).json({
          success: false,
          message: '用户创建失败',
          error: error.message
        });
      }
    }
  ],

  // 更新用户 - 集成操作日志
  updateUser: [
    createOperationLogger({
      moduleName: '用户管理',
      tableName: 'users',
      getRecordId: (req, res) => req.params.id,
      getOperationDesc: (req, res) => `更新用户: ${req.body.username || req.params.id}`,
      getOldData: async (req, res) => {
        // 获取更新前的数据
        const oldUser = await User.findByPk(req.params.id);
        return oldUser ? oldUser.toJSON() : null;
      },
      getNewData: (req, res) => res.body?.data || req.body
    }),
    
    async (req, res) => {
      try {
        const user = await User.findByPk(req.params.id);
        if (!user) {
          return res.status(404).json({
            success: false,
            message: '用户不存在'
          });
        }

        await user.update(req.body);
        res.json({
          success: true,
          data: user,
          message: '用户更新成功'
        });
      } catch (error) {
        res.status(500).json({
          success: false,
          message: '用户更新失败',
          error: error.message
        });
      }
    }
  ],

  // 删除用户 - 集成操作日志
  deleteUser: [
    createOperationLogger({
      moduleName: '用户管理',
      tableName: 'users',
      getRecordId: (req, res) => req.params.id,
      getOperationDesc: (req, res) => `删除用户: ${req.params.id}`,
      getOldData: async (req, res) => {
        // 获取删除前的数据
        const oldUser = await User.findByPk(req.params.id);
        return oldUser ? oldUser.toJSON() : null;
      },
      getNewData: () => null
    }),
    
    async (req, res) => {
      try {
        const user = await User.findByPk(req.params.id);
        if (!user) {
          return res.status(404).json({
            success: false,
            message: '用户不存在'
          });
        }

        await user.destroy();
        res.json({
          success: true,
          message: '用户删除成功'
        });
      } catch (error) {
        res.status(500).json({
          success: false,
          message: '用户删除失败',
          error: error.message
      });
    }
  ]
};

// 示例2: 农场管理控制器集成操作日志
const farmControllerWithLogs = {
  // 创建农场 - 集成操作日志
  createFarm: [
    createOperationLogger({
      moduleName: '农场管理',
      tableName: 'farms',
      getRecordId: (req, res) => res.body?.data?.id || null,
      getOperationDesc: (req, res) => `创建农场: ${req.body.name}`,
      getOldData: () => null,
      getNewData: (req, res) => res.body?.data || null
    }),
    
    async (req, res) => {
      try {
        const farm = await Farm.create(req.body);
        res.json({
          success: true,
          data: farm,
          message: '农场创建成功'
        });
      } catch (error) {
        res.status(500).json({
          success: false,
          message: '农场创建失败',
          error: error.message
        });
      }
    }
  ]
};

// 示例3: 批量操作日志记录
const batchOperationLogger = createBatchOperationLogger([
  {
    moduleName: '用户管理',
    tableName: 'users',
    getRecordId: (req, res) => req.params.id,
    getOperationDesc: (req, res) => `批量操作用户: ${req.params.id}`,
    getOldData: () => null,
    getNewData: (req, res) => res.body
  },
  {
    moduleName: '权限管理',
    tableName: 'user_roles',
    getRecordId: (req, res) => req.params.id,
    getOperationDesc: (req, res) => `更新用户角色: ${req.params.id}`,
    getOldData: () => null,
    getNewData: (req, res) => req.body.roles
  }
]);

// 示例4: 在Express路由中使用
const express = require('express');
const router = express.Router();

// 用户路由
router.post('/users', 
  createOperationLogger({
    moduleName: '用户管理',
    tableName: 'users',
    getRecordId: (req, res) => res.body?.data?.id || null,
    getOperationDesc: (req, res) => `创建用户: ${req.body.username}`,
    getOldData: () => null,
    getNewData: (req, res) => res.body?.data || null
  }),
  userControllerWithLogs.createUser[1] // 实际的控制器函数
);

router.put('/users/:id',
  createOperationLogger({
    moduleName: '用户管理',
    tableName: 'users',
    getRecordId: (req, res) => req.params.id,
    getOperationDesc: (req, res) => `更新用户: ${req.body.username || req.params.id}`,
    getOldData: async (req, res) => {
      const oldUser = await User.findByPk(req.params.id);
      return oldUser ? oldUser.toJSON() : null;
    },
    getNewData: (req, res) => res.body?.data || req.body
  }),
  userControllerWithLogs.updateUser[1]
);

router.delete('/users/:id',
  createOperationLogger({
    moduleName: '用户管理',
    tableName: 'users',
    getRecordId: (req, res) => req.params.id,
    getOperationDesc: (req, res) => `删除用户: ${req.params.id}`,
    getOldData: async (req, res) => {
      const oldUser = await User.findByPk(req.params.id);
      return oldUser ? oldUser.toJSON() : null;
    },
    getNewData: () => null
  }),
  userControllerWithLogs.deleteUser[1]
);

module.exports = {
  userControllerWithLogs,
  farmControllerWithLogs,
  batchOperationLogger,
  router
};

/**
 * 使用说明:
 * 
 * 1. 在需要记录操作日志的控制器方法前添加 createOperationLogger 中间件
 * 2. 配置中间件参数:
 *    - moduleName: 模块名称（如：用户管理、农场管理）
 *    - tableName: 数据表名（如：users、farms）
 *    - getRecordId: 获取记录ID的函数
 *    - getOperationDesc: 获取操作描述的函数
 *    - getOldData: 获取操作前数据的函数（可选）
 *    - getNewData: 获取操作后数据的函数（可选）
 * 
 * 3. 操作日志会自动记录以下信息:
 *    - 操作用户信息（从req.user获取）
 *    - 操作类型（CREATE/UPDATE/DELETE）
 *    - 操作描述
 *    - 数据变化（操作前后的数据）
 *    - 请求信息（IP、URL、方法等）
 *    - 响应信息（状态码、执行时间等）
 * 
 * 4. 对于批量操作，可以使用 createBatchOperationLogger 记录多个操作
 */
