// 引入Express框架的核心模块，用于创建Web应用以及进行路由相关操作
var express = require('express');
// 创建一个Express路由器实例，方便后续在应用中进行模块化的路由定义与管理
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"));

// 通过验证模块获取名为"OrderService"的服务对象，该服务对象应该封装了与订单相关的各种业务操作方法，例如订单的增删改查等功能
var orderServ = authorization.getService("OrderService");

// 定义处理获取订单列表的GET请求的路由，路径为根路径 "/"
router.get("/",
    // 第一个中间件函数，用于对请求参数进行验证
    function (req, res, next) {
        // 验证pagenum参数是否存在且大于0，如果该参数不存在或者小于等于0，则返回错误响应，状态码400表示请求参数有误
        if (!req.query.pagenum || req.query.pagenum <= 0) return res.sendResult(null, 400, "pagenum 参数错误");
        // 验证pagesize参数是否存在且大于0，如果该参数不存在或者小于等于0，则返回错误响应
        if (!req.query.pagesize || req.query.pagesize <= 0) return res.sendResult(null, 400, "pagesize 参数错误");
        // 参数验证通过后，调用next()将控制权传递给下一个中间件或路由处理函数
        next();
    },
    // 第二个中间件函数，用于处理获取订单列表的业务逻辑
    function (req, res, next) {
        var conditions = {
            // 将请求中的pagenum参数添加到查询条件对象中，该参数常用于分页查询操作，指定要获取的页码
            "pagenum": req.query.pagenum,
            // 将请求中的pagesize参数添加到查询条件对象中，用于指定每页显示的订单数量
            "pagesize": req.query.pagesize
        };

        // 如果请求中包含user_id参数，则将其添加到查询条件对象中，可用于根据用户ID筛选订单
        if (req.query.user_id) {
            conditions["user_id"] = req.query.user_id;
        }
        // 如果请求中包含pay_status参数，则将其添加到查询条件对象中，可能用于根据支付状态筛选订单
        if (req.query.pay_status) {
            conditions["pay_status"] = req.query.pay_status;
        }
        // 如果请求中包含is_send参数，则将其添加到查询条件对象中，也许用于根据订单是否已发送来筛选订单
        if (req.query.is_send) {
            conditions["is_send"] = req.query.is_send;
        }
        // 如果请求中包含order_fapiao_title参数，则将其添加到查询条件对象中，可能是用于根据发票抬头筛选订单之类的业务需求
        if (req.query.order_fapiao_title) {
            conditions["order_fapiao_title"] = req.query.order_fapiao_title;
        }
        // 如果请求中包含order_fapiao_company参数，则将其添加到查询条件对象中，也许是根据发票所属公司来筛选订单
        if (req.query.order_fapiao_company) {
            conditions["order_fapiao_company"] = req.query.order_fapiao_company;
        }
        // 如果请求中包含order_fapiao_content参数，则将其添加到查询条件对象中，可能用于根据发票内容筛选订单
        if (req.query.order_fapiao_content) {
            conditions["order_fapiao_content"] = req.query.order_fapiao_content;
        }
        // 如果请求中包含consignee_addr参数，则将其添加到查询条件对象中，可用于根据收件人地址筛选订单
        if (req.query.consignee_addr) {
            conditions["consignee_addr"] = req.query.consignee_addr;
        }

        // 调用orderServ服务对象的getAllOrders方法，传入构建好的查询条件对象，用于获取符合条件的订单列表
        // 处理获取订单列表的异步操作，若出现错误（err不为null），则返回包含错误信息的响应，状态码为400
        // 若获取成功，则返回包含订单列表数据（result）的响应，状态码为200，并附带提示信息"获取成功"
        orderServ.getAllOrders(
            conditions,
            function (err, result) {
                if (err) return res.sendResult(null, 400, err);
                res.sendResult(result, 200, "获取成功");
            }
        )(req, res, next);
    }
);

// 定义处理添加订单的POST请求的路由，路径为 "/"
router.post("/",
    // 参数验证中间件，当前这里直接调用next()，意味着暂时没有进行额外的参数验证逻辑，可能后续需要补充相关验证代码
    function (req, res, next) {
        next();
    },
    // 业务逻辑中间件，用于处理添加订单的具体操作
    function (req, res, next) {
        // 获取请求体中的参数，这些参数（params）应该包含了创建订单所需的各种信息，例如商品信息、用户信息、收货地址等
        var params = req.body;
        // 调用orderServ服务对象的createOrder方法，传入订单参数，用于创建新的订单
        // 处理创建订单的异步操作，若出现错误（err不为null），则返回包含错误信息的响应，状态码为400
        // 若创建成功，则返回包含新创建订单信息（newOrder）的响应，状态码为201，并附带提示信息"创建订单成功"
        orderServ.createOrder(params, function (err, newOrder) {
            if (err) return res.sendResult(null, 400, err);
            return res.sendResult(newOrder, 201, "创建订单成功");
        })(req, res, next);

    }
);

// 定义处理更新订单的PUT请求的路由，路径中包含订单ID参数，格式为 "/:id"，这里用于更新订单的发送状态（从代码上下文推测）
router.put("/:id",
    // 参数验证中间件，当前这里直接调用next()，暂时没有进行参数验证相关逻辑，也许后续需要添加如验证订单ID合法性等代码
    function (req, res, next) {
        next();
    },
    // 业务逻辑中间件，用于处理更新订单的具体操作
    function (req, res, next) {
        var params = req.body;
        // 调用orderServ服务对象的updateOrder方法，传入订单ID（req.params.id）和更新的参数（params），用于更新指定订单的相关信息
        // 处理更新订单的异步操作，若出现错误（err不为null），则返回包含错误信息的响应，状态码为400
        // 若更新成功，则返回包含更新后订单信息（newOrder）的响应，状态码为201，并附带提示信息"更新订单成功"
        orderServ.updateOrder(req.params.id, params, function (err, newOrder) {
            if (err) return res.sendResult(null, 400, err);
            return res.sendResult(newOrder, 201, "更新订单成功");
        })(req, res, next);
    }
);

// 定义处理获取指定订单详情的GET请求的路由，路径中包含订单ID参数，格式为 "/:id"
router.get("/:id", function (req, res, next) {
    // 调用orderServ服务对象的getOrder方法，传入订单ID（req.params.id），用于获取指定订单的详细信息
    // 处理获取订单详情的异步操作，若出现错误（err不为null），则返回包含错误信息的响应，状态码为400
    // 若获取成功，则返回包含订单详细信息（result）的响应，状态码为200，并附带提示信息"获取成功"
    orderServ.getOrder(req.params.id, function (err, result) {
        if (err) return res.sendResult(null, 400, err);
        return res.sendResult(result, 200, "获取成功");
    })(req, res, next);
});

// 将配置好的路由器对象导出，以便在主应用中引入并挂载到对应的路径上，使这些路由能够响应客户端相应的HTTP请求
module.exports = router;