package tech.easyflow.ai.easyagentsflow.upload;

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import tech.easyflow.common.web.multipart.MultipartFileMetadataNormalizer;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;

/**
 * 为工作流 Public API 创建文件名和内容类型一致的 Multipart 文件视图。
 */
@Component
public class WorkflowApiMultipartFileNormalizer {

    /**
     * 归一化单个文件 Part，不读取或复制文件内容。
     *
     * @param file 原始文件 Part
     * @return 归一化文件视图；输入为空时返回 {@code null}
     */
    public MultipartFile normalize(MultipartFile file) {
        if (file == null) {
            return null;
        }
        String filename = MultipartFileMetadataNormalizer.sanitizeFilename(
                file.getOriginalFilename());
        String contentType =
                MultipartFileMetadataNormalizer.normalizeContentType(
                        filename,
                        file.getContentType());
        if (Objects.equals(filename, file.getOriginalFilename())
                && Objects.equals(contentType, file.getContentType())) {
            return file;
        }
        return new NormalizedMultipartFile(
                file,
                filename,
                contentType);
    }

    /**
     * 仅覆盖安全元数据并委托文件内容访问的 Multipart 视图。
     */
    private static final class NormalizedMultipartFile
            implements MultipartFile {

        private final MultipartFile delegate;
        private final String originalFilename;
        private final String contentType;

        /**
         * 创建归一化文件视图。
         *
         * @param delegate 原始文件
         * @param originalFilename 安全文件名
         * @param contentType 标准内容类型
         */
        private NormalizedMultipartFile(
                MultipartFile delegate,
                String originalFilename,
                String contentType) {
            this.delegate = delegate;
            this.originalFilename = originalFilename;
            this.contentType = contentType;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getName() {
            return delegate.getName();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getOriginalFilename() {
            return originalFilename;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getContentType() {
            return contentType;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public boolean isEmpty() {
            return delegate.isEmpty();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public long getSize() {
            return delegate.getSize();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public byte[] getBytes() throws IOException {
            return delegate.getBytes();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public InputStream getInputStream() throws IOException {
            return delegate.getInputStream();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void transferTo(File destination)
                throws IOException, IllegalStateException {
            delegate.transferTo(destination);
        }
    }
}
