package com.gxwebsoft.common.core.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 证书配置属性类
 * 支持开发环境从classpath加载证书，生产环境从Docker挂载卷加载证书
 *
 * @author 科技小王子
 * @since 2024-07-26
 */
@Data
@Component
@ConfigurationProperties(prefix = "certificate")
public class CertificateProperties {

    /**
     * 证书加载模式
     * CLASSPATH: 从classpath加载（开发环境）
     * FILESYSTEM: 从文件系统加载（生产环境）
     * VOLUME: 从Docker挂载卷加载（容器环境）
     */
    private LoadMode loadMode = LoadMode.CLASSPATH;

    /**
     * Docker挂载卷证书根路径
     */
    private String certRootPath = "/www/wwwroot/file.ws";

    /**
     * 开发环境证书路径前缀
     */
    private String devCertPath = "dev";

    /**
     * 微信支付证书配置
     */
    private WechatPayConfig wechatPay = new WechatPayConfig();

    /**
     * 支付宝证书配置
     */
    private AlipayConfig alipay = new AlipayConfig();

    /**
     * 证书加载模式枚举
     */
    public enum LoadMode {
        CLASSPATH,  // 从classpath加载
        FILESYSTEM, // 从文件系统加载
        VOLUME      // 从Docker挂载卷加载
    }

    /**
     * 微信支付证书配置
     */
    @Data
    public static class WechatPayConfig {
        /**
         * 开发环境配置
         */
        private DevConfig dev = new DevConfig();

        /**
         * 生产环境基础路径
         */
        private String prodBasePath = "/";

        /**
         * 微信支付证书目录名
         */
        private String certDir = "wechat";

        @Data
        public static class DevConfig {
            /**
             * APIv3密钥
             */
            private String apiV3Key;

            /**
             * 商户私钥证书文件名
             */
            private String privateKeyFile = "apiclient_key.pem";

            /**
             * 商户证书文件名
             */
            private String apiclientCertFile = "apiclient_cert.pem";

            /**
             * 微信支付平台证书文件名
             */
            private String wechatpayCertFile = "wechatpay_cert.pem";
        }
    }

    /**
     * 支付宝证书配置
     */
    @Data
    public static class AlipayConfig {
        /**
         * 支付宝证书目录名
         */
        private String certDir = "alipay";

        /**
         * 应用私钥文件名
         */
        private String appPrivateKeyFile = "app_private_key.pem";

        /**
         * 应用公钥证书文件名
         */
        private String appCertPublicKeyFile = "appCertPublicKey.crt";

        /**
         * 支付宝公钥证书文件名
         */
        private String alipayCertPublicKeyFile = "alipayCertPublicKey.crt";

        /**
         * 支付宝根证书文件名
         */
        private String alipayRootCertFile = "alipayRootCert.crt";
    }

    /**
     * 获取证书文件的完整路径
     *
     * @param certType 证书类型（wechat/alipay）
     * @param fileName 文件名
     * @return 完整路径
     */
    public String getCertificatePath(String certType, String fileName) {
        switch (loadMode) {
            case CLASSPATH:
                return devCertPath + "/" + certType + "/" + fileName;
            case FILESYSTEM:
                return System.getProperty("user.dir") + "/certs/" + certType + "/" + fileName;
            case VOLUME:
                return certRootPath + "/" + certType + "/" + fileName;
            default:
                throw new IllegalArgumentException("不支持的证书加载模式: " + loadMode);
        }
    }

    /**
     * 获取微信支付证书路径
     *
     * @param fileName 文件名
     * @return 完整路径
     */
    public String getWechatPayCertPath(String fileName) {
        // 生产环境特殊处理：数据库中存储的路径直接拼接到根路径
        if (loadMode == LoadMode.VOLUME) {
            // 生产环境已经没有/file目录，所有路径都直接拼接到根路径
            // 处理数据库中可能存在的历史路径格式
            String cleanFileName = fileName;
            if (fileName.startsWith("/file/")) {
                // 去掉历史的 /file/ 前缀
                cleanFileName = fileName.substring(6);
            } else if (fileName.startsWith("file/")) {
                // 去掉历史的 file/ 前缀
                cleanFileName = fileName.substring(5);
            }
            // 确保路径以 / 开头
            if (!cleanFileName.startsWith("/")) {
                cleanFileName = "/" + cleanFileName;
            }
            return certRootPath + cleanFileName;
        } else {
            // 开发环境和文件系统模式使用原有逻辑
            return getCertificatePath(wechatPay.getCertDir(), fileName);
        }
    }

    /**
     * 获取支付宝证书路径
     *
     * @param fileName 文件名
     * @return 完整路径
     */
    public String getAlipayCertPath(String fileName) {
        return getCertificatePath(alipay.getCertDir(), fileName);
    }

    /**
     * 检查证书加载模式是否为classpath模式
     *
     * @return true if classpath mode
     */
    public boolean isClasspathMode() {
        return LoadMode.CLASSPATH.equals(loadMode);
    }

    /**
     * 检查证书加载模式是否为文件系统模式
     *
     * @return true if filesystem mode
     */
    public boolean isFilesystemMode() {
        return LoadMode.FILESYSTEM.equals(loadMode);
    }

    /**
     * 检查证书加载模式是否为挂载卷模式
     *
     * @return true if volume mode
     */
    public boolean isVolumeMode() {
        return LoadMode.VOLUME.equals(loadMode);
    }
}
