// src/hmrCssFix.ts
// 仅开发环境执行
if (process.env.NODE_ENV === 'development') {
    const getBase = () => {
        const base = (window as any).routerBase || '/';
        return (base as string).endsWith('/') ? base.slice(0, -1) : base;
    };

    const UMI_CSS_RE = /\/umi\.css(\?|#|$)/;

    const createStylesheetLink = (href: string) => {
        const l = document.createElement('link');
        l.rel = 'stylesheet';
        // 加个 cache-bust，避免 HMR/缓存干扰
        l.href = href + (href.indexOf('?') > -1 ? '&' : '?') + '_hmrfix_=' + Date.now();
        l.setAttribute('data-hmrfix', 'stylesheet');
        return l;
    };

    const injectImportStyle = (href: string) => {
        if (document.querySelector('style[data-hmrfix="import"]')) return;
        const s = document.createElement('style');
        s.setAttribute('data-hmrfix', 'import');
        s.appendChild(document.createTextNode(`@import url("${href}");`));
        document.head.appendChild(s);
    };

    const hardFix = () => {
        const base = getBase();
        const href = `${base}/umi.css`;

        // 1) 先把 preload as=style 全部替换成真正的 stylesheet（克隆+替换，避免被后续还原）
        const preloads = Array.from(
            document.querySelectorAll<HTMLLinkElement>('link[rel="preload"][as="style"]'),
        );
        preloads.forEach((pl) => {
            const isUmi = UMI_CSS_RE.test(pl.href);
            // 无论是不是 umi.css，都改；Umi 的其他 chunk css 被 preload 也会导致样式不生效
            const newLink = createStylesheetLink(pl.href);
            pl.replaceWith(newLink);
        });

        // 2) 如果 umi.css 对应的 stylesheet 还不存在，就强插一个
        const hasUmiSheet = Array.from(
            document.querySelectorAll<HTMLLinkElement>('link[rel="stylesheet"]'),
        ).some((l) => UMI_CSS_RE.test(l.href));

        if (!hasUmiSheet) {
            document.head.appendChild(createStylesheetLink(href));
        }

        // 3) 兜底再兜底：若 50ms 后仍然没有 stylesheet，就用 @import 方式强行生效
        setTimeout(() => {
            const stillNoSheet = !Array.from(
                document.querySelectorAll<HTMLLinkElement>('link[rel="stylesheet"]'),
            ).some((l) => UMI_CSS_RE.test(l.href));
            if (stillNoSheet) {
                injectImportStyle(href);
            }
        }, 50);
    };

    const run = () => {
        try {
            hardFix();
        } catch { }
    };

    // 初次与 DOM 就绪
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', run);
    } else {
        run();
    }

    // 监听 <head> 变化（HMR 注入/替换节点时立即修正）
    const mo = new MutationObserver(run);
    mo.observe(document.head, { childList: true, subtree: true });

    // 监听 HMR 状态（apply/idle 后多次修正，压住竞态）
    // @ts-ignore
    if (typeof module !== 'undefined' && module?.hot?.addStatusHandler) {
        // @ts-ignore
        module.hot.addStatusHandler((status: string) => {
            if (status === 'apply' || status === 'idle') {
                setTimeout(run, 0);
                setTimeout(run, 50);
                setTimeout(run, 100);
            }
        });
    }

    // 兜底定时器（极端情况下也能拉回）
    setInterval(run, 300);
}
