package com.centreproject.system.service.job.factory;

import com.centreproject.system.service.job.context.TypeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 类型转换器工厂，管理所有类型转换器
 * @author lenovo
 */
@Component
public class TypeConverterFactory {
    private static final Logger log = LoggerFactory.getLogger(TypeConverterFactory.class);

    // 缓存：目标类型 -> 对应的转换器
    private final Map<Class<?>, TypeConverter<?>> converterCache;

    // 构造函数注入所有 TypeConverter 实现类（Spring 自动收集）
    public TypeConverterFactory(List<TypeConverter<?>> converters) {
        this.converterCache = converters.stream()
                .collect(Collectors.toMap(
                        TypeConverter::getTargetType,
                        Function.identity()
                ));
        log.info("类型转换器工厂初始化完成，支持类型：{}",
                converterCache.keySet().stream()
                        .map(Class::getSimpleName)
                        .collect(Collectors.joining(", ")));
    }

    /**
     * 根据目标类型获取转换器
     * @param targetType 目标类型（如 Integer.class）
     * @return 对应的转换器，未找到时返回 String 转换器（默认）
     */
    @SuppressWarnings("unchecked")
    public <T> TypeConverter<T> getConverter(Class<T> targetType) {
        // 1. 优先获取目标类型的转换器
        TypeConverter<T> converter = (TypeConverter<T>) converterCache.get(targetType);
        if (converter != null) {
            return converter;
        }
        // 2. 未找到时，使用 String 转换器（默认类型）
        log.warn("未找到类型[{}]的转换器，使用默认 String 转换器", targetType.getSimpleName());
        return (TypeConverter<T>) converterCache.get(String.class);
    }
}