//package org.qinan.safetyeval.infrastructure.handler;
//
//import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
//import org.apache.ibatis.reflection.MetaObject;
//import org.qinan.safetyeval.domain.adapter.UserInfoAdapter;
//import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.time.LocalDateTime;
//
///**
// * MyBatis Plus 自动填充处理器
// * <p>
// * 在 insert 和 update 操作时自动填充 GBS 标准字段，
// * 优先通过 AuthUserContextAdapter 获取 SSO 真实登录用户信息，
// * 其次通过 UserInfoAdapter（ThreadLocal 方式）获取，最后回退到配置默认值。
// * 使用 strictFill 策略：仅当字段值为 null 时才填充。
// * </p>
// *
// * @author safety-eval
// */
//@Component
//public class MyMetaObjectHandler implements MetaObjectHandler {
//
//    /** 系统环境标识 */
//    private static final String DEFAULT_ENV = "prod";
//
//    @Resource
//    private UserInfoAdapter userInfoAdapter;
//
//    /** 无登录上下文时的回退值（local 联调配置 org-id=1；生产默认 0 不生效） */
//    @Value("${safety-eval.public-api.org-id:0}")
//    private Long fallbackOrgId;
//
//    @Value("${safety-eval.public-api.tenant-id:0}")
//    private Long fallbackTenantId;
//
//    @Value("${safety-eval.public-api.system-user-id:0}")
//    private Long fallbackUserId;
//
//    @Value("${safety-eval.public-api.system-user-name:system}")
//    private String fallbackUserName;
//
//    /**
//     * 解析用户ID：优先 AuthUserContextAdapter（SSO） → UserInfoAdapter（ThreadLocal） → 配置回退
//     */
//    private Long resolveUserId() {
//        Long userId = AuthUserContextAdapter.getCurrentUserId();
//        if (userId != null) {
//            return userId;
//        }
//        userId = userInfoAdapter.getCurrentUserId();
//        if (userId == null && fallbackUserId != null && fallbackUserId > 0) {
//            userId = fallbackUserId;
//        }
//        return userId;
//    }
//
//    /**
//     * 解析用户名：优先 AuthUserContextAdapter（SSO） → UserInfoAdapter（ThreadLocal） → 配置回退
//     */
//    private String resolveUserName() {
//        String userName = AuthUserContextAdapter.getCurrentUserName();
//        if (userName != null) {
//            return userName;
//        }
//        userName = userInfoAdapter.getCurrentUserName();
//        if (userName == null && fallbackUserName != null) {
//            userName = fallbackUserName;
//        }
//        return userName;
//    }
//
//    /**
//     * 解析租户ID：优先 AuthUserContextAdapter（SSO） → UserInfoAdapter（ThreadLocal） → 配置回退
//     */
//    private Long resolveTenantId() {
//        Long tenantId = AuthUserContextAdapter.getCurrentTenantId();
//        if (tenantId != null) {
//            return tenantId;
//        }
//        tenantId = userInfoAdapter.getCurrentTenantId();
//        if (tenantId == null && fallbackTenantId != null && fallbackTenantId > 0) {
//            tenantId = fallbackTenantId;
//        }
//        return tenantId;
//    }
//
//    /**
//     * 解析机构ID：优先 AuthUserContextAdapter（SSO） → UserInfoAdapter（ThreadLocal） → 配置回退
//     */
//    private Long resolveOrgId() {
//        Long orgId = AuthUserContextAdapter.getCurrentOrgId();
//        if (orgId != null) {
//            return orgId;
//        }
//        orgId = userInfoAdapter.getCurrentOrgId();
//        if (orgId == null && fallbackOrgId != null && fallbackOrgId > 0) {
//            orgId = fallbackOrgId;
//        }
//        return orgId;
//    }
//
//    @Override
//    public void insertFill(MetaObject metaObject) {
//        LocalDateTime now = LocalDateTime.now();
//        Long userId = resolveUserId();
//        String userName = resolveUserName();
//        Long tenantId = resolveTenantId();
//        Long orgId = resolveOrgId();
//
//        // 严格填充：仅当字段值为 null 时填充，优先级最低
//        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now);
//        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now);
//        this.strictInsertFill(metaObject, "deleteEnum", String.class, "false");
//        this.strictInsertFill(metaObject, "env", String.class, DEFAULT_ENV);
//        this.strictInsertFill(metaObject, "version", Integer.class, 0);
//
//        // 用户相关字段：仅当解析值不为 null 时才填充
//        if (userId != null) {
//            this.strictInsertFill(metaObject, "createId", Long.class, userId);
//            this.strictInsertFill(metaObject, "updateId", Long.class, userId);
//        }
//        if (userName != null) {
//            this.strictInsertFill(metaObject, "createName", String.class, userName);
//            this.strictInsertFill(metaObject, "updateName", String.class, userName);
//        }
//        if (tenantId != null) {
//            this.strictInsertFill(metaObject, "tenantId", Long.class, tenantId);
//        }
//        if (orgId != null) {
//            this.strictInsertFill(metaObject, "orgId", Long.class, orgId);
//        }
//    }
//
//    @Override
//    public void updateFill(MetaObject metaObject) {
//        LocalDateTime now = LocalDateTime.now();
//        Long userId = resolveUserId();
//        String userName = resolveUserName();
//
//        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now);
//        if (userId != null) {
//            this.strictUpdateFill(metaObject, "updateId", Long.class, userId);
//        }
//        if (userName != null) {
//            this.strictUpdateFill(metaObject, "updateName", String.class, userName);
//        }
//    }
//}
