package org.xyzh.system.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.xyzh.api.system.module.ModuleService;
import org.xyzh.common.core.page.PageRequest;
import org.xyzh.common.dto.permission.TbSysPermission;
import org.xyzh.common.dto.system.TbSysModule;
import org.xyzh.common.core.domain.ResultDomain;

/**
 * @description 系统模块控制器
 * @filename ModuleController.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-16
 */
@RestController
@RequestMapping("/system/modules")
@CrossOrigin(origins = "*")
public class ModuleController {

    @Autowired
    private ModuleService moduleService;

    /**
     * @description 查询模块列表
     * @param filter 过滤条件
     * @return ResultDomain<TbSysModule> 模块列表
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/list")
    public ResultDomain<TbSysModule> getModuleList(@RequestBody(required = false) TbSysModule filter) {
        return moduleService.getModuleList(filter);
    }

    /**
     * @description 根据模块ID查询模块信息
     * @param moduleID 模块ID
     * @return ResultDomain<TbSysModule> 模块信息
     * @author yslg
     * @since 2025-10-16
     */
    @GetMapping("/{moduleID}")
    public ResultDomain<TbSysModule> getModuleById(@PathVariable(name = "moduleID") String moduleID) {
        return moduleService.getModuleById(moduleID);
    }

    /**
     * @description 根据模块代码查询模块信息
     * @param code 模块代码
     * @return ResultDomain<TbSysModule> 模块信息
     * @author yslg
     * @since 2025-10-16
     */
    @GetMapping("/code/{code}")
    public ResultDomain<TbSysModule> getModuleByCode(@PathVariable(name = "code") String code) {
        return moduleService.getModuleByCode(code);
    }

    /**
     * @description 查询启用的模块列表
     * @return ResultDomain<TbSysModule> 启用的模块列表
     * @author yslg
     * @since 2025-10-16
     */
    @GetMapping("/active")
    public ResultDomain<TbSysModule> getActiveModules() {
        return moduleService.getActiveModules();
    }

    /**
     * @description 创建模块
     * @param module 模块信息
     * @return ResultDomain<TbSysModule> 创建结果
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/module")
    public ResultDomain<TbSysModule> createModule(@RequestBody TbSysModule module) {
        return moduleService.createModule(module);
    }

    /**
     * @description 更新模块
     * @param module 模块信息
     * @return ResultDomain<TbSysModule> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    @PutMapping("/module")
    public ResultDomain<TbSysModule> updateModule(@RequestBody TbSysModule module) {
        return moduleService.updateModule(module);
    }

    /**
     * @description 删除模块
     * @param moduleID 模块ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-16
     */
    @DeleteMapping("/module")
    public ResultDomain<Boolean> deleteModule(@RequestBody TbSysModule module) {
        return moduleService.deleteModule(module.getModuleID());
    }

    /**
     * @description 更新模块状态
     * @param moduleID 模块ID
     * @param status 状态
     * @return ResultDomain<Boolean> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    @PutMapping("/{moduleID}/status/{status}")
    public ResultDomain<Boolean> updateModuleStatus(@PathVariable(name = "moduleID") String moduleID, @PathVariable(name = "status") Integer status) {
        return moduleService.updateModuleStatus(moduleID, status);
    }

    /**
     * @description 更新模块排序
     * @param moduleID 模块ID
     * @param orderNum 排序号
     * @return ResultDomain<Boolean> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    @PutMapping("/{moduleID}/order/{orderNum}")
    public ResultDomain<Boolean> updateModuleOrder(@PathVariable(name = "moduleID") String moduleID, @PathVariable(name = "orderNum") Integer orderNum) {
        return moduleService.updateModuleOrder(moduleID, orderNum);
    }

    /**
     * @description 分页查询模块列表
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<TbSysModule> 模块列表
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/page")
    public ResultDomain<TbSysModule> getModuleListPage(@RequestBody PageRequest<TbSysModule> pageRequest) {
        return moduleService.getModuleListPage(pageRequest.getFilter(), pageRequest.getPageParam());
    }

    /**
     * @description 统计模块数量
     * @param filter 过滤条件
     * @return ResultDomain<Long> 模块数量
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/count")
    public ResultDomain<Long> countModules(@RequestBody(required = false) TbSysModule filter) {
        return moduleService.countModules(filter);
    }

    /**
     * @description 检查模块代码是否存在
     * @param code 模块代码
     * @param excludeID 排除的模块ID
     * @return ResultDomain<Boolean> 是否存在
     * @author yslg
     * @since 2025-10-16
     */
    @GetMapping("/check-code")
    public ResultDomain<Boolean> checkModuleCodeExists(@RequestParam(name = "code") String code, 
                                                     @RequestParam(required = false, value = "excludeID") String excludeID) {
        return moduleService.checkModuleCodeExists(code, excludeID);
    }

    /**
     * @description 在模块中创建权限
     * @param moduleID 模块ID
     * @param permission 权限信息
     * @return ResultDomain<TbSysPermission> 创建结果
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/{moduleID}/permissions")
    public ResultDomain<TbSysPermission> createPermissionInModule(@PathVariable(name = "moduleID") String moduleID, 
                                                                  @RequestBody TbSysPermission permission) {
        permission.setModuleID(moduleID);
        return moduleService.createPermissionInModule(permission);
    }

    /**
     * @description 更新模块中的权限
     * @param moduleID 模块ID
     * @param permission 权限信息
     * @return ResultDomain<TbSysPermission> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    @PutMapping("/{moduleID}/permissions")
    public ResultDomain<TbSysPermission> updatePermissionInModule(@PathVariable(name = "moduleID") String moduleID, 
                                                                  @RequestBody TbSysPermission permission) {
        permission.setModuleID(moduleID);
        return moduleService.updatePermissionInModule(permission);
    }

    /**
     * @description 删除模块中的权限
     * @param moduleID 模块ID
     * @param permissionID 权限ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-16
     */
    @DeleteMapping("/{moduleID}/permissions/{permissionID}")
    public ResultDomain<Boolean> deletePermissionInModule(@PathVariable(name = "moduleID") String moduleID, 
                                                          @PathVariable(name = "permissionID") String permissionID) {
        return moduleService.deletePermissionInModule(moduleID, permissionID);
    }

    /**
     * @description 获取模块的权限列表
     * @param moduleID 模块ID
     * @return ResultDomain<TbSysPermission> 权限列表
     * @author yslg
     * @since 2025-10-16
     */
    @GetMapping("/{moduleID}/permissions")
    public ResultDomain<TbSysPermission> getModulePermissions(@PathVariable(name = "moduleID") String moduleID) {
        return moduleService.getModulePermissions(moduleID);
    }
}
