package com.ruoyi.models.service.impl;

import java.util.List;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.models.mapper.BizModuleMapper;
import com.ruoyi.models.domain.BizModule;
import com.ruoyi.models.service.IBizModuleService;
import com.ruoyi.project.domain.BizProject;
import com.ruoyi.project.service.IBizProjectService;

/**
 * 模块Service业务层处理
 *
 * @author ruoyi
 * @date 2025-08-28
 */
@Service
public class BizModuleServiceImpl implements IBizModuleService {
    @Autowired
    private BizModuleMapper bizModuleMapper;

    @Autowired
    private IBizProjectService projectService;

    /**
     * 查询模块
     *
     * @param moduleId 模块主键
     * @return 模块
     */
    @Override
    public BizModule selectBizModuleByModuleId(Long moduleId) {
        return bizModuleMapper.selectBizModuleByModuleId(moduleId);
    }

    /**
     * 查询模块列表
     *
     * @param bizModule 模块
     * @return 模块
     */
    @Override
    public List<BizModule> selectBizModuleList(BizModule bizModule) {
        Long userId = SecurityUtils.getUserId();
        boolean isAdmin = SecurityUtils.isAdmin(userId);
        
        // 设置查询参数，用于权限控制
        bizModule.getParams().put("currentUserId", userId);
        bizModule.getParams().put("isAdmin", isAdmin);
        
        return bizModuleMapper.selectBizModuleList(bizModule);
    }

    /**
     * 新增模块
     *
     * @param bizModule 模块
     * @return 结果
     */
    @Override
    public int insertBizModule(BizModule bizModule) {
        bizModule.setCreateTime(DateUtils.getNowDate());
        return bizModuleMapper.insertBizModule(bizModule);
    }

    /**
     * 修改模块
     *
     * @param bizModule 模块
     * @return 结果
     */
    @Override
    public int updateBizModule(BizModule bizModule) {
        return bizModuleMapper.updateBizModule(bizModule);
    }

    /**
     * 批量删除模块
     *
     * @param moduleIds 需要删除的模块主键
     * @return 结果
     */
    @Override
    public int deleteBizModuleByModuleIds(Long[] moduleIds) {
        return bizModuleMapper.deleteBizModuleByModuleIds(moduleIds);
    }

    /**
     * 删除模块信息
     *
     * @param moduleId 模块主键
     * @return 结果
     */
    @Override
    public int deleteBizModuleByModuleId(Long moduleId) {
        return bizModuleMapper.deleteBizModuleByModuleId(moduleId);
    }

    /**
     * 根据项目ID查询模块列表
     *
     * @param projectId 项目ID
     * @return 模块列表
     */
    @Override
    public List<BizModule> selectByProjectId(long projectId) {
        return bizModuleMapper.selectByProjectId(projectId);
    }

    /**
     * 指派模块给用户
     * @param bizModule 模块信息
     * @return 结果
     */
    @Override
    public int assignModule(BizModule bizModule) {
        return bizModuleMapper.updateDesignatedUser(bizModule);
    }

    /**
     * 用户接取模块
     * @param moduleId 模块ID
     * @param userId 用户ID
     * @return 结果
     */
    @Override
    public int receiveModule(Long moduleId, Long userId) {
        BizModule module = selectBizModuleByModuleId(moduleId);
        if (module == null || !"0".equals(module.getStatus())) {
            throw new RuntimeException("模块不存在或状态异常");
        }
        
        // 检查是否是指定用户
        if (module.getDesignatedUser() != null && !module.getDesignatedUser().equals(userId)) {
            throw new RuntimeException("您未被指派此模块");
        }
        
        module.setStatus("1"); // 进行中
        // 这里需要设置用户名而不是用户ID，但我们需要查询用户名
        // 暂时设置为用户ID，后续需要优化
        module.setAssignee(String.valueOf(userId));
        module.setAssignTime(DateUtils.getNowDate());
        return updateBizModule(module);
    }

    /**
     * 用户放弃模块
     * @param moduleId 模块ID
     * @param userId 用户ID
     * @return 结果
     */
    @Override
    public int abandonModule(Long moduleId, Long userId) {
        BizModule module = selectBizModuleByModuleId(moduleId);
        if (module == null || !"1".equals(module.getStatus())) {
            throw new RuntimeException("模块不存在或状态异常");
        }
        
        if (!String.valueOf(userId).equals(module.getAssignee())) {
            throw new RuntimeException("您不是此模块的接取人");
        }
        
        module.setStatus("0"); // 待接取
        module.setAssignee(null);
        module.setAssignTime(null);
        return updateBizModule(module);
    }

    /**
     * 查询用户被指派的模块列表
     * @param userId 用户ID
     * @return 模块集合
     */
    @Override
    public List<BizModule> selectAssignedModules(Long userId) {
        return bizModuleMapper.selectAssignedModules(userId);
    }

    /**
     * 用户完成模块
     * @param moduleId 模块ID
     * @param userId 用户ID
     * @return 结果
     */
    @Override
    public int completeModule(Long moduleId, Long userId) {
        BizModule module = selectBizModuleByModuleId(moduleId);
        if (module == null || !"1".equals(module.getStatus())) {
            throw new RuntimeException("模块不存在或状态异常");
        }

        if (!String.valueOf(userId).equals(module.getAssignee())) {
            throw new RuntimeException("您不是此模块的接取人");
        }

        module.setStatus("2"); // 已完成
        module.setFinishTime(DateUtils.getNowDate());
        int result = updateBizModule(module);

        // 检查项目是否完成
        checkProjectCompletion(module.getProjectId());

        return result;
    }

    /**
     * 检查项目是否完成
     * @param projectId 项目ID
     */
    private void checkProjectCompletion(Long projectId) {
        // 查询项目下的所有模块
        List<BizModule> modules = selectByProjectId(projectId);

        boolean allCompleted = modules.stream()
            .allMatch(module -> "2".equals(module.getStatus()));

        if (allCompleted && !modules.isEmpty()) {
            BizProject project = new BizProject();
            project.setProjectId(projectId);
            project.setStatus("1"); // 已完成
            project.setFinishTime(DateUtils.getNowDate());
            projectService.updateBizProject(project);
        }
    }
}
