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.PageParam;
import org.xyzh.common.dto.system.TbSysModule;
import org.xyzh.common.core.domain.ResultDomain;

import java.util.List;

/**
 * @description 系统模块控制器
 * @filename ModuleController.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-16
 */
@RestController
@RequestMapping("/system/module")
@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 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 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("/create")
    public ResultDomain<TbSysModule> createModule(@RequestBody TbSysModule module) {
        return moduleService.createModule(module);
    }

    /**
     * @description 更新模块
     * @param module 模块信息
     * @return ResultDomain<TbSysModule> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    @PutMapping("/update")
    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("/{moduleID}")
    public ResultDomain<Boolean> deleteModule(@PathVariable String moduleID) {
        return moduleService.deleteModule(moduleID);
    }

    /**
     * @description 批量删除模块
     * @param moduleIDs 模块ID列表
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-16
     */
    @DeleteMapping("/batch")
    public ResultDomain<Boolean> batchDeleteModules(@RequestBody List<String> moduleIDs) {
        return moduleService.batchDeleteModules(moduleIDs);
    }

    /**
     * @description 更新模块状态
     * @param moduleID 模块ID
     * @param status 状态
     * @return ResultDomain<Boolean> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    @PutMapping("/{moduleID}/status/{status}")
    public ResultDomain<Boolean> updateModuleStatus(@PathVariable String moduleID, @PathVariable 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 String moduleID, @PathVariable 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(required = false) TbSysModule filter, 
                                                           @RequestParam(defaultValue = "1") int pageNumber,
                                                           @RequestParam(defaultValue = "10") int pageSize) {
        PageParam pageParam = new PageParam(pageNumber, pageSize);
        return moduleService.getModuleListPage(filter, pageParam);
    }

    /**
     * @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 String code, 
                                                     @RequestParam(required = false) String excludeID) {
        return moduleService.checkModuleCodeExists(code, excludeID);
    }

    /**
     * @description 绑定权限到模块
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 绑定结果
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/{moduleID}/bind-permissions")
    public ResultDomain<Boolean> bindPermissionsToModule(@PathVariable String moduleID, 
                                                        @RequestBody List<String> permissionIds) {
        return moduleService.bindPermissionsToModule(moduleID, permissionIds);
    }

    /**
     * @description 解绑模块的权限
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 解绑结果
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/{moduleID}/unbind-permissions")
    public ResultDomain<Boolean> unbindPermissionsFromModule(@PathVariable String moduleID, 
                                                            @RequestBody List<String> permissionIds) {
        return moduleService.unbindPermissionsFromModule(moduleID, permissionIds);
    }

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

    /**
     * @description 批量绑定权限到模块
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 绑定结果
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/{moduleID}/batch-bind-permissions")
    public ResultDomain<Boolean> batchBindPermissionsToModule(@PathVariable String moduleID, 
                                                            @RequestBody List<String> permissionIds) {
        return moduleService.batchBindPermissionsToModule(moduleID, permissionIds);
    }

    /**
     * @description 批量解绑模块的权限
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 解绑结果
     * @author yslg
     * @since 2025-10-16
     */
    @PostMapping("/{moduleID}/batch-unbind-permissions")
    public ResultDomain<Boolean> batchUnbindPermissionsFromModule(@PathVariable String moduleID, 
                                                                 @RequestBody List<String> permissionIds) {
        return moduleService.batchUnbindPermissionsFromModule(moduleID, permissionIds);
    }
}
