// 引入Express框架的核心模块，Express是一个基于Node.js的Web应用框架，用于创建服务器端应用和处理HTTP请求等相关操作。
// 它提供了诸多便捷的功能和方法，是构建Web应用后端服务的常用工具，例如定义路由、处理请求与响应等功能都依赖于此模块来实现。
var express = require('express');

// 创建一个Express路由器实例，通过这个实例可以定义一组相关的路由，方便在整个Web应用中进行模块化的路由管理。
// 这种模块化的方式使得代码结构更加清晰，不同功能模块对应的路由可以分别定义在不同的路由器中，便于维护和扩展，
// 比如可以将用户相关路由、商品相关路由等分别放在不同的路由器实例里进行管理。
var router = express.Router();

// 引入Node.js的path模块，主要用于处理文件路径相关的操作，例如拼接、解析文件路径等，在这里用于准确找到其他模块的位置。
// 在Node.js应用中，当需要引入自定义的模块时，可能需要根据项目的目录结构来准确指定模块的路径，path模块就能很好地辅助完成这个任务。
var path = require("path");

// 获取自定义的验证模块，通过path.join方法将当前工作目录（process.cwd()）与相对路径（"/modules/authorization"）拼接起来，以此来准确引入验证模块。
// 这种方式确保了无论应用在何种环境下运行，都能正确定位到指定的验证模块所在位置。这个验证模块通常会承担诸如验证用户权限、合法性等功能，
// 它是保障整个Web应用安全和遵循业务规则的重要环节，只有通过了该模块验证的操作，才能继续往下执行，避免出现非法访问、越权操作等安全问题。
var authorization = require(path.join(process.cwd(), "/modules/authorization"));

// 通过验证模块获取名为"ReportsService"的用户管理服务对象，该服务对象应该封装了与报表相关的各种业务操作方法，比如获取不同类型报表等功能。
// 通过这种方式将报表相关的业务逻辑封装在一个服务对象里，使得代码的职责更加清晰，在路由处理中只需调用该服务对象的相应方法即可，
// 无需在路由代码里大量编写具体的业务实现细节，例如数据库查询等操作都可以在这个服务对象内部完成。
var reportsServ = authorization.getService("ReportsService");

// 定义处理获取特定类型报表的GET请求的路由，路径格式为 "/type/:typeid"，其中":typeid"是一个路由参数，表示报表的类型ID。
// 当客户端向服务器发送GET请求到这个特定路径时，服务器会根据请求中传入的报表类型ID来尝试获取对应的报表数据，
// 例如客户端可能请求获取销售报表（类型ID对应销售报表类型）或者财务报表（对应相应的财务报表类型）等不同类型的报表。
router.get("/type/:typeid",
    // 第一个中间件函数，用于对路由参数进行验证，确保传入的报表类型ID参数是合法有效的。
    // 在Web应用中，对路由参数进行验证是很重要的环节，能够防止因传入非法参数导致后续业务逻辑出现错误，比如数据库查询异常等情况。
    function (req, res, next) {
        // 检查请求参数中的typeid是否存在，如果不存在则返回错误响应，状态码400表示请求参数有误，并附带相应的错误提示信息。
        // 因为报表类型ID是获取对应报表的关键参数，若缺失则无法明确要获取哪种类型的报表，所以必须要求该参数存在。
        if (!req.params.typeid) {
            return res.sendResult(null, 400, "报表类型不能为空");
        }
        // 进一步验证typeid参数是否可以转换为数字类型，如果不能转换成功（即不是有效的数字），则返回错误响应，同样状态码为400，并给出相应错误提示。
        // 通常在业务逻辑里，报表类型ID可能是以数字形式在数据库等存储中进行标识和管理的，所以要求传入的参数能够正确转换为数字，
        // 以此保证后续根据该ID去查询报表数据时不会出现类型不匹配等问题。
        if (isNaN(parseInt(req.params.typeid))) return res.sendResult(null, 400, "报表类型必须是数字");
        // 如果参数验证通过，调用next()将控制权传递给下一个中间件或者路由处理函数，继续后续的业务逻辑处理。
        // 这是Express中间件机制的关键操作，通过next()函数实现请求在多个中间件之间的流转，确保按照顺序依次执行相应的处理逻辑。
        next();
    },
    // 第二个中间件函数，用于处理获取报表的业务逻辑。在前面的参数验证中间件通过后，就会进入这个中间件来执行具体的获取报表操作，
    // 例如从数据库中查询符合指定类型ID的报表数据，然后将数据进行整理并返回给客户端等一系列业务相关的操作都在这里完成。
    function (req, res, next) {
        // 调用reportsServ服务对象的reports方法，传入经过验证的报表类型ID（req.params.typeid），用于获取相应类型的报表数据。
        // reports方法应该是在ReportsService中定义的用于根据传入的报表类型ID去数据存储（如数据库）中查找并获取对应报表记录的方法，
        // 它是一个异步操作，会涉及到数据库连接、查询语句执行等操作，所以需要通过回调函数来处理操作完成后的结果情况。
        reportsServ.reports(req.params.typeid, function (err, result) {
            // 如果在执行获取报表数据的异步操作过程中出现错误（err不为null），例如数据库查询失败、权限不足无法访问报表数据等情况，
            // 则返回包含错误信息的响应，状态码为400表示请求出现错误，同时将具体的错误信息（err）传递给客户端，让客户端知晓请求失败的原因。
            if (err) return res.sendResult(null, 400, err);
            // 如果获取报表数据成功，则返回包含报表数据（result）的响应，状态码为200表示请求成功，并附带提示信息"获取报表成功"，
            // 告知客户端操作已顺利完成，客户端可以根据接收到的报表数据进行相应的展示或者后续处理操作。
            res.sendResult(result, 200, "获取报表成功");
        })(req, res, next);
    }
);

// 将配置好的路由器对象导出，以便在主应用中引入并挂载到对应的路径上，使得这个路由能够正确响应客户端发送的相应HTTP请求，实现获取报表的功能。
// 在主应用中，通过引入这个路由器模块，并将其挂载到对应的路径（这里就是 "/type/:typeid" 对应的路径）上，
// 服务器就能正确识别并处理客户端发送的获取报表的请求，按照路由中定义的逻辑去获取和返回报表数据了。
module.exports = router;
//这段代码主要实现了一个用于获取特定类型报表的路由功能，先是对传入的报表类型 ID 参数进行严格验
//证，确保其合法性，然后基于验证通过的参数调用相应服务方法去获取报表数据，并根据操作结果向客户
//端返回合适的响应信息，整体用于实现后端报表获取的接口服务功能。
