var path = require("path");
// 引入自定义的 DAO 模块，可能包含了对数据库操作的相关函数
daoModule = require("./DAO");
// 引入位于 modules/database 目录下的数据库模块，使用 path.join 拼接当前工作目录和相对路径
databaseModule = require(path.join(process.cwd(), "modules/database"));

/**
 * 获取权限列表
 * 
 * @param  {Function} cb 回调函数，用于处理获取权限列表的结果
 * 当获取权限列表操作完成时调用此函数，若出现错误，第一个参数将包含错误信息，若成功，第一个参数为 null，第二个参数为权限列表结果
 */
module.exports.list = function (cb) {
    // 从数据库模块中获取数据库对象
    db = databaseModule.getDatabase();
    // 定义 SQL 查询语句，使用 LEFT JOIN 连接 sp_permission_api 和 sp_permission 表
    // 筛选出 sp_permission 表的 ps_id 不为空的记录
    sql = "SELECT * FROM sp_permission_api as api LEFT JOIN sp_permission as main ON main.ps_id = api.ps_id WHERE main.ps_id is not null";
    // 执行 SQL 查询操作
    database.driver.execQuery(sql, function (err, result) {
        if (err) return cb("获取权限列表失败", null);
        cb(null, result);
    });
}

/**
 * 权限验证
 * 
 * @param  {[type]}   rid         角色 ID，用于标识用户的角色，可能是数字类型，不同角色拥有不同的权限
 * @param  {[type]}   serviceName 服务名，可能是要访问的服务的名称，例如 API 服务的名称
 * @param  {[type]}   actionName  动作名，可能是对服务的具体操作名称，例如 GET、POST 等操作
 * @param  {Function} cb          回调函数，用于处理权限验证的结果
 * 当权限验证操作完成时调用此函数，若出现错误，第一个参数将包含错误信息，若验证通过，第一个参数为 null，第二个参数为 true；若验证不通过，第一个参数包含相应的错误信息，第二个参数为 false
 */
module.exports.authRight = function (rid, serviceName, actionName, cb) {
    // 超级管理员权限验证，若角色 ID 为 0，则直接认为有权限
    if (rid == 0) return cb(null, true);
    // 权限验证过程
    // 使用 daoModule 的 findOne 方法查找 PermissionAPIModel 类型的对象
    daoModule.findOne("PermissionAPIModel", {"ps_api_service": serviceName, "ps_api_action": actionName}, function (err, permissionAPI) {
        // 打印当前角色 ID、服务名和动作名，方便调试
        console.log("rid => %s,serviceName => %s,actionName => %s", rid, serviceName, actionName);
        // 若出现错误或未找到权限 API 对象，认为无权限
        if (err ||!permissionAPI) return cb("无权限访问", false);
        // 查找 RoleModel 类型的对象，获取角色信息
        daoModule.findOne("RoleModel", {"role_id": rid}, function (err, role) {
            console.log(role);
            // 若出现错误或未找到角色对象，认为获取角色信息失败
            if (err ||!role) return cb("获取角色信息失败", false);
            // 将角色的 ps_ids 以逗号分隔存储在数组中
            ps_ids = role.ps_ids.split(",");
            // 遍历 ps_ids 数组
            for (idx in ps_ids) {
                ps_id = ps_ids[idx];
                // 若权限 API 的 ps_id 与角色的某个 ps_id 相等，认为有权限
                if (parseInt(permissionAPI.ps_id) == parseInt(ps_id)) {
                    return cb(null, true);
                }
            }
            // 若遍历完都不满足条件，认为无权限
            return cb("无权限访问", false);
        });
    });
}