package com.njcn.rdms.module.project.framework.security.service;

import com.njcn.rdms.framework.security.core.util.SecurityFrameworkUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.Objects;

/**
 * 项目对象业务授权服务：属主（业务负责人）身份命中直接放行，未命中回落对象域权限码兜底。
 *
 * <p>供任务 / 执行的创建、编辑、删除、删除预检等入口在<b>方法体内</b>调用，替代方法上的
 * {@code @CheckObjectPermission} 前置拦截——注解拦截发生在进入方法体之前，无法先认负责人身份。
 *
 * <p>红线：调用本服务做裁决的 service 方法<b>不要再挂 {@code @CheckObjectPermission}</b>，
 * 叠加会把"无权限码的负责人"在注解层直接挡死。口径登记见 CLAUDE.md §鉴权。
 */
@Service
public class ProjectObjectAuthorizationService {

    @Resource
    private ProjectObjectPermissionService projectObjectPermissionService;

    /**
     * 当前登录人是业务负责人时直接放行，否则回落到项目对象角色权限校验。
     */
    public void checkOwnerOrProjectPermission(Long projectId, Long ownerUserId, String permission) {
        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
        if (Objects.equals(loginUserId, ownerUserId)) {
            return;
        }
        projectObjectPermissionService.checkPermission(projectId, permission, false);
    }

    /**
     * 当前登录人命中任一业务负责人时直接放行，否则回落到项目对象角色权限校验。
     */
    public void checkAnyOwnerOrProjectPermission(Long projectId, Collection<Long> ownerUserIds, String permission) {
        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
        if (ownerUserIds != null && ownerUserIds.stream().anyMatch(ownerUserId -> Objects.equals(loginUserId, ownerUserId))) {
            return;
        }
        projectObjectPermissionService.checkPermission(projectId, permission, false);
    }

}
