package com.qqchen.deploy.backend.deploy.integration.impl;

import com.qqchen.deploy.backend.deploy.entity.ExternalSystem;
import com.qqchen.deploy.backend.framework.utils.SensitiveDataEncryptor;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * 外部系统集成基类
 * 提供统一的密码解密功能
 * 
 * @author qqchen
 * @since 2025-11-11
 */
@Slf4j
public abstract class BaseExternalSystemIntegration {

    @Resource
    protected SensitiveDataEncryptor encryptor;

    /**
     * 解密外部系统的敏感数据（密码和Token）
     * 创建一个新对象，不影响原对象
     * 
     * @param system 原始的外部系统对象（包含加密的密码）
     * @return 解密后的外部系统对象
     */
    protected ExternalSystem decryptSystem(ExternalSystem system) {
        if (system == null) {
            return null;
        }

        // 创建新对象，避免修改原对象
        ExternalSystem decrypted = new ExternalSystem();
        
        // 复制所有属性
        decrypted.setId(system.getId());
        decrypted.setName(system.getName());
        decrypted.setType(system.getType());
        decrypted.setUrl(system.getUrl());
        decrypted.setAuthType(system.getAuthType());
        decrypted.setUsername(system.getUsername());
        decrypted.setEnabled(system.getEnabled());
        decrypted.setConfig(system.getConfig());
        decrypted.setRemark(system.getRemark());
        decrypted.setSort(system.getSort());
        
        // 解密密码
        if (StringUtils.isNotBlank(system.getPassword())) {
            try {
                String decryptedPassword = encryptor.decrypt(system.getPassword());
                decrypted.setPassword(decryptedPassword);
                log.debug("外部系统密码已解密: systemId={}, systemName={}", system.getId(), system.getName());
            } catch (Exception e) {
                log.warn("解密密码失败，使用原值: systemId={}, error={}", system.getId(), e.getMessage());
                decrypted.setPassword(system.getPassword());
            }
        }
        
        // 解密Token
        if (StringUtils.isNotBlank(system.getToken())) {
            try {
                String decryptedToken = encryptor.decrypt(system.getToken());
                decrypted.setToken(decryptedToken);
                log.debug("外部系统Token已解密: systemId={}, systemName={}", system.getId(), system.getName());
            } catch (Exception e) {
                log.warn("解密Token失败，使用原值: systemId={}, error={}", system.getId(), e.getMessage());
                decrypted.setToken(system.getToken());
            }
        }
        
        return decrypted;
    }
}
