package tech.easyflow.common.filestorage;

import java.util.Objects;

/**
 * 可恢复文件写入完成后返回的不可变结果。
 *
 * <p>URL 继续服务现有读取链路，locator 用于数据库提交失败或进程恢复时精确定位物理对象。</p>
 */
public final class FileStorageWriteResult {

    /** 已写入文件的现有读取 URL。 */
    private final String url;
    /** 可解码为 {@link FileStorageWriteHandle} 的恢复 locator。 */
    private final String locator;

    /**
     * 创建文件存储写入结果。
     *
     * @param url 已写入文件的读取 URL
     * @param locator 恢复 locator
     * @throws IllegalArgumentException URL 或 locator 为空、locator 无法解码时抛出
     */
    public FileStorageWriteResult(String url, String locator) {
        if (url == null || url.isBlank()) {
            throw new IllegalArgumentException("文件写入 URL 不能为空");
        }
        if (locator == null || locator.isBlank()) {
            throw new IllegalArgumentException("文件写入 locator 不能为空");
        }
        FileStorageWriteHandle.decodeLocator(locator);
        this.url = url;
        this.locator = locator;
    }

    /**
     * 获取现有读取链路使用的 URL。
     *
     * @return 文件 URL
     */
    public String getUrl() {
        return url;
    }

    /**
     * 获取精确恢复 locator。
     *
     * @return 文件存储 locator
     */
    public String getLocator() {
        return locator;
    }

    /**
     * 比较 URL 与 locator。
     *
     * @param other 待比较对象
     * @return 两个字段均相同时返回 true
     */
    @Override
    public boolean equals(Object other) {
        if (this == other) {
            return true;
        }
        if (!(other instanceof FileStorageWriteResult result)) {
            return false;
        }
        return url.equals(result.url) && locator.equals(result.locator);
    }

    /**
     * 计算 URL 与 locator 的哈希值。
     *
     * @return 结果哈希值
     */
    @Override
    public int hashCode() {
        return Objects.hash(url, locator);
    }

    /**
     * 返回不展开 locator 内容的写入结果摘要。
     *
     * @return 写入结果摘要
     */
    @Override
    public String toString() {
        return "FileStorageWriteResult{" + "url='" + url + '\'' + ", locatorVersion='efsw1'}";
    }
}
