package com.tencent.qian.webview.model;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.net.URI;

/**
 * 预热目标环境（三端统一）。
 *
 * <p>环境只决定"拉哪个 manifest URL"，下游 hosts / warmupUrl 由 manifest 内容自描述，
 * SDK 不硬编码任何业务 host。{@link PrewarmConfig#getManifestUrl()} 若显式传入则优先级更高。
 */
public enum PrewarmEnvironment {
    /** 线上生产环境。 */
    PROD,
    /** 客户联调 beta 环境。 */
    BETA,
    /** 内部开发 test 环境。 */
    TEST;

    /** 各环境内置 manifest URL 映射。 */
    @NonNull
    public static String manifestUrlOf(@NonNull PrewarmEnvironment env) {
        switch (env) {
            case BETA:
                return "https://res.ess.tencent.cn/cdn/h5-std-beta/warmup-manifest.json";
            case TEST:
                return "https://res.ess.tencent.cn/cdn/h5-std-dev/warmup-manifest.json";
            case PROD:
            default:
                return "https://res.ess.tencent.cn/cdn/h5-std/warmup-manifest.json";
        }
    }

    /** 各环境已知的 {@code quick.*} 入口 host（用于 open() 环境错配检测）。 */
    @NonNull
    public static String knownQuickHostOf(@NonNull PrewarmEnvironment env) {
        switch (env) {
            case BETA:
                return "quick.beta.qian.tencent.cn";
            case TEST:
                return "quick.test.qian.tencent.cn";
            case PROD:
            default:
                return "quick.qian.tencent.com";
        }
    }

    /** 反查某 host 属于哪个已知环境；非 3 个已知 {@code quick.*} host 返回 {@code null}。 */
    @Nullable
    public static PrewarmEnvironment environmentOfHost(@Nullable String host) {
        if (host == null || host.isEmpty()) {
            return null;
        }
        switch (host.toLowerCase()) {
            case "quick.qian.tencent.com":
                return PROD;
            case "quick.beta.qian.tencent.cn":
                return BETA;
            case "quick.test.qian.tencent.cn":
                return TEST;
            default:
                return null;
        }
    }

    /** 反查某完整 URL 属于哪个已知环境。 */
    @Nullable
    public static PrewarmEnvironment environmentOfUrl(@Nullable String url) {
        if (url == null || url.isEmpty()) {
            return null;
        }
        try {
            return environmentOfHost(new URI(url).getHost());
        } catch (Throwable t) {
            return null;
        }
    }
}
