// 引入Express框架的核心模块，Express是一个基于Node.js的Web应用框架，用于创建服务器端应用和处理HTTP请求等相关操作
var express = require('express');
// 创建一个Express路由器实例，通过这个实例可以定义一组相关的路由，方便在整个Web应用中进行模块化的路由管理
var router = express.Router();
// 引入Node.js的path模块，主要用于处理文件路径相关的操作，例如拼接、解析文件路径等，在这里用于准确找到其他模块的位置
var path = require("path");

// 获取自定义的验证模块，通过path.join方法将当前工作目录（process.cwd()）与相对路径（"/modules/authorization"）拼接起来，以此来准确引入验证模块
// 这个验证模块通常会承担诸如验证用户权限、合法性等功能，确保后续的操作符合相关安全和业务规则
var authorization = require(path.join(process.cwd(), "/modules/authorization"));

// 通过验证模块获取名为"ReportsService"的用户管理服务对象，该服务对象应该封装了与报表相关的各种业务操作方法，比如获取不同类型报表等功能
var reportsServ = authorization.getService("ReportsService");

// 定义处理获取特定类型报表的GET请求的路由，路径格式为 "/type/:typeid"，其中":typeid"是一个路由参数，表示报表的类型ID
router.get("/type/:typeid",
    // 第一个中间件函数，用于对路由参数进行验证，确保传入的报表类型ID参数是合法有效的
    function (req, res, next) {
        // 检查请求参数中的typeid是否存在，如果不存在则返回错误响应，状态码400表示请求参数有误，并附带相应的错误提示信息
        if (!req.params.typeid) {
            return res.sendResult(null, 400, "报表类型不能为空");
        }
        // 进一步验证typeid参数是否可以转换为数字类型，如果不能转换成功（即不是有效的数字），则返回错误响应，同样状态码为400，并给出相应错误提示
        if (isNaN(parseInt(req.params.typeid))) return res.sendResult(null, 400, "报表类型必须是数字");
        // 如果参数验证通过，调用next()将控制权传递给下一个中间件或者路由处理函数，继续后续的业务逻辑处理
        next();
    },
    // 第二个中间件函数，用于处理获取报表的业务逻辑
    function (req, res, next) {
        // 调用reportsServ服务对象的reports方法，传入经过验证的报表类型ID（req.params.typeid），用于获取相应类型的报表数据
        // 处理获取报表数据的异步操作，若出现错误（err不为null），则返回包含错误信息的响应，状态码为400
        // 若获取报表数据成功，则返回包含报表数据（result）的响应，状态码为200，并附带提示信息"获取报表成功"
        reportsServ.reports(req.params.typeid, function (err, result) {
            if (err) return res.sendResult(null, 400, err);
            res.sendResult(result, 200, "获取报表成功");
        })(req, res, next);
    }
);

// 将配置好的路由器对象导出，以便在主应用中引入并挂载到对应的路径上，使得这个路由能够正确响应客户端发送的相应HTTP请求，实现获取报表的功能
module.exports = router;