// 引入Express框架的核心模块，用于创建Web应用和路由等功能
var express = require('express');
// 创建一个Express路由器实例，用于定义一组相关的路由
var router = express.Router();
// 引入Node.js的path模块，用于处理文件路径相关操作
var path = require("path");

// 获取自定义的验证模块，通过拼接当前工作目录和相对路径来指定模块位置
// 这里假设验证模块（authorization）提供了一些权限验证以及获取相关服务的功能
var authorization = require(path.join(process.cwd(), "/modules/authorization"));

// 通过验证模块获取名为"GoodService"的服务对象，用于后续对商品相关操作的调用
// 这个服务对象应该封装了与商品数据交互的各种方法，比如增删改查等
var goodServ = authorization.getService("GoodService");

// 定义处理获取商品列表的GET请求的路由，路径为根路径 "/"
router.get("/",
    // 第一个中间件函数，用于验证请求参数的合法性
    function (req, res, next) {
        // 验证pagenum参数是否存在且大于0，如果不符合要求则返回错误响应，状态码400表示请求参数错误
        if (!req.query.pagenum || req.query.pagenum <= 0) return res.sendResult(null, 400, "pagenum 参数错误");
        // 验证pagesize参数是否存在且大于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
        };

        // 如果请求中包含query参数，则将其也添加到查询条件对象中，可能用于模糊查询等功能
        if (req.query.query) {
            conditions["query"] = req.query.query;
        }

        // 调用goodServ服务对象的getAllGoods方法，传入查询条件对象，用于获取商品列表
        // 处理获取商品列表的异步操作，若出现错误则返回错误信息，成功则返回查询到的商品列表数据
        goodServ.getAllGoods(
            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) {
        // 获取请求体中的参数，假设这些参数包含了创建商品所需的各种信息，如商品名称、价格、描述等
        var params = req.body;
        // 调用goodServ服务对象的createGood方法，传入商品参数，用于创建新商品
        // 处理创建商品的异步操作，若出现错误则返回错误信息，成功则返回创建后的商品信息
        goodServ.createGood(params, function (err, newGood) {
            if (err) return res.sendResult(null, 400, err);
            res.sendResult(newGood, 201, "创建商品成功");
        })(req, res, next);
    }
);

// 定义处理更新商品信息的PUT请求的路由，路径中包含商品ID参数，如 "/:id"
router.put("/:id",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理更新商品信息的具体操作
    function (req, res, next) {
        var params = req.body;
        // 调用goodServ服务对象的updateGood方法，传入商品ID和更新的参数，用于更新指定商品的信息
        // 处理更新商品信息的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        // 这里返回的提示信息文本 "创建商品成功" 可能有误，应该是 "更新商品成功"，后续可根据实际情况修改
        goodServ.updateGood(req.params.id, params, function (err, newGood) {
            if (err) return res.sendResult(null, 400, err);
            res.sendResult(newGood, 200, "创建商品成功");
        })(req, res, next);
    }
);

// 定义处理获取商品详情的GET请求的路由，路径中包含商品ID参数，如 "/:id"
router.get("/:id",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理获取商品详情的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的getGoodById方法，传入商品ID参数，用于获取指定商品的详细信息
        // 处理获取商品详情的异步操作，若出现错误则返回错误信息，成功则返回商品详细信息
        goodServ.getGoodById(req.params.id, function (err, good) {
            if (err) return res.sendResult(null, 400, err);
            return res.sendResult(good, 200, "获取成功");
        })(req, res, next);
    }
);

// 定义处理删除商品的DELETE请求的路由，路径中包含商品ID参数，如 "/:id"
router.delete("/:id",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理删除商品的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的deleteGood方法，传入商品ID参数，用于删除指定商品
        // 处理删除商品的异步操作，若出现错误则返回错误信息，成功则返回相应提示信息
        goodServ.deleteGood(req.params.id, function (err) {
            if (err)
                return res.sendResult(null, 400, "删除失败");
            else
                return res.sendResult(null, 200, "删除成功");
        })(req, res, next);
    }
);

// 定义处理更新商品图片的PUT请求的路由，路径为 "/:id/pics"，其中包含商品ID参数
router.put("/:id/pics",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理更新商品图片的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的updateGoodPics方法，传入商品ID和请求体中的相关参数（可能包含新的图片信息等）
        // 处理更新商品图片的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        goodServ.updateGoodPics(
            req.params.id,
            req.body,
            function (err, good) {
                if (err) return res.sendResult(null, 400, err);
                res.sendResult(good, 200, "更新成功");
            }
        )(req, res, next);
    }
);

// 定义处理更新商品属性的PUT请求的路由，路径为 "/:id/attributes"，包含商品ID参数
router.put("/:id/attributes",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理更新商品属性的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的updateGoodAttributes方法，传入商品ID和请求体中的相关参数（包含要更新的属性信息等）
        // 处理更新商品属性的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        goodServ.updateGoodAttributes(
            req.params.id,
            req.body,
            function (err, good) {
                if (err) return res.sendResult(null, 400, err);
                res.sendResult(good, 200, "更新成功");
            }
        )(req, res, next);
    }
);

// 定义处理更新商品状态的PUT请求的路由，路径为 "/:id/state/:state"，包含商品ID和状态值两个参数
router.put("/:id/state/:state",
    // 参数验证中间件，检查商品ID参数是否存在、是否为数字类型，以及状态值参数是否符合要求
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        if (!req.params.state) {
            return res.sendResult(null, 400, "状态值不能为空");
        }
        if (req.params.state!= 0 && req.params.state!= 1 && req.params.state!= 2) {
            return res.sendResult(null, 400, "状态值只能为 0 ，1 或 2");
        }
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    function (req, res, next) {
        // 调用goodServ服务对象的updateGoodsState方法，传入商品ID和状态值参数，用于更新商品的状态
        // 处理更新商品状态的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        goodServ.updateGoodsState(req.params.id, req.params.state, function (err, good) {
            if (err) return res.sendResult(null, 400, err);
            res.sendResult(good, 200, "更新成功");
        })(req, res, next);
    }
);

// 将配置好的路由器对象导出，以便在主应用模块中使用，挂载到对应的路径上
module.exports = router;