package com.zt.plat.module.base.service.doctemplate.render;

import com.zt.plat.module.base.service.doctemplate.render.provider.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import jakarta.annotation.Resource;

/**
 * 文档模板数据源提供者工厂（工厂模式）
 *
 * @author hwc
 */
@Component
@Slf4j
public class DocTemplateDataSourceProviderFactory {

    @Resource
    private ApplicationContext applicationContext;

    @Resource
    private ISqlConfigProvider sqlConfigProvider;

    /**
     * 创建数据源提供者
     *
     * @param sourceType   数据源类型
     * @param context      数据源上下文（含义由sourceType决定）
     * @param templateName 模板名称（用于查找业务数据提供者）
     * @param businessType 业务类型（当sourceType=BUSINESS时使用，如"contract"、"order"等）
     * @return 数据源提供者实例
     */
    public IDataSourceProvider createProvider(
            DocTemplateDataSourceType sourceType,
            Object context,
            String templateName,
            String businessType) {

        log.debug("创建数据源提供者，类型: {}, 业务类型: {}", sourceType, businessType);

        switch (sourceType) {
            case DEFAULT:
                return new DocTemplateDefaultFieldDataSourceProvider();

            case BUSINESS:
                return createBusinessDataProvider(businessType);

            case REQUEST:
                // context 应该是 Map<String, Object> 类型的请求数据
                return new DocTemplateRequestFieldDataSourceProvider((java.util.Map<String, Object>) context);

            case SQL_CONFIG:
                // context 应该是 sqlConfigId
                return new DocTemplateSqlConfigFieldDataSourceProvider(sqlConfigProvider, (String) context);

            default:
                throw new IllegalArgumentException("不支持的数据源类型: " + sourceType);
        }
    }

    /**
     * 创建业务数据提供者
     *
     * @param businessType 业务类型
     * @return 数据源提供者
     */
    private IDataSourceProvider createBusinessDataProvider(String businessType) {
        if (businessType == null || businessType.trim().isEmpty()) {
            throw new IllegalArgumentException("使用BUSINESS数据源时，businessType不能为空");
        }

        // 业务数据提供者的Bean名称约定：{businessType}DataProvider
        // 示例：contractDataProvider、orderDataProvider、purchaseOrderDataProvider等
        String providerBeanName = businessType + "DataProvider";

        try {
            IBusinessDataProvider businessDataProvider = applicationContext.getBean(
                    providerBeanName,
                    IBusinessDataProvider.class
            );

            log.debug("找到业务数据提供者: {}", providerBeanName);
            return new DocTemplateBusinessFieldDataSourceProvider(businessDataProvider);

        } catch (NoSuchBeanDefinitionException e) {
            throw new IllegalArgumentException(
                    "未找到业务数据提供者: " + providerBeanName +
                    "（业务类型：" + businessType + "）" +
                    "。请确保实现了 " + IBusinessDataProvider.class.getSimpleName() +
                    " 接口并注册为名为 '" + providerBeanName + "' 的Spring Bean。", e);
        }
    }

    /**
     * 重载方法：不指定businessType时的调用
     * 此时将使用templateName作为businessType（向后兼容）
     *
     * @param sourceType   数据源类型
     * @param context      数据源上下文
     * @param templateName 模板名称
     * @return 数据源提供者实例
     */
    public IDataSourceProvider createProvider(
            DocTemplateDataSourceType sourceType,
            Object context,
            String templateName) {
        return createProvider(sourceType, context, templateName, templateName);
    }
}