package com.nanri.aiimage.modules.file.service.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.nanri.aiimage.config.OssProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.io.File;
import java.net.URI;
import java.net.URL;
import java.util.Date;
import java.util.UUID;

@Service
@RequiredArgsConstructor
public class OssStorageService {

    private final OssProperties ossProperties;

    /**
     * 上传结果文件到 OSS，返回 objectKey（非预签名 URL）。
     * 调用方应存储 objectKey，下载时通过 generateFreshDownloadUrl 按需生成链接。
     */
    public String uploadResultFile(File file, String moduleType) {
        String objectKey = String.format("result/%s/%s/%s", moduleType.toLowerCase(), UUID.randomUUID(), file.getName());
        OSS ossClient = buildClient();
        try {
            ossClient.putObject(ossProperties.getBucket(), objectKey, file);
            return objectKey;
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * 根据 objectKey 生成预签名下载 URL（1小时有效）。
     */
    public String generateDownloadUrl(String objectKey) {
        OSS ossClient = buildClient();
        try {
            Date expiration = new Date(System.currentTimeMillis() + 3600_000L);
            URL url = ossClient.generatePresignedUrl(ossProperties.getBucket(), objectKey, expiration);
            return url.toString();
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * 获取公开（无签名）URL，格式：https://{bucket}.{endpoint}/{objectKey}
     */
    public String getPublicUrl(String objectKey) {
        if (objectKey == null || objectKey.isBlank()) {
            return null;
        }
        return String.format("https://%s.%s/%s", ossProperties.getBucket(), ossProperties.getEndpoint(), objectKey);
    }

    /**
     * 从存储值中解析出 objectKey，兼容两种格式：
     * - 旧格式：完整预签名 URL（https://bucket.endpoint/objectKey?Expires=...）
     * - 新格式：直接是 objectKey（如 result/dedupe/uuid/file.xlsx）
     */
    public String resolveObjectKey(String value) {
        if (value == null || value.isBlank()) {
            return value;
        }
        try {
            if (value.startsWith("http://") || value.startsWith("https://")) {
                String path = URI.create(value).getPath();
                return path.startsWith("/") ? path.substring(1) : path;
            }
        } catch (Exception ignored) {
        }
        return value;
    }

    /**
     * 根据存储值（objectKey 或旧格式预签名 URL）生成新鲜的预签名下载 URL。
     * 供各模块 listHistory 使用，每次按需生成，避免旧 URL 1小时后过期。
     */
    public String generateFreshDownloadUrl(String value) {
        if (value == null || value.isBlank()) {
            return null;
        }
        return generateDownloadUrl(resolveObjectKey(value));
    }

    private OSS buildClient() {
        return new OSSClientBuilder().build(
                "https://" + ossProperties.getEndpoint(),
                ossProperties.getAccessKeyId(),
                ossProperties.getAccessKeySecret()
        );
    }
}
